Direct2D --- 为什么Brush资源绑定到单个Direct2D渲染目标?

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

似乎是指Direct2D - 显然有很大的区别。 - bbosak
2个回答

3

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

几何图形和笔画样式的工厂方法挂在根工厂上,因为它们存储在主内存中,并且它们所影响到的任何处理都是在CPU上完成的。您可以通过ID2D1Mesh将几何对象与笔画样式“编译”为硬件资源,这基本上只是将其直接分解成顶点缓冲区。虽然它在渲染时会快得多(而不是在分解时间!),但根据几何的复杂性,它还可能使用更多的内存。


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接