問題タブ [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.
c# - ネイティブ コレクションを使用した Unity ジョブ システムは、C# コレクションを使用したジョブ システムよりも遅い
私は現在、非常に CPU 負荷の高いシミュレーションに取り組んでおり、ジョブ システム + バースト コンパイルに移行し、パフォーマンスが大幅に向上する可能性があります。とはいえ、ジョブシステムへの切り替えは新たなボトルネックを生み出しました。これを回避する方法があるかどうかを尋ねたかったのです。
これが私のシミュレーションの仕組みです。基本的に、ワールド空間で 2 次元の四角形を移動し、パス上のグリッド座標をキャプチャします。ジョブがなければ、最大のボトルネックは でしSampleLine
た。ジョブ システムでは、ボトルネックはtrajectory.Add
/.AddNative
とoccupied.IndexOf
です。
trajectory.Add
を使用しDictionary<int2, float2>
、.AddNative はNativeHashMap<int2, float2>
値を格納するために を使用します。最初に NativeList のすべての値を役に立たないリストにコピーする必要がありますが、AddNative のtrajectory.Add
ほぼ2 倍高速です。配列をバッファーとして使用することで、おそらくさらに高速化できます。
使用したジョブは次のとおりです。
今私の問題は、どうすればコストのかかるNativeList
対List
変換を防ぐことができますか? a を a に変換してそのリストを a に追加するよりも、 aを aNativeList
に追加する方が遅いのはなぜですか?NativeHashMap
NativeList
List
Dictionary
また、並行して呼び出すことSampleLine
もできるので、ジョブを小さなジョブに分割した方がよいでしょうか? WorldToCell
しかし、ジョブが他のジョブを開始できるかどうか、またはジョブを作成WorldToCell
するだけで (最も呼び出されるため)、通常の C# で残りを実行する必要があるかどうかはわかりません。私はジョブシステムにまったく慣れていないので、何がどのように「ジョブ化」されるべきかわかりません。1 つの大きなジョブをそのままにしておくことも、小さなジョブをたくさん作成WorldToCell
することも、3 つの計算すべてを 1 つのジョブにすることもできます。