Domanda

Prima di tutto, sto programmando un gioco. Attualmente nella funzione di rendering ci sono due chiamate a due funzioni differenti. Tributiamo un testo, uno rende sprite.

Sul mio computer (AMD Phenom (tm) II X4 955 Processor (4 CPU), ~ 3.2GHz, 4096MB di RAM DDR2, NVIDIA GeForce GTX 285) Ho una velocità di rendering di ~ 2.200 FPS durante il rendering circa 200 sprite e circa 100 FPS durante il rendering su 14.500.

Io sto usando un vettore per memorizzare le informazioni di ogni oggetto che sto rendering e utilizzando uno sprite con molte chiamate draw.

modalità di rilascio VS2008 con piena ottimizzazione per C ++. So che ho sentito a destra ea sinistra non ottimizzare prematuramente, ma a questo punto, è in esecuzione grande per me, ma non così bene su alcuni computer.

Non riesco a immaginare che cambia vettori per gli array da quando sto spingendo e tirando le cose dal vettore ogni fotogramma, in un metodo indeterminabile. Quasi in modo casuale.

Ho provato float e double e la velocità non è diversa.

Sarebbe diverso utilizzando DirectDraw piuttosto che DirectX e la Sprite metodo Render? Dal momento che non ho idea delle differenze tra DirectDraw e DirectX, io non sono al 100% che cosa dovrei pensare a questo.

Il gioco funziona bene su computer media, ma quello che sto paragonando il mio gioco a è Touhou. Touhou funziona a 60 FPS sul computer più debole che ho provato, ma il mio gioco non funziona più veloce di 36 ~ 42 FPS. Non riesco a immaginare quello che sto facendo male, essendo così nuovo per DirectX e C ++.

Tutta l'assistenza in questa materia sarebbe grande, purtroppo non sarò in giro per un po 'di aggiungere domande di informazioni o risposte.

È stato utile?

Soluzione

È necessario un profiler.

C'è qualche buon consiglio prestazioni nelle risposte, ma non importa. Cercando di ottimizzare un programma senza un profiler è come cercare di scrivere un programma senza un compilatore. Non immagino, misura.

Ora con quello detto, il profiling del codice grafica è una dolore infame nel collo, e non ci sono (a mia conoscenza) dei buoni, strumenti gratuiti per aiutare con esso. Quindi, non importa che per ora:. Inizia con una profiler CPU ordinaria, e scoprire quale delle chiamate è davvero di prendere tutto il tuo tempo

Altri suggerimenti

  

Io sto usando un vettore per memorizzare le informazioni di ogni oggetto che sto rendering e utilizzando uno   sprite con molte chiamate draw.

Non sono sicuro di capire quello che stai dicendo, ma questo suona come si sta disegnando essenzialmente lo stesso oggetto in un sacco di posti diversi. Se questo è il caso, probabilmente si desidera cercare DirectX instancing . L'idea di base è di specificare 1) la geometria per disegnare, e 2) un numero di posti di disegnarlo. Ciò consente di risparmiare ri-specificando la geometria ogni volta che si disegna l'oggetto, in modo che possa migliorare la velocità in modo considerevole.

  

Non riesco a immaginare che cambia vettori per gli array da quando sto spingendo e tirando le cose dal vettore ogni fotogramma, in un metodo indeterminabile. Quasi in modo casuale.

Stai inserimento e / o la rimozione di cose da posizioni diverse dalla parte posteriore del vettore? In un vettore, inserimenti e rimozioni, dalla presa centrale O (n), cioè, la quantità di tempo necessaria è proporzionale alla dimensione del vettore.

Se questo è il caso, allora considerare l'utilizzo di un std::list invece. Si noti che con 10k + oggetti questo potrebbe essere facilmente causando i problemi di prestazioni, a seconda di quanto spesso lo si fa.

Profilo vostra applicazione, e determinare se il collo di bottiglia è la CPU o la GPU (o il bus di trasferimento tra i due) Quando è determinato si hanno poche scelte:

1) Se la sua CPU, si può provare instancing di ridurre il numero di pareggi chiamata. Oppure, se la vostra macchina di destinazione non supporta istanze hardware, provare una sorta di dosaggio. Per istanza o batch uno sprite è necessario utilizzare un QUAD (2 triangolo orientato) come interfaccia di default fa.

2) Se la sua GPU, cercare di capire se uno shader causando il rallentamento. Se questo è il caso cercare di ottimizzarlo. Se proprio non lo shader, cercare di ridurre overdraw. Se una parte degli oggetti non sono trasparenti con front-to-back di disegno.

3) Se la sua BUS, provare a fare come con la CPU, come con dosaggio si riduce il numero di blocchi / sblocca il necessario per trasferire i dati. (Con te instancing non avrebbe bisogno di aggiornare il buffer a tutti)

Questo è tutto. : P

P.S. Un avvertimento ... non cercare di PROFILO DirectX chiamate con un profiler CPU. (Ma utilizzare PerfHUD da nVidia o ATI GPUPerfStudio da, o GPA da Intel) Il suo solo il tempo losed, DirectX ha un buffer di comando e non si è certi che una chiamata fatta ora viene eseguito quel momento. La maggior parte del tempo che restituisce immediatamente e non fare nulla.

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