一般的に短命のオブジェクトを再利用する必要があるとよく言われますが、XNAの場合はわかりません。最も一般的なゲームオブジェクトであるアイテム、パーティクル、NPCがありますが、それらをある種のプールで再利用する必要がありますか、それとも更新リストから削除して新しいインスタンスに置き換える必要がありますか?パフォーマンスの面で重要ですか?
2 に答える
私の経験では、それがxbox360プロジェクトであるかどうかによって異なります。xbox 360は、最近のPCが通常できるほど多くの処理を行うことができなくなります。これは特に、ガベージコレクションが開始された場合に当てはまります。
http://zfs.fzi.de/attachments/article/160/XNA_Optimization.pdf
このPDFの最初の「考慮事項」の1つは、xbox360ガベージコレクションです。xbox 360のガベージコレクション時間は、作成されるすべてのオブジェクトで直線的に増加します。
プーリングは、特定の状況では非常に重要です。つまり、弾丸やボクセル インスタンスなどの共通オブジェクトの大量の作成と破棄が必要な状況では、ほぼ常に有益です。
ガベージ コレクターは便利ですが、いつもあなたの味方であるとは限りません。私のように何千ものキューブを使用して地形やオブジェクトをレンダリングするゲームを作成すると、すぐに気付くでしょう (ただし、速度低下の原因が実際に GC であることに気付くまでに数週間かかりました)。マネージ言語のプログラマーとして、私たちは単にオブジェクトを逆参照し、GC によって魔法のように取り除かれることに慣れていました。しかし、実際には、これらのオブジェクトが数千に達すると、GC は残業します。場合によっては、1 分ごとに大幅な速度低下に気付くでしょう。
したがって、共通オブジェクトのインスタンス化と逆参照を常に行う代わりに、静的で安定したサイズのオブジェクトのプールを使用する方が GC のストレスがはるかに少なくなります。
- static: すべてのオブジェクトが一度にインスタンス化され、実行時に逆参照されて GC によって取得されることはありません。
- 安定したサイズ: プール内のオブジェクト インスタンスの数が頻繁に変化することはありません (インスタンス化によるパフォーマンスの低下を防ぎます)。
このすべての背後にある理由は、基本的な意味で、GC は、ゲーム中に逆参照するすべてのオブジェクトに含まれるすべての参照を後でクリーンアップする必要があるためです。したがって、ブロックに隣接するブロックへの参照がある場合、それが他のブロックへの唯一の参照であるかどうかを確認する必要があります。非常に単純な見方ですが、これが私が学んだ方法です)。
プールを作成し、インスタンスを破棄する代わりに単純に再利用することで、これらのオブジェクトの 1 つを使い終わったときに GC からこの動作をトリガーすることはありません。オブジェクトを意のままに作成および破棄します。
基本的に、いつプーリングが必要になるかがわかります。ゲームで実行しているアクションに関連していないように見える原因不明の速度低下が定期的に発生します。これは、舞台裏でクリーンアップを行っている GC です。