Direct2D --- 为什么画笔资源绑定到各个 Direct2D 呈现目标

Direct2D --- Why are Brush resources bound to individual Direct2D render targets?

本文关键字:Direct2D 目标 绑定 为什么 画笔 资源      更新时间:2023-10-16

为什么Microsoft决定将画笔资源绑定到单个 Direct2D 呈现目标,而不是整个 Direct2D 上下文。如果我们有一个 Direct3D 纹理,该纹理映射到 Direct2D 呈现目标(对于 HUD),当用户在全屏和窗口模式之间切换时需要将其大小调整为屏幕的整个宽度和高度,或者调整窗口大小,我们应该怎么做?发生这种情况时,唯一要做的就是重新创建所有画笔;还是有其他方法,例如以某种方式将画笔绑定到 ID2D1Factory,而不是 Direct2D 图面?

画笔需要在 GPU 上分配资源。由于 Direct2D 是"无策略"API,这意味着他们希望确保你可以直接控制内存使用情况,因此画笔工厂方法挂起呈现器目标而不是根工厂。否则,他们需要制定一些策略来决定何时释放硬件资源,并且该策略在某些情况下始终是错误的(这会对性能或内存使用情况产生负面影响)。

几何图形和描边样式的工厂方法挂在根工厂之外,因为它们存储在主内存中,并且它们影响的任何处理都是在 CPU 上完成的。您可以通过ID2D1Mesh将带有描边样式的几何对象"编译"为硬件资源,这基本上只是将其直接细分到顶点缓冲区中。虽然它会快得多(在渲染时,而不是在细分时!),但它也可以使用更多的内存,具体取决于几何体的复杂性。

我不确定这是否有帮助,因为您没有描述当用户在全屏模式和窗口模式之间切换时会发生什么,所以我假设唯一的变化是渲染目标的大小,如果是这种情况,您可以通过调用 ReSize 函数来调整渲染目标的大小,并像往常一样使用画笔, 刷子不需要改变任何东西。