Cosa può causare una riduzione del frame rate durante l'aggiornamento di una scheda grafica?

StackOverflow https://stackoverflow.com/questions/56424

  •  09-06-2019
  •  | 
  •  

Domanda

Abbiamo un'applicazione DirectX a due schermi che in precedenza funzionava a una velocità costante di 60 FPS (velocità di sincronizzazione dei monitor) utilizzando una NVIDIA 8400GS (256 MB).Tuttavia, quando abbiamo sostituito la scheda con una con 512 MB di RAM, il frame rate fatica a superare i 40 FPS.(Arriva a questo livello solo perché utilizziamo il triplo buffering.) Le due schede provengono dallo stesso produttore (PNY).Tutte le altre cose sono uguali, questa è un'applicazione Windows XP Embedded e siamo partiti da una nuova immagine per ogni scheda.Il numero di versione del driver è 169.21.

L'applicazione è tutta 2D.CIOÈ.solo un mucchio di quad con texture e un sacco di grafica pre-renderizzata (da qui la necessità di aggiornare la memoria della scheda).Abbiamo anche animazioni compresse che la CPU decodifica al volo: questo comporta un blocco delle texture.I blocchi impiegano un'eternità, ma ho anche provato ad avere una texture di memoria di sistema separata per l'aggiornamento della CPU e quindi ad aggiornare la texture renderizzata utilizzando il metodo UpdateTexture del dispositivo.Nessuna differenza complessiva nelle prestazioni.

Anche se ho letto tutte le FAQ che riesco a trovare su Internet sulle prestazioni di DirectX, questa è ancora la prima volta che lavoro su un progetto DirectX, quindi qualsiasi conoscenza arcana che possiedi sarebbe utile.:)

Un'altra cosa già che sono in argomento;quando si chiama Present sulle catene di scambio sembra che DirectX attenda il completamento del presente indipendentemente dal fatto che sto utilizzando D3DPRESENT_DONOTWAIT in entrambi i parametri presenti (PresentationInterval) e nei flag della chiamata stessa.Poiché si tratta di un'applicazione a due schermi, questo è un problema poiché i due monitor non sembrano essere bloccati, sto lavorando attorno a questo problema eseguendo le chiamate Present tramite un threadpool.Quale potrebbe essere la causa sottostante?

È stato utile?

Soluzione

Le schede sono esattamente le stesse (entrambe GeForce 8400GS) e differisce solo la dimensione della memoria?Molto spesso con dimensioni di memoria diverse si ottengono frequenze di clock leggermente diverse (ad es.la tua scheda con più memoria potrebbe utilizzare memoria più lenta!).

Quindi la prima cosa da controllare sarebbero le frequenze di clock del core della GPU e della memoria, utilizzando qualcosa del genere GPU-Z.

Altri suggerimenti

È un test semplice per vedere se il problema è il blocco della superficie, basta commentare l'aggiornamento della texture e vedere se il framerate ritorna a 60 Hz.Sfortunatamente, scrivere su una superficie bloccata e aggiornare la risorsa uccide le prestazioni, è sempre successo.Stai usando mipmap con le texture?So che DX9 ha aggiunto la generazione automatica di mipmap, potrebbe richiedere molto tempo per generarle.Se blocchi costantemente la stessa risorsa in ogni fotogramma, potresti anche provare a creare un pool di trame, un po' come il triplo buffering tranne che con le trame.Lasceresti che il rendering utilizzi una texture e al prossimo aggiornamento sceglierai la successiva texture disponibile nel pool che non viene utilizzata per il rendering.A meno che, ovviamente, la tua memoria non sia limitata o tu non faccia solo differenze con la trama animata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top