3

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

应用程序都是 2D 的。IE 只是一堆纹理四边形和一大堆预渲染图形(因此需要升级卡的内存)。我们还拥有 CPU 动态解码的压缩动画 - 这涉及纹理锁定。锁定需要永远,但我也尝试使用单独的系统内存纹理供 CPU 更新,然后使用设备的 UpdateTexture 方法更新渲染的纹理。性能上没有总体差异。

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

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

4

2 回答 2

2

这些卡是否完全相同(都是 GeForce 8400GS),只是内存大小不同?不同的内存大小经常会出现略微不同的时钟频率(即您的卡有更多内存可能会使用更慢的内存!)。

所以首先要检查的是 GPU 核心和内存时钟频率,使用类似GPU-Z 的东西。

于 2008-09-17T07:10:25.970 回答
1

看看是不是表面锁定问题很简单,只要注释掉贴图更新,看看帧率是否恢复到60hz。不幸的是,写入锁定的表面并更新资源会杀死性能,总是如此。你在使用纹理贴图吗?我知道 DX9 添加了 mipmap 的自动生成,可能会占用大量时间来生成这些。如果您每帧不断锁定相同的资源,您还可以尝试创建一个纹理池,有点像三重缓冲,除了纹理。您将让渲染器使用一个纹理,并在下一次更新时选择池中未用于渲染的下一个可用纹理。当然,除非您的内存受限或您仅对动画纹理进行了区分。

于 2008-09-11T13:06:04.307 回答