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);
Möchten Sie erklären, warum dies abgelehnt wird? Wenn es zum Beispiel hier nicht hingehört, sag wenigstens warum. – stijn
fragen Sie es auf stackoverflow, weil dies eine Codierung Frage ist. – magicandre1981
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