この機能の提案は何らかの問題に関連していますか?その内容を記述してください。
RenderTarget.PrepareForSampling, ImmediateCanvas.Dispose, DrawRenderTargetで GRContext.Flush(submit: true, synchronous: true) メソッドを呼び出している。これらのメソッドが呼び出されるたびにGPUの処理が終わるのを待機しており、CPU時間が無駄になっている。
しかし、単純にこれらの呼び出しを非同期的になるように Flush(submit: true, synchronous: false) にしてしまうと、GPUメモリが解放された後にメモリにアクセスされてしまう可能性が発生する。
(以下のようなコードがあるため。)
RenderTarget target; // 既存の描画ターゲット
RenderTarget newTarget = c.CreateTarget(width, height);
using (var canvas = new ImmediateCanvas(newTarget))
{
// 実際にはエフェクト適用などがある
canvas.DrawRenderTarget(target);
} // ここでImmediateCanvas.Disposeが呼び出され、内部で Flush(submit: true, synchronous: true) が呼び出される
target.Dispose(); // 少なくともこのDisposeが呼び出されるまでに処理を終わらせる必要がある
return newTarget;
また、メモリの開放を遅らせると確保したメモリが積み上がってout-of-memoryの可能性も発生してしまう。
望ましい解決策について記述してください
どうしましょ
検討した他の代替案について記述してください
No response
その他の情報
No response
この機能の提案は何らかの問題に関連していますか?その内容を記述してください。
RenderTarget.PrepareForSampling,ImmediateCanvas.Dispose,DrawRenderTargetでGRContext.Flush(submit: true, synchronous: true)メソッドを呼び出している。これらのメソッドが呼び出されるたびにGPUの処理が終わるのを待機しており、CPU時間が無駄になっている。しかし、単純にこれらの呼び出しを非同期的になるように
Flush(submit: true, synchronous: false)にしてしまうと、GPUメモリが解放された後にメモリにアクセスされてしまう可能性が発生する。(以下のようなコードがあるため。)
また、メモリの開放を遅らせると確保したメモリが積み上がってout-of-memoryの可能性も発生してしまう。
望ましい解決策について記述してください
どうしましょ
検討した他の代替案について記述してください
No response
その他の情報
No response