私はレンダリングする要素のリストをソートするRenderQueueを持っています。 RenderQueueがすべての「低レベル」レンダリング操作を含むRenderCommandBufferを作成したので、1000要素の場合、パフォーマンスが1400 FPSから40FPSになるという問題がありました。RenderCommandBufferにRenderコマンドを挿入するヒープ割り当てを避けるには?
私はこのアプリケーションをプロファイリングしました。 ):
std::for_each(element.meshCommands.begin(), element.meshCommands.end(), [&] (auto &command) {
std::vector<std::pair<std::string, glm::mat4> > p{ { "MVP", VPmatrix * command.second} };
m_commandBuffer.addCommand(std::make_shared<SetShaderValuesCommand>(element.material,p));
m_commandBuffer.addCommand(std::make_shared<BindMaterialCommand>(element.material));
m_commandBuffer.addCommand(std::make_shared<RenderMeshCommand>(meshProperty.mesh));
});
材料でメッシュをグループ化できますが、問題は多かれ少なかれ同じです。フレームごとに多くのオブジェクトを割り当てる。この状況をどうやって避けるのですか?どのようにゲームエンジンがこの問題に対処していますか?メモリプール?
カスタムアロケータ。そこにいくつかの図書館と話があります。 EAはオープンソースのソースも持っています。https://github.com/electronicarts/EASTL – Hayt
なぜこのようなことですべてのものの 'shared_ptr'を使用していますか? –
また、アプリケーションのビルドに使用したコンパイラオプション、特に最適化設定を投稿してください。これがテストする "デバッグ"または最適化されていないビルドの場合、結果は無意味です。 – PaulMcKenzie