2014-05-10 18 views
6

Questa domanda si avvicinò:Gioco ottimizzazione delle prestazioni intervista

siete alla ricerca di colli di bottiglia nel vostro gioco, ma niente stai cambiando sta facendo il gioco più velocemente, sia nulla nella pipeline GPU o CPU. Nulla è imprevedibile e la lentezza sembra essere distribuita ovunque. Che cosa fai dopo?

Sono stato sconcertato. È una domanda trabocchetto? Quando risolvo problemi di perfusione, presumo sempre che questo era il punto in cui hai bisogno di ridimensionare tutto. Non penso che sia mem alloc, dato che si presenta in CPU perf.

+0

Non sono del tutto sicuro che questo è in tema per SO. Ma vedremo come va ... – Mysticial

+0

Probabilmente replicherei su hardware diverso. Non sono sicuro che sia quello che stanno cercando. –

+1

Chiaramente hai trovato una soluzione: "Pubblicherò la domanda su SO e attenderò i risultati" ... suppongo anche che una simile risposta fallirebbe il tuo colloquio. –

risposta

0

Forse si tratta di pensare ad algoritmi più efficienti. "Micro-ottimizzazione" ha i suoi limiti; ad esempio, puoi ottimizzare perfettamente un ordinamento di bolle, ma per ottenere una grande accelerazione potresti inventare un altro algoritmo di ordinamento.

Inoltre, nei giochi è possibile introdurre diversi tipi di compromessi di qualità/velocità (o precisione/velocità) regolabili. In genere tutti i giochi hanno alcune impostazioni che cambiano il livello di dettaglio grafico.

0

siete alla ricerca di colli di bottiglia nel vostro gioco, ma niente sei cambio sta facendo il gioco più velocemente, sia esso nulla nella pipeline GPU o la CPU. Niente è imprevedibile, e la lentezza appare a essere distribuito in tutto il mondo.

'praticamente suoni come la definizione di Uniformly Slow Code. Supponiamo che sia davvero ciò che si intende per questo (e non un certo collo di bottiglia I/O o la creazione di oggetti non necessari in un ciclo o una scelta sbagliata per le strutture dati o per gli algoritmi, ecc.).

Per fare un codice uniforme lenta più veloce, di solito si devono andare contro le buone pratiche, ed è per questo che di solito fermo ottimizzare il mio codice quando è uniformemente lento. (Suppongo che "smettere di ottimizzare" non sia una buona risposta in un'intervista ...)

Un modo per rendere le cose più veloci è identificare una sequenza appropriata di piccole operazioni, riunirle insieme in un unico punto e quindi migliorare manualmente le cose; sorta di "manualmente inlining" queste operazioni quindi facendo semplificazioni di alto livello sul codice che emerge. Richiede una buona intuizione laddove potrebbe valere la pena farlo e un'eccellente comprensione del codice coinvolto. This answer calls it bunching and horizontal optimization.

Un'altra cosa che potrebbe valere la pena guardare in se il vostro davvero hanno codice uniformemente lento è Andrei Alexandrescu's optimization tips.

3

Avrei chiesto maggiori informazioni. "Lento" è uno scarso indicatore di cattive prestazioni ed è una classificazione di un sintomo piuttosto che un sintomo stesso. Ad esempio, si potrebbe descrivere il "lento" come:

  • frame rate basso
  • Scarsa reattività all'ingresso
  • alta reattività e framerate liscio, ma la meccanica di gioco lento (vale a dire: Il giocatore e le entità muoversi agevolmente, ma molto lentamente)
  • Nel caso di giochi in rete, evidenti cadute di linea

Tutti questi problemi hanno diverse cause e soluzioni possibili:

  • basso ma costante il frame rate potrebbe essere dovuto a inefficienze nel tuo ciclo di gioco. La semplice esecuzione del tuo profiler preferito potrebbe indicare che si impiegano grandi quantità di tempo in un particolare pezzo di codice. In un gioco che ho scritto, ad esempio, ho scoperto che gli FPS bassi erano il risultato di un ciclo errato che calcolava le distanze tra le entità più volte senza la memorizzazione nella cache. In un altro gioco, ho scoperto che la struttura dati che stavo usando per eseguire ricerche sul terreno era O(N) piuttosto che O(1) (python stdlib ... ick). Non è possibile diagnosticare un problema che non si riesce a vedere e la profilazione è la prima linea di difesa.
  • La scarsa reattività può essere dovuta a un numero di cose. Se l'FPS è alto, ma i controlli sono pigro a rispondere, l'API che si sta utilizzando per accedere ai controlli può essere semplicemente male. Alcuni controller possono avere driver scadenti che possono uccidere la reattività. Potrebbe anche essere il tuo ciclo di gioco: potresti semplicemente non controllare l'input dal controller abbastanza frequentemente (forse non stai controllando ogni segno di spunta). In uno dei suddetti giochi, ho riscontrato un problema in cui alcune azioni hanno avuto un effetto ritardato: si usava un oggetto e il gioco avrebbe risposto circa mezzo secondo dopo. Si è scoperto che il problema era causato dal fatto che il client effettuava un round trip completo sul server per eseguire l'azione, verificare che ciò accadesse e attendere che il server trasmettesse che l'oggetto era stato utilizzato. Il semplice fatto che il comportamento abbia luogo istantaneamente sul cliente ha risolto il problema.
  • Le meccaniche di gioco lente potrebbero indicare che le costanti di gioco semplicemente non sono abbastanza elevate. Se tutto è fluido e bello ma tutto si muove molto lentamente, è del tutto possibile che le velocità di default o le accelerazioni non siano sufficienti.
  • Il ritardo di rete può essere causato da un numero qualsiasi di cose: il router a cui si è connessi potrebbe non riuscire, il VPS che si sta sviluppando potrebbe essere su un host che viene DDoSed, si potrebbe usare un protocollo eccessivamente (ma in modo uniforme) loquace, o stai semplicemente inviando troppi dati sul filo. In un software di simulazione che ho scritto al college, i calcoli sono stati eseguiti su alcuni computer muscolosi in un laboratorio, mentre le visualizzazioni venivano eseguite sul mio MBP nel mio dormitorio. Si è scoperto che l'enorme quantità di dati che inviavo dai computer del laboratorio al mio dormitorio era sufficiente a sovraccaricare gli switch di rete a basso costo nei pacchetti costruzione e goccia, con conseguente ritardo di orribile, ma l'uscita del registro perfettamente ragionevole.

Quindi credo che la risposta qui è di avere l'intervistatore descrivere più completamente i sintomi. @ La risposta di Ali è ottima, ma potrebbe darsi che ci sia un problema più sfumato che richiede alcuni tentativi per diagnosticare.

0

aneddotica:

posso dirvi qual è il problema senza realmente conoscere la risposta alla domanda; p

chiamate DirectX sciatta. troppi oggetti specialmente male su alcuni vecchi giochi dx9, dato che dx9 aveva bisogno di fare una nuova chiamata directdraw per ogni oggetto. o qualcosa del genere, la storia va. sostanzialmente portato alla CPU in attesa di inattività per la GPU per elaborare tutti i messaggi.

anche se senz'altro non la soluzione ad ogni problema, ho pensato che valeva la pena di menzionare come un pezzo interesing di informazioni; p non ha visto che negli altri commenti.

è quasi come avere troppi pixel shader, tranne che almeno la GPU lavora al 100% con una massa di coloro che: D per friggere omelette. (Anche, utilizzando l'occlusione di salvare le prestazioni e quindi aggiungendo una massa di pixel shader a quel modello è una cattiva idea)

spero che possiate vedere l'umorismo in questo; p

Problemi correlati