【PSM+MonoGame】SpriteBatch.Endで出る「OutOfMemoryException」

2014-09-11 09:25:20

  1. 開発
  2. MonoGame
  3. PSMobile
SpriteBatch.BeginとEndの中でDrawを呼んでいるかと思いますが、マップチップを描画したりするときに、大量にSpriteを登録すると「OutOfMemoryException」が発生することがあります。
[スポンサードリンク]
SpriteBatchの内部では2000個として配列が確保されていたのですが、32*32のマップチップで960*544を埋めるだけで510個、マップチップの配置具合によっては10階層まで描画されるので510*10=5100個! ということでオーバーしてしまっていたようでした。 (そんなに描画するほうが悪いのですが、テストプログラムだったので・・・) はて、どうしたものかと悩んでいたら、Nearealさん「SpriteBatchによる描画の並列化」という記事で「複数のSpriteBatchを用意して」という話がありました。 (実際は、複数のSpriteBatchを用意、並列化してパフォーマンス向上という高レベルなお話です・・) なるほど、SpriteBatchを複数作ればよかったのかという結論になりました。 実装的にも簡単です。
SpriteBatch batch1 = new SpriteBatch( hoge );
SpriteBatch batch2 = new SpriteBatch( hoge );

batch1.Begin();
batch2.Begin();

batch1.Draw( 省略 );
batch2.Draw( 省略 );

batch1.End();
batch2.End();
実際使う場合には、まずは「batch1」でDrawしつつ、Drawした回数を数えておいて、 回数が一定数を超えたら「batch2」を使うようにする・・という仕組みにすればOKかと思います。 とはいえ速度的には、1個のSpriteBatchにまとめたほうが早いということだったので できるだけ1個にまとめておきたいところですね。
[スポンサードリンク]

コメント

[スポンサードリンク]
[スポンサードリンク]