ページへ戻る

− Links

 印刷 

Starlingでのドローコールの削減 のバックアップソース(No.3) :: NJF Wiki

xpwiki:Starlingでのドローコールの削減 のバックアップソース(No.3)

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

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

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

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

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

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

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

*ドローコールを調べる [#g47e7829]

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

 mStarling.showStats = true;

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

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

*他の原因に注意 [#pd207e71]

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

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

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

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

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

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

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

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

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

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

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

**表示されていない描画オブジェクトはvisibleをfalseに [#m17cb493]

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

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


« Prev[5]  Next »[6]