1: 2015-08-22 (土) 14:58:16 njf[5] [6] [7] | 現: 2015-09-26 (土) 02:53:47 njf[5] [8] [9] | ||
---|---|---|---|
Line 2: | Line 2: | ||
ドローコールについて詳しく書けるほどGPUなどに知識があるわけではないので、簡単に概要のみ説明します。詳しいことはその手の資料にあたってください。 | ドローコールについて詳しく書けるほどGPUなどに知識があるわけではないので、簡単に概要のみ説明します。詳しいことはその手の資料にあたってください。 | ||
- | StarlingではGPUを使って描画を行うわけですが、その時GPUに描画の為の情報や画像データをCPUから送ることになります。この処理は一般に遅いと言われています。遅くなる理由については詳しいことは知らないですが、たとえばGPUとCPUは違うプロセッサなのでそれらは違う速度で動いており、データをやり取りするためには同期をとる必要があり、遅延が生じるという話などは聞いたことがあります。 | + | StarlingではGPUを使って描画を行うわけですが、その時GPUに描画の為の情報や画像データをCPUから送ることになります。この処理は一般に遅いと言われています。遅くなる理由については、たとえばGPUとCPUは違うプロセッサなのでそれらは違う速度で動いており、データをやり取りするためには同期をとる必要があり、遅延が生じるという話などがあるようです。 |
詳細はともかくとして、重要なのは一般にドローコールを減らすことが出来れば処理が速くなるという事です。 | 詳細はともかくとして、重要なのは一般にドローコールを減らすことが出来れば処理が速くなるという事です。 | ||
Line 13: | Line 13: | ||
ここではそのような場合にドローコールを減らす方法を解説します。 | ここではそのような場合にドローコールを減らす方法を解説します。 | ||
- | |||
- | |||
*ドローコールを調べる [#g47e7829] | *ドローコールを調べる [#g47e7829] | ||
Line 38: | Line 36: | ||
*実際にドローコールを減らす [#m4f91c46] | *実際にドローコールを減らす [#m4f91c46] | ||
+ | ドローコールの削減にはいろいろな方法があると思いますが、NJFがやってみて一定の効果があったものを以下に紹介します。 | ||
+ | |||
**Texture Atlasを使う [#rc4c3037] | **Texture Atlasを使う [#rc4c3037] | ||
- | 同じビットマップに存在する画像はドローコールを増やさないので、細かな画像はなるべくTexture Atlasにまとめて使うようにしましょう。経験的には2048x2048pixel以下のTexture一枚にまとめられるとモバイルでも最近の端末なら比較的無理がない気がします。もちろん少なければ少ない方が良いです。 | + | 同じビットマップに存在する画像はドローコールを増やさないので、細かな画像はなるべくTexture Atlasにまとめて使うようにしましょう。とはいえ画像が大きすぎるとモバイルではアプリが不安定になります。経験的には2048x2048pixel以下のTexture一枚にまとめられるとモバイルでも最近の端末なら比較的無理がない気がします。しかし古い端末ではつらいかも知れません。もちろん少なければ少ない方が良いです。 |
**Textureの重ね順に注意する [#vc0dee12] | **Textureの重ね順に注意する [#vc0dee12] | ||
- | 画像が多くてTexture Atlasが複数になった場合、重ね順に注意する必要があります。つまり、2つのTexture Atlasの画像を交互に四枚かさねると、ドローコールは4になりますが、同じTexture Atlasの画像を二枚ずつ重ねて4枚だとドローコールは2となります。なるべく描画深度が続けて同じTexture Atlasになるようにするとドローコールは減ります。 | + | 画像が多くてTexture Atlasが複数になった場合、重ね順に注意する必要があります。つまり、2つのTexture Atlasの画像を交互に四枚かさねると、ドローコールは4になりますが、同じTexture Atlasの画像を二枚ずつ二組重ねて4枚だとドローコールは2となります。なるべく同じTexture Atlasが続けて描画されるよう深度を調整するとドローコールは減ります。 |
**通常のフォントによるText表示は使わない [#j2888282] | **通常のフォントによるText表示は使わない [#j2888282] | ||
Line 51: | Line 52: | ||
**Quadは使わない [#d73be747] | **Quadは使わない [#d73be747] | ||
簡単に四角形の画像を作れるので便利なQuadですが、使うとドローコールが増えます。Texture Atlasにカラーチップを用意してそれをImageで描画し、拡大縮小するほうが良いでしょう。 | 簡単に四角形の画像を作れるので便利なQuadですが、使うとドローコールが増えます。Texture Atlasにカラーチップを用意してそれをImageで描画し、拡大縮小するほうが良いでしょう。 | ||
+ | |||
+ | **フィルターを使わない [#b474f97d] | ||
+ | フィルターを使うとドローコールが増えます。またフィルター処理自体も重いので速度が必要な場面では使わずにフィルターをかけた後の画像を用意して差し替えた方が良いでしょう。複数の描画オブジェクトにフィルターをかける場合は、個別にかけるよりまとめてかけた方が動作は速くなります。 | ||
**colorで色を変更しない [#p409cea2] | **colorで色を変更しない [#p409cea2] | ||
簡単にImageの色を変えられるcolorプロパティはゲームなどで敵にやられたときのエフェクトなどでつい使いたくなりますが、ドローコールが増えます。画像容量に余裕があるならTextuer Atlasに変更した色の画像を別に用意して重ねた方が良いでしょう。 | 簡単にImageの色を変えられるcolorプロパティはゲームなどで敵にやられたときのエフェクトなどでつい使いたくなりますが、ドローコールが増えます。画像容量に余裕があるならTextuer Atlasに変更した色の画像を別に用意して重ねた方が良いでしょう。 | ||
+ | |||
+ | **アルファを使わない [#w1cf68f3] | ||
+ | アルファブレンディングもドローコールが増えます。はじめから半透明の画像を用意したり、フェイドアウトは他のアニメーションで代用するなどの工夫をしましょう。 | ||
**表示されていない描画オブジェクトはvisibleをfalseに [#m17cb493] | **表示されていない描画オブジェクトはvisibleをfalseに [#m17cb493] | ||
- | たとえばモバイルゲームなどに良くあるような、大量のアイコンをスクロールさせるようなUIの場合、表示されていない部分の描画についてもドローコールが増えているときがあります。表示されていない描画オブジェクトのvisibleをfalseにすると一気にドローコールを減らせる場合があります。 | + | たとえばモバイルゲームなどに良くあるような、大量のアイコンをスクロールさせるようなUIの場合、表示されていない部分のアイコンの描画についてもドローコールが増えているときがあります。表示されていない描画オブジェクトのvisibleをfalseにすると一気にドローコールを減らせる場合があります。 |
+ | |||
+ | **子オブジェクトが更新されないSpriteはflattenする。 [#zccdc2c2] | ||
+ | Spriteのflattenメソッドを使うと、そのSpriteの描画が最適化されるので、その子オブジェクトがドローコールが増える原因であればドローコールも減ります。 | ||
+ | sprite.flatten(); | ||
+ | しかし、flattenを呼び出すと子オブジェクトが更新されても見た目が変わらないので、変えるときにはunflattenする必要があります。 | ||
+ | |||
+ | *あまりこだわりすぎない [#l95ab8ef] | ||
+ | ドローコールの削減は、うまくやるとどんどん減らせるのでつい長時間かけてしまいがちですが、実際には最近の端末の性能が上がってることもあって、少し減らした程度ではあまり速くならないことも多いです。一瞬1や2ドローコールが増えても体感では気づかないことも多いです。また実際処理が重くなっているのは他の原因である事も少なくありません。 | ||
+ | あまりこだわりすぎずに他のパフォーマンス評価もしながら適度に時間をかけていきましょう。 |
(This host) = https://njf.jp