高速スプライト表示のタネ

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

なぜ早いか

  • 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枚にまとめたほうが圧倒的に処理速度が早かった

アトラス化

  • Cocos2DxやUnityではアトラスと呼ばれていて普通にみんなやってた