windows-7 - 修复 Windows 7 上的 DirectX 7 延迟问题吗?

标签 windows-7 nvidia latency directx

我们有一个针对 DirextX 7 SDK 编程的软件(即代码使用 LPDIRECTDRAWSURFACE7 等)并以全屏运行。主要任务是以可靠的方式在屏幕上放置一些内容以响应外部触发。这在 Windows XP 上表现得非常好:基本上,软件等待某个触发,当触发时,创建一个新帧,将其放入后台缓冲区,然后告诉 DX 翻转缓冲区。结果是触发和帧在屏幕上有效显示之间的近似延迟,具体取决于视频卡和驱动程序,对于 60Hz 屏幕为 3 帧或 50 毫秒。这已经在各种系统上进行了测试,所有系统都运行 NVidia 卡。在某些具有更高端卡的系统上,我们甚至可以获得 2 个帧。

但是,当在 Windows 7 上运行相同的软件(根本没有安装其他软件)时,我们无法获得低于 5 帧的帧数。这意味着在管道中的某个地方,操作系统或驱动程序或两者都会消耗 2 个额外的帧,这对于应用程序来说几乎是 Not Acceptable 。我们尝试禁用航空/桌面合成/不同的驱动程序版本/不同的显卡,但无济于事。

  • 这是从哪里来的?这是否记录在某处?
  • 有简单的方法可以解决吗?我知道 DirectX 7 很旧,但升级到重新编译更新的版本可能需要大量工作,因此另一种类型的修复会很好。也许可以在代码中设置一些标志?

编辑这里有一些似乎相关的代码:

创建前/后表面:

ddraw7->SetCooperativeLevel( GetSafeHwnd(),
  DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX | DDSCL_MULTITHREADED )

DDSURFACEDESC2 desc;
ZeroMemory( &desc, sizeof(desc) );
desc.dwSize = sizeof( desc );
desc.dwFlags =  DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP |
                      DDSCAPS_COMPLEX | DDSCAPS_3DDEVICE |
                      DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM;
desc.dwBackBufferCount = 1;
ddraw7->CreateSurface( &desc, &primsurf, 0 )

DDSCAPS2 surfcaps;
ZeroMemory( &surfcaps,sizeof( surfcaps ) );
surfcaps.dwCaps = DDSCAPS_BACKBUFFER;
primsurf->GetAttachedSurface( &surfcaps, &backsurf );

创建用于在绘制帧之前渲染帧的表面:

DDSURFACEDESC2 desc;
ZeroMemory( &desc, sizeof(desc) );
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS ;
desc.dwWidth = w;
desc.dwHeight = h;
desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY;
desc.ddpfPixelFormat.dwSize = sizeof( DDPIXELFORMAT );
desc.ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8;

LPDIRECTDRAWSURFACE7 surf;
HRESULT r=ddraw7->CreateSurface( &desc, &surf, 0 )

渲染循环,在OnIdle中:

//clear surface
DDBLTFX bltfx;
ZeroMemory( &bltfx, sizeof(bltfx) );
bltfx.dwSize = sizeof( bltfx );
bltfx.dwFillColor = RGBtoPixel( r, g, b );
backsurf->Blt( rect, 0, 0, DDBLT_COLORFILL | DDBLT_WAIT, &bltfx )

//blit some prerendered surface onto it, x/y/rect etc are calculated properly)
backsurf->BltFast( x, y, sourceSurf, s&sourceRect, DDBLTFAST_WAIT );

primsurf->Flip( 0, DDFLIP_WAIT )

primsurf->Blt(&drect,backsurf,&srect,DDBLT_WAIT,0);

最佳答案

我认为 Windows XP 的事情是转移注意力的。最后一个直接运行 DirectX 7 的 Windows 版本是 Windows 2000。Windows XP 只是在 DX9 中模拟 DX7,与 Windows 7 的做法相同。

我大胆猜测您的应用程序使用调色板纹理,并且当 DX 模拟该功能时(因为它在 DX7 之后被删除),它正在使用索引颜色生成纹理。您可以尝试使用 GPUView 来分析应用程序查看将纹理推送到 GPU 时是否存在延迟。例如,也许Win7驱动程序先压缩它?

关于windows-7 - 修复 Windows 7 上的 DirectX 7 延迟问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16699474/

相关文章:

redis - AWS (ElastiCache) 中的高 Redis 延迟

delphi - WH_JOURRNALRECORD 的 SetWindowsHookEx 在 Vista/Windows 7 下失败

c# - 图像在 Win8/Win10 中呈现,但在 Win7 中不呈现

python - 将 “python2” 路径添加到 Windows 7 上的命令行

cuda - 从命令提示符编译 CUDA 时出错

cuda - NVIDIA Tesla 和 CUDA 究竟是什么?

java - 分配延迟似乎很高,为什么?

ruby-on-rails - 如何使用 Instant Rails 在 Windows 中升级我的 Ruby 版本?

大型矩阵的 CUDA 矩阵乘法中断

javascript - 如何使用 JavaScript ping IP 地址