2013-05-21 20 views
6

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

Cura di spiegare perché questo è downvoted? Se non appartiene qui, per esempio, almeno spiega perché. – stijn

+0

chiedilo su stackoverflow, perché questa è una domanda di codifica. – magicandre1981

+0

sì, non ero sicuro, è possibile che sia solo un problema di configurazione - comunque votato a chiudere per passare a SO – stijn

risposta

3

Penso che la cosa di Windows XP sia un'aringa rossa. L'ultima versione di Windows che eseguiva direttamente DirectX 7 era Windows 2000. Windows XP emula semplicemente DX7 in DX9, come fa Windows 7.

Mi permetto di indovinare che l'applicazione utilizza trame palettizzate e che quando DX emula tale funzionalità (poiché è stata rilasciata dopo DX7) sta generando una trama utilizzando i colori indicizzati. Potresti provare a profilare l'app con GPUView per vedere se c'è un ritardo nello spingere la trama nella GPU. Ad esempio, forse il driver Win7 lo comprime prima?

+0

non usiamo textures palettizzate o qualsiasi altra speciale fiction DX: tutto viene scritto pixel per pixel direttamente nella memoria di superficie. Ma grazie per aver menzionato GPUView, non lo sapevo ma sembra molto interessante. – stijn

+0

@stijn stai usando qualche shader? –

+0

no; non ho il codice atm, ma dopo che il ciclo di rendering imposta solo alcuni pixel in una superficie, fa saltare la superficie sulla superficie del backbuffer e chiama Flip() – stijn