08 « 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.» 10

DreamPresent

日記やゲームネタ・プログラムネタ・・・etc 自己満足ブログ~

スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Posted on --/--/-- --. --:-- [edit]

category: スポンサー広告

TB: --    CM: --

--

spriteBatchでの描画 

処理の最適化というより、
何をやれば処理負荷が酷くなるかをちょっと実験してみた。
ベースはひにけにXNAでも公開されているGamefestJapan2008でのDemoXboxを使用。
Xbox360上での3000個の星を描画するサンプルで試してみました。

まぁ普段からゲームプログラムやっている人にとっては、
『そんなことすれば処理重くなって当然!』
ですが、知らない人に少しでも参考になれば。

①spriteBatch.Begin(),spriteBatch.End()の呼び出し回数を増やしてみた
本来サンプルでは
  spriteBatch.Begin();
  for ( int i = 0; i < particleCount; ++i )
  {
    Draw()
  }
  spriteBatch.End();

というのを、

  for ( int i = 0; i < particleCount; ++i )
  {
    spriteBatch.Begin();
    Draw()
    spriteBatch.End();
  }

とやってみたところ、FPSを60維持できるのに、
サンプルのままでは約8600個の星を処理することができますが、
Begin(),End()を何度も呼ぶ場合はたったの300個が限界でしたw
なのでBegin(),End()は極力回数を少なくした方が良さそうです。


②テクスチャの切り替え
次はDraw時のテクスチャの切り替えです。DirectXでもそうですが、一般的にテクスチャはまとめて切り替え回数を少なくした方が描画が速いと言われています。では、xnaではどうなんでしょう。

サンプルでは、
  for ( int i = 0; i < particleCount; ++i )
  {
    spriteBatch.Draw(texture, particles[i].Position, null,
               particles[i].Color, particles[i].Rotation, origin,
               particles[i].Scale, SpriteEffects.None, 0.5f);
  }

となっていましたが、textureを配列にし、同じサイズの別のテクスチャを読み込み、

  for ( int i = 0; i < particleCount; ++i )
  {
    spriteBatch.Draw(texture[i%2], particles[i].Position, null,
               particles[i].Color, particles[i].Rotation, origin,
               particles[i].Scale, SpriteEffects.None, 0.5f);
  }

と毎回テクスチャを切り替えるようにしてみたところ、
FPS60を維持できるのは約990個が限界でした。

これをテクスチャを1つにまとめ、nullになっているsouceRectangleにテクスチャ座標をしていした場合を試してみた。つまり↓

  for ( int i = 0; i < particleCount; ++i )
  {
    spriteBatch.Draw(texture, particles[i].Position, rect[i%2],
               particles[i].Color, particles[i].Rotation, origin,
               particles[i].Scale, SpriteEffects.None, 0.5f);
  }

この場合FPS60を維持するには約7800個が限界でした。
テクスチャ座標を指定するのとしないのでは約1000個ほどの差が発生しています。

ということでまとめ
①Begin(),End()の呼び出し回数を減らす
②テクスチャはできるだめまとめる
③テクスチャ座標を指定しない場合の描画はsouceRectangleをnullにする

まぁこれくらい注意すればそこそこの2Dゲーはできるのではないでしょうか?
スポンサーサイト

Posted on 2009/02/01 Sun. 23:01 [edit]

category: 自作ゲー日記

TB: 0    CM: 0

01

コメント

Comment
list

コメントの投稿

Secret

Comment
form

トラックバック

トラックバックURL
→http://createsht.blog15.fc2.com/tb.php/1619-34c8defe
この記事にトラックバックする(FC2ブログユーザー)

Trackback
list

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。