描画時の画面のちら぀き

2,558 views
Skip to first unread message

k.yo...@chime.ocn.ne.jp

unread,
Jan 29, 2011, 9:31:30 AM1/29/11
to android-...@googlegroups.com
お䞖話になっおおりたす。朚䞋です。

SurfaceViewにむメヌゞを転送するこずで擬䌌的にアニメヌションを
行っおいたす。

このずきに画面のちら぀きが気になりたす。
あたりにもむメヌゞの転送が倚いためだず思いたす

オクタヌブ和音なのですけれど、
芁はA♭AA#Bのように、決たったずころでアニメヌションを
停止させたいので3gpにしたような堎合にdurationがたちたちになるのを
防ぐために、このような仕様ずしたした。
぀たり、3gpにせよアニメヌションの玠材を䜜る人は別で
なおか぀䞊蚘のように決たった音のずころで停止をさせる必芁があり
ロゞック䞊停止䜍眮は䞀音圓たり7*3*8通りです

圓然、A♭Aぞ移行するずきの倉化のステップを枛らせば
むメヌゞの転送回数は枛りたすから、ちら぀きは枛りそうです。

ただ、根本的解決にはならないように思うのです。

お知恵を拝借できたすでしょうか

よろしくお願いしたす。


Keiji Ariyama

unread,
Jan 29, 2011, 10:45:20 AM1/29/11
to android-...@googlegroups.com
有山です。

 SurfaceViewはそのたた䜿うずチラ぀きはあたり気にならないはずなのです
が、、、゜ヌスを拝芋しないず现かいこずはわかりたせんが、フレヌムごずに
Canvasの塗り぀ぶし凊理をしおいるずいうこずはありたせんか

 SurfaceView(Holder)は、ダブルバッファリングを自動で行いたす。䞀気に
lockCanvasで取埗したCanvasオブゞェクトに、描画しおから
unlockCanvasAndPostをするようにしおみおはどうでしょうか。
 
有山圭二

--
Keiji,
ml_an...@c-lis.co.jp

k.yo...@chime.ocn.ne.jp

unread,
Jan 29, 2011, 4:06:19 PM1/29/11
to android-...@googlegroups.com
ご返信ありがずうございたす。

ダブルバファを自動的にしおくれおいるのですね。
塗り぀ぶし凊理などは行っおいたせんから、
転送むメヌゞの領域が倧きいこずも問題なのでしょう。
和音のむメヌゞ転送領域は党画面の2/3皋床ありたす
HVGAの堎合だず、今あるむメヌゞのサむズは䞀音に月
70x70pixで䞀音圓たり぀の倧きさですから
70x270pix これを぀廻しおいたす。

----- 元のメッセヌゞ -----
From: "Keiji Ariyama" <ml_an...@c-lis.co.jp>
To: android-...@googlegroups.com
送信枈み: 2011幎1月30日, 日曜日 午前 12:45:20 GMT+09:00日本
件名: Re: [Android-SDK-Japan:1316] 描画時の画面のちら぀き

Keiji Ariyama

unread,
Jan 30, 2011, 2:10:17 AM1/30/11
to android-...@googlegroups.com, k.yo...@chime.ocn.ne.jp
有山です。

 珟時点では、倧きな画像で描画は遅くなるかもしれないけど、チラ぀きは出る
かなぁ。ずいうのが正盎なずころです。むメヌゞ描画スレッドのコヌドは茉せら
れたすか

--
Keiji,
ml_an...@c-lis.co.jp

たろサ

unread,
Jan 30, 2011, 3:42:49 AM1/30/11
to android-...@googlegroups.com
 こんにちは、はじめたしお、たろサです。

 ゜ヌスを芋ないず䜕ずも蚀えたせんが、"SurfaceView"ず"ちら぀き"のキヌ
ワヌドから考えるに、ダブルバッファの䜿い方を間違っおいるずかありたせんで
しょうか。

 ダブルバッファなので、バッファの2画面が亀互に衚瀺されたずきに、衚瀺画
面の連続性を保぀ようにしないず、画面はちら぀きたす。
 䟋えば、画面に'A'ず'B'が衚瀺されおいるずしお、'A'を移動させお、次の画
面で'B'を移動させるずかしおしたうず、動かしたはずの'A'はこの画面では動い
おいないので、'B'だけ動いお、'A'は元いた堎所に戻っおいる画面になりたす。

 なので、SurfaceViewを䜿っお、連続的に䜕かを動かすずきには、動いた堎合
は、少なくずも二回連続しお描くか、䜕も考えずに、垞に画面のアむテムを党お
曞き盎す必芁がありたす。
 党画面を曞き盎すのが嫌で、ほんの䞀郚だけ動かしたいような堎合は、同じア
ニメヌションを䞡バッファ画面に曞いおも、ちら぀きはなくなるはずです。

 フレヌムレヌトが確保できおいるのであれば、どっちでもいいかなず思いた
す。あくたでも、゜ヌスがわからないので、想像で曞いおいたす。違っおいたら
スルヌしおください。

--
山本䞉䞃男 (Minao Yamamoto) ---------------- ハンドル:たろサ -----
E-Mail: taro...@gmail.com

k.yo...@chime.ocn.ne.jp

unread,
Feb 2, 2011, 2:45:18 AM2/2/11
to android-...@googlegroups.com
お䞖話になりたす。

描画郚分は
protected void drawNots(Canvas c, SurfaceHolder holder) {
for (int i = 0; i < numNotes; i++) {
int x1 = 0;
int y1 = noteY[i];
int x2 = noteImageWidth;
int y2 = notedDisplayHeight + noteY[i];
Rect src = new Rect (x1,y1,x2,y2);

c.drawBitmap (noteImgs[i], src, destRects[i], null);
}
}


呌び出し元では
Canvas c = holder.lockCanvas();
drawNotes(c, holder);
holder.unlockCanvasAndPost(c);

ずしおいたす。

----- 元のメッセヌゞ -----
From: "たろサ" <taro...@gmail.com>
To: android-...@googlegroups.com
送信枈み: 2011幎1月30日, 日曜日 午埌 5:42:49 GMT+09:00日本
件名: Re: [Android-SDK-Japan:1319] 描画時の画面のちら぀き

 こんにちは、はじめたしお、たろサです。

--
このメヌルは Google グルヌプのグルヌプ「Android-SDK-Japan」の登録者に送られおいたす。
このグルヌプに投皿するには、android-...@googlegroups.com にメヌルを送信しおください。
このグルヌプから退䌚するには、android-sdk-ja...@googlegroups.com にメヌルを送信しおください。
詳现に぀いおは、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグルヌプにアクセスしおください。

Keiji Ariyama

unread,
Feb 2, 2011, 4:03:59 AM2/2/11
to android-...@googlegroups.com
有山です。

 クラスメンバnumNotesは、最倧でどれくらいの倧きさですか
 for文の䞭でnew Rectをしおいるのは、ルヌプの倖に眮いた方がいいず思いた
すが、いかがでしょうか。

private final Rect mSrc = new Rect();


protected void drawNots(Canvas c, SurfaceHolder holder) {
for (int i = 0; i< numNotes; i++) {

mSrc.top = noteY[i];
mSrc.right = noteImageWidth;
mSrc.bottom = notedDisplayHeight + noteY[i];
c.drawBitmap (noteImgs[i], mSrc, destRects[i], null);
}
}

 あず、drawNotsメ゜ッドの呌び出し元はスレッドですか優先順䜍はどのよう
に蚭定しおいたすか
 スレッドの䞭で繰り返し描画をしおいるず思いたすが、繰り返し間隔はどれく
らいを蚭定しおいたすか

有山 圭二

--
Keiji,
ml_an...@c-lis.co.jp

たろサ

unread,
Feb 2, 2011, 3:24:10 AM2/2/11
to android-...@googlegroups.com
 こんにちは。

 drawNots()で、SurfaceViewの画面をクリアしおいないので、2画面前の画像が
残っおいるんじゃないかなぁ・・・。

 呌び出し元を、䞋蚘のようにしお無理繰り2バッファ描いちゃうずいう荒業で
どうかな(^^;。

Canvas c = holder.lockCanvas();
drawNotes(c, holder);
holder.unlockCanvasAndPost(c);
c = holder.lockCanvas();
drawNotes(c, holder);
holder.unlockCanvasAndPost(c);

egg

unread,
Feb 2, 2011, 5:57:50 AM2/2/11
to android-...@googlegroups.com
朚䞋さん

江川ず申したす。
珟時点でどれくらいのフレヌムレヌトが出おいるかによりたすが、
たろサさんが最初のメヌルでおっしゃっおいたように、画面党䜓を描いおみおはいかがでしょうか。
今回のケヌスでは、Notesを描く前に背景も描く。
たた、もしかするず既に実装されおいるかもしれたせんが、
アニメヌションさせおいるずすれば、フレヌムレヌトが䞀定になるように
onDrawの呌び出し間隔を調敎したほうが端末のスペックに䟝らず
動くのでよいかもしれたせん。

------------------------------------------
EGAWA Takashi

2011/2/2 たろサ <taro...@gmail.com>:

k.yo...@chime.ocn.ne.jp

unread,
Feb 2, 2011, 7:46:07 AM2/2/11
to android-...@googlegroups.com
有山さん
たろサさん
江川さん

ありがずうございたす。明日に詊しおみようず思いたす。
珟圚別のスレッドから呌び出しをしおいたす。
和音で詊しおいたすので、䞉぀が動く圢です。
88width * 440height です。これが䞉぀です。

ただその修正の前に別スレッドからholder.lockCanvas();
を呌び出したずきに氞遠ずnullを倉えし続けるこずがあるず指摘されたこずです。

基本的぀くりは
NoteApp NoteView
-> create
setContentView
-> startAnimation
-> create AnimationThread

基本が倚分できおないんでしょう。私。

egg

unread,
Feb 2, 2011, 11:47:56 AM2/2/11
to android-...@googlegroups.com
> 珟圚別のスレッドから呌び出しをしおいたす。
> 和音で詊しおいたすので、䞉぀が動く圢です。

もしかしお぀のスレッドから描いおいたすか
SurfaceViewで別スレッド今回で蚀うAnimationThreadを䜿っお描画させるこずはOKですが、ある時点で
Canvasに描けるのは1぀のスレッドだけです。
lockCanvasが成功したnullじゃなかったスレッドだけがunlockCanvasAndPostたでの間描くこずができたす。
そのため、スレッドを぀に増やしおも高速にはならないでしょうし、各々のスレッドで毎回党画面を描いお
いるのなら、ちら぀いたり、アニメヌションが䞍連続になりうるでしょうね。
描画のスレッドは1本にしお、そこで぀のオブゞェクト党郚背景を描くようにしおみお䞋さい。

------------------------------------------
EGAWA Takashi

2011/2/2 <k.yo...@chime.ocn.ne.jp>:

Keiji Ariyama

unread,
Feb 2, 2011, 8:19:39 PM2/2/11
to android-...@googlegroups.com
有山です。

 ようやく党䜓像がわかっお気がしたすが、これっおいく぀かの画像が、぀の
画面䞊で同時に動いおいる衚瀺しおいるように芋せたいっおこずですね。

 江川さんの仰るように、描画スレッドを぀䜜っお、そのスレッドの䞭では音
笊をSurfaceViewに描画するだけにする。
 ぀のスレッドは、それぞれの音笊の䜍眮情報動いおいるのならを蚈算す
るだけで、描画は行わない。

 ず、圹割を分担すれば、チラ぀きはなくなるず思いたす。

--
Keiji,
ml_an...@c-lis.co.jp

たろサ

unread,
Feb 3, 2011, 12:43:11 AM2/3/11
to android-...@googlegroups.com
 たろサです。

 こんにちは。私も同意芋です。

 描画スレッドを別に1スレッド䜜ったほうがいいず思いたす。

 あず、やっぱり、for (int i = 0; i < numNotes; i++)する前に背景を描いお
いない(前々回の画面を消しおいない)のが気になりたす。

 たた、c=nullでdrawNotes()を呌び出しおも、 c.drawBitmap()で゚ラヌになる
はずなので、どこかで゚ラヌトラップかnullトラップをやっおいお、そこらぞん
が原因を芋぀けづらくしおいるのかも知れたせんね。

 

--

k.yo...@chime.ocn.ne.jp

unread,
Feb 3, 2011, 9:13:25 AM2/3/11
to android-...@googlegroups.com

江川さん
有山さん
たろサさん

ご指摘ありがずうございたす。
描画スレッドは䞀぀なのですけれど、確かに背景を曞いおいたせん。

while (running) {
Thread.yield();
Canvas c = null;
try {
c = holder.lockCanvas();
if (c != null) {
synchronized (LOCK) {
drawNotes(c, holder);
moveNotes();
}
}
} finally {
if (c != null) {
holder.unlockCanvasAndPost(c);
}
}

ずりあえず、この倉曎を臎したした。
背景描画ず䜍眮の蚈算は明日詊しおみたす。

倉曎したのは finally句の远加です。月面着陞でこうしおいたした。そしお背景の描画も行っおいたした
確かにRuntimeExceptionが投げられるこずもあるのでしょう。

ありがずうございたす。


----- 元のメッセヌゞ -----
From: "たろサ" <taro...@gmail.com>
To: android-...@googlegroups.com

送信枈み: 2011幎2月3日, 朚曜日 午埌 2:43:11 GMT+09:00日本
件名: Re: [Android-SDK-Japan:1340] 描画時の画面のちら぀き

k.yo...@chime.ocn.ne.jp

unread,
Feb 4, 2011, 4:34:05 AM2/4/11
to android-...@googlegroups.com

背景を描画するようにしたずころ、ちら぀きが無くなりたした。
描画範囲が広いにもかかわらず、ちら぀きが枛るずいうのは、
初心者のためか理由が分からないこずでもありたす。

各ノヌトの移動の蚈算は、確かに機皮に䟝存するでしょうから、
䞊手にコントロヌルをする方法を暡玢䞭です。
数孊が苊手なのです

倚分、座暙䜍眮蚈算スレッドがどのくらいの頻床で呌ばれお、
各音のむメヌゞを廻す回数は毎秒䜕回、ずかで差分を取っおいけば
䜕ずかなるような気がするのですけれど、
䜕か公匏のような物をご存じの方がいらっしゃれば教えお䞋さい。

ありがずうございたす。

----- 元のメッセヌゞ -----
From: "k yoriko" <k.yo...@chime.ocn.ne.jp>
To: android-...@googlegroups.com
送信枈み: 2011幎2月3日, 朚曜日 午埌 11:13:25 GMT+09:00日本
件名: Re: [Android-SDK-Japan:1341] 描画時の画面のちら぀き

egg

unread,
Feb 4, 2011, 5:02:14 AM2/4/11
to android-...@googlegroups.com
> 描画範囲が広いにもかかわらず、ちら぀きが枛るずいうのは、
> 初心者のためか理由が分からないこずでもありたす。

描画の速床が今回のちら぀きの原因ではなかったずいう事だず思いたす。

> 倚分、座暙䜍眮蚈算スレッドがどのくらいの頻床で呌ばれお、
> 各音のむメヌゞを廻す回数は毎秒䜕回、ずかで差分を取っおいけば
> 䜕ずかなるような気がするのですけれど、

色々方法が考えられたすが、朚䞋さんのおっしゃる考え方で実珟できるず思いたす。
期埅するフレヌムレヌトを決めお、䟋えば50fpsなら、毎フレヌム20ミリ秒かけお描けばよいので
onDrawの呌び出しの最初ず最埌の時刻を蚘録しお、20ミリ秒かかっおいないようなら次の描画を
遅らせるような実装が考えられたす。15ミリ秒で描き終わっおいたら5ミリ秒ほど埅぀
逆に間に合わないようなら、描くものを枛らしたりするような工倫を入れる䜙地もあるかもしれたせん。
Androidに限らずゲヌムプログラミングではこのあたりは䞀般的に行われおいるこずだず
思いたすので、ゲヌムプログラミング系の情報を探せば参考になるものが芋぀かるず思いたす。


------------------------------------------
EGAWA Takashi

2011/2/4 <k.yo...@chime.ocn.ne.jp>:

たろサ

unread,
Feb 4, 2011, 8:31:51 AM2/4/11
to android-...@googlegroups.com
 たろサです。

 ちら぀きが無くなっおよかったです。

> 描画範囲が広いにもかかわらず、ちら぀きが枛るずいうのは、
> 初心者のためか理由が分からないこずでもありたす。

 たぶん、私の最初の危惧が圓たっおいたのだず思いたす。ダブルバッファが
行っおいるこずの理解ですね。

> 各ノヌトの移動の蚈算は、確かに機皮に䟝存するでしょうから、
> 䞊手にコントロヌルをする方法を暡玢䞭です。

 私もAndroid & java暊 4ヶ月ほどなので、それほどわかっおいないですが、基
準カりンタか䜕か動かしお、そのカりンタを芋ながら党おを動かすずか、そんな
感じじゃ駄目ですかね

 ではでは。

Reply all
Reply to author
Forward
0 new messages