Direct3D 9 API调用的延迟

时间:2013-08-20 11:22:43

标签: direct3d direct3d9

我最近在使用Direct3D 9进行渲染的应用程序中使用PIX for Windows。我注意到,渲染目标或包裹它们的纹理上给定帧的第一次操作似乎需要很长时间。系统正在运行Windows 7,并且没有超出图形内存。因此不应该发生颠簸。我感到有趣的是,16位浮点表面上的操作所花费的时间是8位整数表面的两倍。

有人对此现象有任何解释吗?

-Timo

2 个答案:

答案 0 :(得分:0)

如果第一个操作需要很长时间,但后续操作没有,则听起来像是JIT(即时)编译问题。你没有提到你正在使用的语言/框架,但如果它是在运行时编译的任何东西(.NET,Java等),你将在第一次运行一些你不会在后续编写的代码时遇到延迟迭代。

至于16位的速度是8位的两倍,很难说出真正发生了什么。认为16位浮点运算可能需要8位固定宽度整数的两倍,这并不完全荒谬。

答案 1 :(得分:0)

在D3D9中,驱动程序体系结构使得资源在使用时必须经过验证。这会增加许多API调用的开销,并且是您应该使用较少的API调用进行优化以进行更多操作的部分原因。

此外,在较旧的Windows平台(例如Windows XP)上,D3D驱动程序完全处于内核模式,因此API调用将调用用户模式到内核模式上下文切换(在Windows Vista中不是这种情况, 7或8,它们具有像OpenGL这样的用户模式前端。

在D3D10中,只有在创建资源时才会验证资源。可能是因为D3D10位于WDDM之上,这使得从完全内核模式切换到部分用户模式D3D运行时。在WDDM中,如果D3D运行时崩溃,它不会导致内核崩溃(BSOD),因此验证不那么重要。当您在用户模式下运行时,您不必对这些事情几乎是偏执狂。


现在,至于8位整数和16位fp之间的性能,这实际上是预料之中的。不是因为一个是整数而另一个是FP(GPU很好用FP),但因为一个是另一个的两倍。 GPU具有大量内存带宽,但您仍然可以通过使用尽可能小的数据类型来提高性能。

相关问题