2013-05-21 15 views
6

Wir haben eine Software, die gegen DirectX 7 SDK programmiert ist (d. H. Der Code verwendet LPDIRECTDRAWSURFACE7 und dergleichen) und läuft im Vollbildmodus. Die Hauptaufgabe besteht darin, etwas auf den Bildschirm als Reaktion auf externe Trigger zuverlässig zu setzen. Dies verhält sich sehr gut unter Windows XP: Die Software wartet auf einen Trigger und wenn sie ausgelöst wird, erstellt sie einen neuen Frame, setzt ihn in den Backbuffer und teilt DX mit, die Puffer zu spiegeln. Das Ergebnis ist die ungefähre Verzögerung zwischen dem Auslöser und wenn der Rahmen effektiv auf dem Bildschirm angezeigt wird, ist abhängig von der Grafikkarte und den Treibern 3 Rahmen oder 50 ms für einen 60 Hz-Bildschirm. Dies wird auf einer Vielzahl von Systemen getestet, die alle NVidia-Karten ausführen. Auf manchen Systemen mit höheren Karten bekommen wir sogar 2 Frames.Fix für DirectX 7-Latenz unter Windows 7?

Wenn die gleiche Software unter Windows 7 ausgeführt wird (mit keiner anderen Software überhaupt), können wir nicht niedriger als 5 Frames werden. Das bedeutet irgendwo in der Pipeline das OS oder der Treiber oder beide essen 2 zusätzliche Frames, was für die Anwendung inakzeptabel ist. Wir haben versucht Aero/Desktop Composition/verschiedene Treiberversionen/verschiedene Grafikkarten zu deaktivieren, aber keinen Erfolg.

  • woher kommt das? Ist das irgendwo dokumentiert?
  • gibt es eine einfache Möglichkeit zu beheben? Ich weiß, dass DirectX 7 alt ist, aber ein Upgrade, um eine neuere Version zu kompilieren, könnte tonnenweise Arbeit sein, daher wäre eine andere Art von Korrektur sinnvoll. Vielleicht ein Flag, das im Code gesetzt werden kann?

bearbeiten hier einige Code, scheint relevant:

Erstellung von vorne/hinten Oberflächen:

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); 

Erstellung von Oberflächen verwendet machen Rahmen, bevor sie gezogen bekommen:

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) 

Rendering-Schleife, in 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); 
+0

Möchten Sie erklären, warum dies abgelehnt wird? Wenn es zum Beispiel hier nicht hingehört, sag wenigstens warum. – stijn

+0

fragen Sie es auf stackoverflow, weil dies eine Codierung Frage ist. – magicandre1981

+0

yeah Ich war mir nicht sicher, es ist möglich, dass es nur ein Konfigurationsproblem ist - sowieso gewählt, um zu schließen, um nach SO zu verschieben – stijn

Antwort

3

Ich denke, dass das Windows XP-Ding ein Ablenkungsmanöver ist. Die letzte Version von Windows, auf der DirectX 7 direkt ausgeführt wurde, war Windows 2000. Windows XP emuliert gerade DX7 in DX9, genau wie Windows 7.

Ich werde eine Vermutung wagen, dass Ihre Anwendung palettierte Texturen verwendet, und dass, wenn DX diese Funktionalität emuliert (wie es nach DX7 gelöscht wurde), es eine Textur generiert, die die indizierten Farben verwendet. Sie könnten versuchen, die App mit GPUView zu profilieren, um zu sehen, ob es eine Verzögerung beim Verschieben der Textur auf die GPU gibt. ZB könnte der Win7-Treiber es zuerst komprimieren?

+0

Wir verwenden keine palettierten Texturen oder irgendeine andere spezielle DX-Funktion: alles wird Pixel für Pixel direkt in den Oberflächenspeicher geschrieben. Aber danke für die Erwähnung von GPUView, wusste es nicht, aber es scheint sehr interessant. – stijn

+0

@stijn laufen irgendwelche Shader? –

+0

nein; habe nicht den code atm aber afaik die render loop setzt einfach einige pixel in eine oberfläche, blies die oberfläche auf die backbuffer-oberfläche und ruft Flip() auf – stijn

Verwandte Themen