私は現在、趣味のプロジェクトとしてC#のレイトレーサーに取り組んでいます。私はc++実装からいくつかのトリックを実装することによってまともなレンダリング速度を達成しようとしていますが、問題が発生しています。
レイトレーサーがレンダリングするシーン内のオブジェクトはKdTree構造に格納され、ツリーのノードは配列に格納されます。私が問題を抱えている最適化は、できるだけ多くのツリーノードをキャッシュラインに収めようとしているときです。これを行う1つの方法は、ノードに左側の子ノードへのポインターのみを含めることです。その場合、配列内の左側の子の直後に右側の子が続くことは暗黙的です。
ノードは構造体であり、ツリーの構築中に、静的メモリマネージャークラスによって配列に正常に配置されます。私が木を横断し始めると、最初はうまく機能しているように見えます。次に、レンダリングの初期の時点(毎回ほぼ同じ場所)で、ルートノードの左側の子ポインターが突然ヌルポインターを指しています。配列がヒープ上にあるため、ガベージコレクターが構造体を移動したという結論に達しました。
アドレスをメモリに固定するためにいくつかのことを試みましたが、必要に応じて、アプリケーションの存続期間全体にわたってそれらのどれも持続しないようです。'fixed'キーワードは、単一のメソッド呼び出し中にのみ役立つようであり、'fixed'配列の宣言は、ノードがそうではない単純な型でのみ実行できます。これを行うための良い方法はありますか、それともC#が意図されていなかったものの道をはるかに下っていますか?
ところで、c ++に変更することは、おそらく高性能プログラムにはより良い選択ですが、オプションではありません。