Back to page

− Links

 Print 

Starlingでのドローコールの削減 :: NJF Wiki

xpwiki:Starlingでのドローコールの削減

Table of contents
  • ドローコールとは
  • ドローコールを調べる
  • 他の原因に注意
  • 実際にドローコールを減らす
    • Texture Atlasを使う
    • Textureの重ね順に注意する
    • 通常のフォントによるText表示は使わない
    • ビットマップフォントを使用してかつ他のTexture Atlasと統合する
    • Quadは使わない
    • フィルターを使わない
    • colorで色を変更しない
    • アルファを使わない
    • 表示されていない描画オブジェクトはvisibleをfalseに
    • 子オブジェクトが更新されないSpriteはflattenする。
  • あまりこだわりすぎない

ドローコールとは anchor.png[1] Edit [2]

ドローコールについて詳しく書けるほどGPUなどに知識があるわけではないので、簡単に概要のみ説明します。詳しいことはその手の資料にあたってください。

StarlingではGPUを使って描画を行うわけですが、その時GPUに描画の為の情報や画像データをCPUから送ることになります。この処理は一般に遅いと言われています。遅くなる理由については、たとえばGPUとCPUは違うプロセッサなのでそれらは違う速度で動いており、データをやり取りするためには同期をとる必要があり、遅延が生じるという話などがあるようです。

詳細はともかくとして、重要なのは一般にドローコールを減らすことが出来れば処理が速くなるという事です。

こちらの資料http://ics-web.jp/lab-data/140425_starling_optim/[3]によると、古い端末でも問題なく動かせるようにするにはドローコール10以下が望ましいそうですが、かなり難しいです。個人的にはここ2~3年の端末ならゲーム画面で20~30程度のドローコールでもそれほど問題ない印象です。

また、ドローコールを減らすために余分の処理を行ったりすると逆に遅くなる場合もありますし、ゲーム画面以外、たとえばインベントリ画面などでは少々ドローコールが多くて処理が遅くなっても気にならない場合もあります。

よってあまりこだわりすぎずに描画速度が要求される場面や極端にドローコールが増えている部分について減らす努力をするのが現実的です。

ここではそのような場合にドローコールを減らす方法を解説します。

Page Top

ドローコールを調べる anchor.png[4] Edit [5]

まずドローコールを減らすには現在のゲームのドローコールがどれくらいか知る必要があります。 「Starlingでパフォーマンス情報の表示[6]」で解説したように、

mStarling.showStats = true;

とすると、ドローコールやメモリの情報が表示できます。Adobe Scoutなども詳細な情報を得るときには便利ですが、まずはこちらの方が手軽です。

次にどの描画オブジェクトがドローコールを増やしているか確認する必要があります。最も簡単な方法は、疑わしい描画オブジェクトのvisibleをfalseにする事です。するとStarlingはそのオブジェクトの描画をスキップするので、それで大幅にドローコールが減った場合はその描画オブジェクトが原因と言うことが分かります。

Page Top

他の原因に注意 anchor.png[7] Edit [8]

ドローコールの削減をする前に、本当に遅くなっているのがドローコールのせいかどうか確認しておきましょう。

Flashを昔から使っていると、動作が遅くなる原因で最初に疑うのが描画関係になってしまうので、ドローコールに目が行きがちですが、GPUの処理はかなり高速のため実際にはそれ以外が原因の場合も多いです。 良くあるのはメモリリークでガベージコレクションが走ってしまっていることや、SharedObjectEdit[9]に頻繁に書き込みすぎている場合、計算などで重い処理をしていたり、描画オブジェクトやアニメーションが多い場合などです。 他にはFlash Professionalを使いモバイルデバイス上でデバッグ実行をしているとかなり遅くなります。 また、starlingのデバッグオプションを使っていても遅くなります。 速度の調査を行う場合は、かならずリリース用のパブリッシュを行ってインストールしましょう。

Page Top

実際にドローコールを減らす anchor.png[10] Edit [11]

ドローコールの削減にはいろいろな方法があると思いますが、NJFがやってみて一定の効果があったものを以下に紹介します。

Page Top

Texture Atlasを使う anchor.png[12] Edit [13]

同じビットマップに存在する画像はドローコールを増やさないので、細かな画像はなるべくTexture Atlasにまとめて使うようにしましょう。とはいえ画像が大きすぎるとモバイルではアプリが不安定になります。経験的には2048x2048pixel以下のTexture一枚にまとめられるとモバイルでも最近の端末なら比較的無理がない気がします。しかし古い端末ではつらいかも知れません。もちろん少なければ少ない方が良いです。

Page Top

Textureの重ね順に注意する anchor.png[14] Edit [15]

画像が多くてTexture Atlasが複数になった場合、重ね順に注意する必要があります。つまり、2つのTexture Atlasの画像を交互に四枚かさねると、ドローコールは4になりますが、同じTexture Atlasの画像を二枚ずつ二組重ねて4枚だとドローコールは2となります。なるべく同じTexture Atlasが続けて描画されるよう深度を調整するとドローコールは減ります。

Page Top

通常のフォントによるText表示は使わない anchor.png[16] Edit [17]

StarlingのTextfieldで通常のフォントを使って描画するとドローコールが増えます。ゲーム画面ではなるべく文字も画像にするか、後述のようにビットマップフォントを使いましょう。

Page Top

ビットマップフォントを使用してかつ他のTexture Atlasと統合する anchor.png[18] Edit [19]

ビットマップフォントを使い、かつ他のTexture Atlasと統合するとドローコールが減らせます。具体的には「Starlingでビットマップフォントを使う[20]」で解説しています。

Page Top

Quadは使わない anchor.png[21] Edit [22]

簡単に四角形の画像を作れるので便利なQuadですが、使うとドローコールが増えます。Texture Atlasにカラーチップを用意してそれをImageで描画し、拡大縮小するほうが良いでしょう。

Page Top

フィルターを使わない anchor.png[23] Edit [24]

フィルターを使うとドローコールが増えます。またフィルター処理自体も重いので速度が必要な場面では使わずにフィルターをかけた後の画像を用意して差し替えた方が良いでしょう。複数の描画オブジェクトにフィルターをかける場合は、個別にかけるよりまとめてかけた方が動作は速くなります。

Page Top

colorで色を変更しない anchor.png[25] Edit [26]

簡単にImageの色を変えられるcolorプロパティはゲームなどで敵にやられたときのエフェクトなどでつい使いたくなりますが、ドローコールが増えます。画像容量に余裕があるならTextuer Atlasに変更した色の画像を別に用意して重ねた方が良いでしょう。

Page Top

アルファを使わない anchor.png[27] Edit [28]

アルファブレンディングもドローコールが増えます。はじめから半透明の画像を用意したり、フェイドアウトは他のアニメーションで代用するなどの工夫をしましょう。

Page Top

表示されていない描画オブジェクトはvisibleをfalseに anchor.png[29] Edit [30]

たとえばモバイルゲームなどに良くあるような、大量のアイコンをスクロールさせるようなUIの場合、表示されていない部分のアイコンの描画についてもドローコールが増えているときがあります。表示されていない描画オブジェクトのvisibleをfalseにすると一気にドローコールを減らせる場合があります。

Page Top

子オブジェクトが更新されないSpriteはflattenする。 anchor.png[31] Edit [32]

Spriteのflattenメソッドを使うと、そのSpriteの描画が最適化されるので、その子オブジェクトがドローコールが増える原因であればドローコールも減ります。

sprite.flatten();

しかし、flattenを呼び出すと子オブジェクトが更新されても見た目が変わらないので、変えるときにはunflattenする必要があります。

Page Top

あまりこだわりすぎない anchor.png[33] Edit [34]

ドローコールの削減は、うまくやるとどんどん減らせるのでつい長時間かけてしまいがちですが、実際には最近の端末の性能が上がってることもあって、少し減らした程度ではあまり速くならないことも多いです。一瞬1や2ドローコールが増えても体感では気づかないことも多いです。また実際処理が重くなっているのは他の原因である事も少なくありません。 あまりこだわりすぎずに他のパフォーマンス評価もしながら適度に時間をかけていきましょう。


Last-modified: 2015-09-25 (Fri) 18:53:47 (JST) (1987d) by njf