高速スプライト表示マジックのタネ

個別のスプライトを大きなテクスチャ1枚にまとめて、そこからテクスチャを貼り付ける
ことにすることで高速化できる。

なぜ速いか?

  • Cocos2DxやUnityではアトラスと呼ばれていて今では普通にみんなやってるテク
  • OpenGLでもDirectXでも、画面にスプライトを表示するには「描画コマンド」というものを発行する
  • 1.テクスチャをバインドせよ(いまからこのテクスチャを使うよ)
  • 2.ポリゴンを描画せよ1
  • 3.テクスチャをバインドせよ(いまから新しいテクスチャを使うよ)
  • 4.ポリゴンを描画せよ2
  • 5.テクスチャをバインドせよ(いまから新しいテクスチャを使うよ)
  • 6.ポリゴンを描画せよ3
  • この時のテクスチャのバインドに非常に時間がかかる
  • つまり、テクスチャを複数に分けた場合、テクスチャのバインド、ポリゴン描画を繰り返すので、描画コストは6となる
  • 1.テクスチャをバインドせよ(いまからこのテクスチャを使うよ)
  • 2.ポリゴンを描画せよ1
  • 3.ポリゴンを描画せよ2
  • 4.ポリゴンを描画せよ3
  • しかし、テクスチャ1枚に各スプライトが収まっていた場合、描画コストは4にすることができる
  • ここでは2しか描画コストは変わらないが、たとえば以下の様な場合を考えてみる

背景の描画

  • 320x320の画面に16x16の背景スプライトを敷き詰めるとする
  • 20x20個の背景スプライトを描く必要がある
    この場合、毎回異なるテクスチャから読み込んできた場合,2x20x20=800のコストとなるが
    同一テクスチャの場合1 + 20x20 = 401となり、約半分のコストにまで下げることができる

気をつけねばならないこと

  • ただ、大きなテクスチャをバインドするときには小さいテクスチャをバインドするよりも時間がかかる
    最悪の場合、2倍のテクスチャサイズだった場合2倍かかることもありうる(ハードウェアにもよるっぽい)
    その場合は、同じコストとなってしまうが、いろいろやってみた結果、1枚にまとめたほうが圧倒的に処理速度が早かった
  • OpenGLのほうがバインドの時間が短いが、ハード(ビデオカード)によるコストのかかり方に幅がある [#f793cda2]
  • DirectXの方は等しくOpenGLより遅いが、ハードウェアによって極端な違いはなかった [#lc2a8232]
  • 動的に変化するテクスチャとかを毎フレームバインドするような処理をするときはOpenGLのほうが都合がよかった [#ub19f862]
  • ポリゴン描画についてはビデオチップがDirectXに最適化されている側面が強いらしく、全体的な処理速度としてはDirectXの方が速かった [#c480cde5]
  • PCにより正しく表示できたり出来なかったりといった機種依存の問題はOpenGLでは度々見られた [#i861200c]