4

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

4

2 回答 2

3

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

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

于 2012-10-08T19:02:41.557 回答
1

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

于 2012-09-30T00:43:21.010 回答