我最近一直在寻找一个使用Direct3D 9进行渲染的应用程序。我注意到的是,给定帧在渲染目标或包装它们的纹理上的第一次操作似乎需要很长时间。系统运行的是Windows 7,并且图形内存未不足。因此,不应该发生抖动。我发现有趣的是,在16位浮点曲面上的操作所需的时间大约是在8位整数曲面上的两倍。
有人对这种现象有什么解释吗?
-Timo
发布于 2013-08-20 19:30:10
如果第一个操作需要很长时间,但后续操作没有,这听起来像是JIT (just-in- time )编译问题。你没有提到你正在使用什么语言/框架,但如果它是在运行时编译的任何东西(.NET,Java,等等),你会在第一次运行一些你不会在后续迭代中运行的代码时遇到延迟。
至于16位花的时间是8位的两倍,很难说到底是怎么回事。相信16位浮点运算花费的时间是8位固定宽度整数的两倍,这并不是完全荒谬的。
发布于 2013-08-27 03:50:08
在D3D9中,驱动程序体系结构使得资源在使用时必须进行验证。这增加了许多API调用的开销,这也是您应该优化以用更少的API调用做更多事情的部分原因。
此外,在较老的视窗平台(例如视窗XP)上,D3D驱动程序完全处于内核模式,因此应用程序接口调用将调用用户模式到内核模式的上下文切换(这不是Windows Vista、7或8中的情况,它们具有像OpenGL这样的用户模式前端)。
在D3D10中,只有在创建资源时才对其进行验证。可能是因为D3D10位于WDDM之上,这使得D3D运行时从完全内核模式切换到部分用户模式。在WDDM中,如果D3D运行时崩溃,它不会导致内核崩溃(BSOD),因此验证并不那么重要。当你在用户模式下运行时,你不需要对这些事情产生偏执。
现在,至于8位整数和16位fp之间的性能,这实际上是意料之中的。不是因为一个是整数,另一个是FP (GPU在FP上很棒),而是因为其中一个的大小是另一个的两倍。GPU有大量的内存带宽,但您仍然可以通过使用尽可能小的数据类型来提高性能。
https://stackoverflow.com/questions/18333745
复制相似问题