Skip to content

GPUの同期を削減する #1608

@yuto-trd

Description

@yuto-trd

この機能の提案は何らかの問題に関連していますか?その内容を記述してください。

RenderTarget.PrepareForSampling, ImmediateCanvas.Dispose, DrawRenderTargetGRContext.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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions