C++ とブループリントのバランス – 一般的なゲームプレイ プログラミング

フロブは言った:
一番似ているのは、「どの雨滴が洪水の原因なのか?」という質問だと思います。 個別に、すべての呼び出し、すべての関数、すべてのブループリント ノードにはコストがあります。 個々の設計図のコストは比較的小さく、数百ナノ秒から数マイクロ秒程度です。 UStruct のコピーは常に作成されており、割り当てや複製で解放されるわけではありません。 一時的なメモリ管理は無料ではありません。 CPU サイクルを消費し、キャッシュ スペースを消費し、メイン メモリにコストが発生します。 それらは本質的に悪いものではありませんが、蓄積します。

それは私が求めていたものではありません。 「すべての呼び出し」は、JIT の使用を妨げるものではありません。 「すべての呼び出し」がネイティブ化を失敗させるわけではありません。 確かに、インタープリター言語ではすべてに追加のオーバーヘッドがありますが、C++ に存在する呼び出しを使用して Blueprint-Code を記述するということは、より最適な実行形式が利用可能でなければならないことを意味するはずです。 あなたが主張するように、私はこれを妨げたり、より困難にしたりする例にもっと興味がありました.

フロブは言った:
デザイナーが作成したコードを再構築する際に私が経験した最大の問題は、コンテナーの反復処理や悪い方法での反復処理に過度に依存していることです。 最近の例では、数千のオブジェクトを反復処理して、それらを目的の型にキャストし、それらが一致する場合に続行します。 個々のキャストには、それぞれ 1 マイクロ秒未満かかります。 彼らは、オブジェクトが処理を続行するのに適切なものであるかどうかを判断しようとしているだけで、各更新の膨大な量について話していました。

したがって、設計者が設計図を使用する際の問題の一部は、大量の反復を伴う不適切なアルゴリズムの選択です。 少なくともそれは理にかなっていると思います。場合によっては、ネイティブで実行されたとしても本番環境では実行できないほどひどく書かれたものについて話していると思いますか?

これもまた、(比較的)より効果的なバックエンドを低コストで提供することを妨げるべきポイントではありません. ネイティブに実行されていないコードをダブルダウンすることなく、C# で不適切なアルゴリズムを作成できます。 何かが足りないのか、それとも自分の意図を効果的に伝えることができなかったのかはわかりません。 つまり、私が言いたいことを示すために、Unreal と自分の「ブループリント」の両方で簡単なテストを行いました。

これは実行に約 0.534 秒かかります。これは、このような小さなループにはかなり悪いことであり、より高いインデックスを使用することさえできないか、無限ループを検出します。

これは、自分のエンジンと同じコードです。 外部でプロファイリングを行うことを期待していますが、ここでの主なオーバーヘッドはループであるべきです。 この機能。 JIT でコンパイルすると、0.011 秒かかります。 これはほぼ 50 倍高速です。 それが私のポイントです。 ビジュアル プログラミング言語がそれほど遅くなければならない理由はありません。 経験の浅いアーティストがそれを使用する方法と同じことが、私の言語にも当てはまり、青写真にも当てはまります。 しかし、(明らかに) 壊れたネイティブ化ツールを強制することなく、単純に (非常にばかげた) JIT コンパイラを使用するだけで、アリストが UE-Blueprint で 1000 要素を超えるループを作成し、遅すぎました。バックエンドが改善されていれば、ほとんど無視できたはずです。

それは私の主張をより明確にしますか? 明らかに、ブループリントを遅くする何かがありますが、そもそもユーザー インターフェースが表示される方法とは何の関係もありません。

編集:
さらに参考までに、C++ の同じコード (私のエンジン内) は次のことを実行します。

core::Timer	timer;
int x = 0;
for (int i = 0; i < 200000; i++)
{
	x = x + sys::Random::Max(1);
}

const auto duration = timer.Duration();
core::Log::OutInfoFmt("Took {}s", duration);

return x;

デバッグ: 0.025 秒
リリース: 0.005 秒

したがって、私の JIT は、その時点で Debug-c++ コードよりも 2 倍優れています (おそらく、生成された ASM により最適な形式を使用するためです。これは、オプティマイザーが行う方法により似ています)。一方、最適化された C++ コードは約です。私の JIT よりも 2 倍高速です (この例では、debug-release の差は 5 倍です)。 これは、私のシステムの相対的なパフォーマンスの参照を提供するだけでなく、ブループリントがどのようにインターフェースされているかという事実によって遅くなるのではなく、そのバックエンドがどのように統合されているかをさらに示しています.

.

Leave a Comment

Your email address will not be published. Required fields are marked *