Abbiamo un software programmato contro DirextX 7 SDK (cioè il codice utilizza LPDIRECTDRAWSURFACE7
e simili) e viene eseguito a schermo intero. Il compito principale è mettere qualcosa sullo schermo in risposta a trigger esterni in modo affidabile. Questo si comporta molto bene su Windows XP: bsicamente il software attende alcuni trigger e quando viene attivato, crea un nuovo frame, lo inserisce nel backbuffer, quindi dice a DX di capovolgere i buffer. Il risultato è il ritardo approssimativo tra il trigger e quando il frame è effettivamente mostrato sullo schermo, a seconda della scheda video e dei driver, 3 frame o 50mSec per uno schermo da 60Hz. Questo è testato su una varietà di sistemi, tutti dotati di schede NVidia. Su alcuni sistemi con schede finali più alte otteniamo addirittura 2 frame.Risolve la latenza di DirectX 7 su Windows 7?
Quando si esegue lo stesso software su Windows 7 (senza nessun altro software installato), tuttavia, non è possibile ottenere un valore inferiore a 5 frame. Significato da qualche parte nella pipeline del sistema operativo o driver o entrambi mangiano 2 frame aggiuntivi, che è quasi inaccettabile per l'applicazione. Abbiamo provato a disabilitare la composizione aerodinamica/desktop/diverse versioni di driver/diverse schede video ma inutilmente.
- da dove viene? è documentato da qualche parte?
- c'è un modo semplice per risolvere? So che DirectX 7 è vecchio, ma l'aggiornamento per compilare i backup di una versione più recente potrebbe essere un sacco di lavoro, quindi un altro tipo di correzione sarebbe bello. Forse qualche bandiera che può essere impostata nel codice?
modificare ecco qualche codice che sembra rilevante:
Creazione di front/back superfici:
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);
Creazione di superfici utilizzate per il rendering dei fotogrammi prima di essere tratte:
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)
Ciclo di rendering, 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);
Cura di spiegare perché questo è downvoted? Se non appartiene qui, per esempio, almeno spiega perché. – stijn
chiedilo su stackoverflow, perché questa è una domanda di codifica. – magicandre1981
sì, non ero sicuro, è possibile che sia solo un problema di configurazione - comunque votato a chiudere per passare a SO – stijn