我们有一款软件,使用DirextX 7 SDK(即代码使用
然而,在Windows 7上运行相同的软件(完全没有安装其他软件)时,我们无法低于5帧。这意味着在管道的某个地方,操作系统或驱动程序或两者都会多吃掉2帧,这对于应用程序来说几乎是不可接受的。我们试过禁用aero /桌面合成/不同的驱动程序版本/不同的显卡,但都没有用。
以下是一些相关的代码:
创建前/后表面:
在`OnIdle`中的渲染循环:
LPDIRECTDRAWSURFACE7
等),并且以全屏模式运行。主要任务是以可靠的方式将内容呈现在屏幕上,以响应外部触发器。在Windows XP上表现非常良好:基本上,该软件等待某个触发器,当触发后创建新的帧,将其放入后备缓冲区,然后告诉DX翻转缓冲区。结果是触发器与帧实际显示在屏幕上之间的大约延迟取决于显卡和驱动程序,在60Hz屏幕上为3帧或50mSec。这已经在各种系统上测试过了,所有系统都运行着NVidia显卡。在某些配备高端显卡的系统上,我们甚至获得了2帧。然而,在Windows 7上运行相同的软件(完全没有安装其他软件)时,我们无法低于5帧。这意味着在管道的某个地方,操作系统或驱动程序或两者都会多吃掉2帧,这对于应用程序来说几乎是不可接受的。我们试过禁用aero /桌面合成/不同的驱动程序版本/不同的显卡,但都没有用。
以下是一些相关的代码:
创建前/后表面:
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);