[スポンサードリンク]
2014-09-11 09:25:20
【PSM+MonoGame】SpriteBatch.Endで出る「OutOfMemoryException」
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個にまとめておきたいところですね。


[スポンサードリンク]
コメントする


コメント
まだコメントはありません。