【发布时间】:2009-05-08 22:22:16
【问题描述】:
我正在使用 DirectX 10 编写一个 3d 应用程序,我想知道 Shadermanagement 的处理方式如何。
在应用程序启动时预加载所有着色器然后根据需要使用它们是最有效的,还是如果数量增加,这是否训练硬件资源。
我还想知道是否考虑通过着色器进行渲染以最小化着色器开关。
【问题讨论】:
标签: direct3d shader directx-10
我正在使用 DirectX 10 编写一个 3d 应用程序,我想知道 Shadermanagement 的处理方式如何。
在应用程序启动时预加载所有着色器然后根据需要使用它们是最有效的,还是如果数量增加,这是否训练硬件资源。
我还想知道是否考虑通过着色器进行渲染以最小化着色器开关。
【问题讨论】:
标签: direct3d shader directx-10
我没有用过 DX10,只有 DX9,但我猜这些东西还是一样的。
根据您的应用程序,您实际上可能会在运行时生成着色器(许多当前复杂的 3D 游戏都会这样做)。
预加载着色器并不是一个坏主意,具体取决于您是否生成着色器、有多少个、您的内存考虑因素是什么——这取决于。但是,预加载着色器(我假设您的意思是创建 ID3DXEffect 实例)仅在运行时占用内存,而不占用 CPU。
按着色器排序是个好主意。一般来说,按材质排序是一个好主意,因为切换着色器确实会产生一些开销(不会过多,但根据应用程序的复杂性会很明显)。
要对您的绘制调用进行排序,请阅读以下内容:http://realtimecollisiondetection.net/blog/?p=86
【讨论】:
在 D3D10 中,所有设备资源都是虚拟化的,因此您不会用尽它们。当然,如果你不注意自己在做什么,你仍然可以耗尽卡上的物理资源并造成大量的颠簸。
此外,他们还显着改变了设备状态以降低切换状态的成本,包括着色器。
但您真正要问的是“对于我的应用程序,方法 X 是否比方法 Y 快?”尽管 D3D10 简化了状态管理以更快地切换状态,但回答上述问题的唯一方法是使用 您的 应用程序和 您的 数据进行性能测量。
realtimecollectiondetection.net 博客文章只是在讨论对绘制调用进行排序。这将导致更少的状态切换。不管状态切换有多快,做的越少总是越快。所以这是一个很好的一般建议。
【讨论】: