問題タブ [entity-component-system]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
3680 参照

c# - ネイティブ コレクションを使用した Unity ジョブ システムは、C# コレクションを使用したジョブ システムよりも遅い

私は現在、非常に CPU 負荷の高いシミュレーションに取り組んでおり、ジョブ システム + バースト コンパイルに移行し、パフォーマンスが大幅に向上する可能性があります。とはいえ、ジョブシステムへの切り替えは新たなボトルネックを生み出しました。これを回避する方法があるかどうかを尋ねたかったのです。

これが私のシミュレーションの仕組みです。基本的に、ワールド空間で 2 次元の四角形を移動し、パス上のグリッド座標をキャプチャします。ジョブがなければ、最大のボトルネックは でしSampleLineた。ジョブ システムでは、ボトルネックはtrajectory.Add/.AddNativeoccupied.IndexOfです。

trajectory.Addを使用しDictionary<int2, float2>、.AddNative はNativeHashMap<int2, float2>値を格納するために を使用します。最初に NativeList のすべての値を役に立たないリストにコピーする必要がありますが、AddNative のtrajectory.Addほぼ2 倍高速です。配列をバッファーとして使用することで、おそらくさらに高速化できます。

使用したジョブは次のとおりです。

今私の問題は、どうすればコストのかかるNativeListList変換を防ぐことができますか? a を a に変換してそのリストを a に追加するよりも、 aを aNativeListに追加する方が遅いのはなぜですか?NativeHashMapNativeListListDictionary

また、並行して呼び出すことSampleLineもできるので、ジョブを小さなジョブに分割した方がよいでしょうか? WorldToCellしかし、ジョブが他のジョブを開始できるかどうか、またはジョブを作成WorldToCellするだけで (最も呼び出されるため)、通常の C# で残りを実行する必要があるかどうかはわかりません。私はジョブシステムにまったく慣れていないので、何がどのように「ジョブ化」されるべきかわかりません。1 つの大きなジョブをそのままにしておくことも、小さなジョブをたくさん作成WorldToCellすることも、3 つの計算すべてを 1 つのジョブにすることもできます。