升级图形卡时,什么会导致帧速率降低?

时间:2020-03-05 18:51:24  来源:igfitidea点击:

我们有一个两屏DirectX应用程序,该应用程序以前使用NVIDIA 8400GS(256MB)以稳定的60 FPS(显示器的同步速率)运行。但是,当我们用512 MB RAM换出一张卡时,帧速率很难达到40 FPS以上。 (由于我们使用的是三重缓冲,所以它变得很高。)这两张卡来自同一制造商(PNY)。其他所有条件都相同,这是Windows XP Embedded应用程序,我们从每张卡的全新映像开始。驱动程序版本号是169.21.

该应用程序是全二维的。 IE。只是一堆带纹理的四边形和许多预渲染的图形(因此需要升级卡的内存)。我们还提供了压缩动画,CPU即时对其进行解码,这涉及纹理锁定。这些锁永远存在,但是我也尝试过使用单独的系统内存纹理供CPU更新,然后使用设备的UpdateTexture方法更新渲染的纹理。性能没有整体差异。

尽管我已经阅读了所有可以在Internet上找到的有关DirectX性能的常见问题解答,但这仍然是我第一次从事DirectX项目,因此,我们所拥有的任何神秘知识都将是有用的。 :)

我在讨论这个问题时的另一件事;当在交换链上调用Present时,无论我在当前参数(PresentationInterval)和调用本身的标志中都使用D3DPRESENT_DONOTWAIT的事实,DirectX似乎都等待当前完成。因为这是一个两屏幕应用程序,所以这是一个问题,因为两个监视器似乎没有同步锁相,因此我正在通过线程池运行Present调用来解决此问题。造成这种情况的根本原因是什么?

解决方案

回答

这是一项很容易的测试,可以查看是否存在表面锁定问题,只需注释掉纹理更新,然后查看帧频是否恢复为60hz。不幸的是,总是写在锁定的表面上并更新资源会破坏性能。我们是否在使用带有纹理的mipmap?我知道DX9添加了自动生成mipmap的过程,可能会花费大量时间来生成那些。如果我们不断在每帧上锁定相同的资源,那么我们也可以尝试创建一个纹理池,有点像三重缓冲,但纹理除外。我们将让渲染使用一个纹理,然后在下一次更新时,选择池中未用于渲染的下一个可用纹理。当然,除非内存受到限制,或者我们对动画纹理所做的唯一差异。

回答

这些卡是否完全相同(均为GeForce 8400GS),并且只有内存大小不同?内存大小不同的时钟频率通常会略有不同(例如,内存更多的卡使用的内存可能会更慢!)。

因此,首先要检查的是GPU核心和内存时钟频率,使用诸如GPU-Z之类的东西。