2013-07-05 20 views
11

Unity3D Profiler mi dà punte che riguardano principalmente la garbage collection. Nello screenshot qui sotto, i tre picchi rossi rappresentano tre bancarelle che avevo nel mio gameplay. Ciascuna di queste bancarelle è 100 + ms e la maggior parte del tempo è stata spesa su TrackDependencies.Unity3D: ottimizza la garbage collection

Secondo Unity instruction, ho provato ad aggiungere questo per il mio codice:

if (Time.frameCount % 30 == 0) 
{ 
    System.GC.Collect(); 
} 

Questo non ha aiutato. Ho ancora i picchi e continuano a prendere 100 + ms. Cosa sta succedendo esattamente e cosa posso fare per ottimizzare il mio gioco?

PS:

sto dinamicamente creare e distruggere un sacco di GameObject s nel mio gioco. Potrebbe essere un problema?

Non ho una concatenazione di stringhe in un loop o array come valore restituito come caveat in the post.

profiler

+0

stai distruggendo oggetti da qualche parte nel codice? – Heisenbug

+0

Se possibile, mettere in comune gli oggetti per evitare una distruzione eccessiva potrebbe essere una buona soluzione. – SlxS

+0

@Heisenbug Sì, sto creando e distruggendo dinamicamente molti oggetti nel mio gioco. Nella mia funzione object destroy ho anche chiamato 'Resources.UnloadUnusedAssets();' – CherryQu

risposta

12

Questo non ha aiutato. Ho ancora i picchi e continuano a prendere 100 + ms. Cosa sta facendo esattamente e cosa posso fare per ottimizzare il mio gioco?

Con System.GC.Collect è sufficiente forzare una garbage collection. Se hai allocato molta memoria per essere deallocata dall'ultima raccolta, allora non puoi evitare i picchi. Questo è utile solo per cercare di distribuire la garbage collection nel tempo evitando una massiccia deallocazione.

Io sto creando e distruggendo dinamicamente molti GameObjects nel mio gioco . Potrebbe essere un problema?

Probabilmente questo potrebbe essere il problema.

Alcuni indizi:

  • Prova viene allocata (LoadResource e Instantiate) quanto più possibile le risorse cominciano a voi applicazione. Se la memoria richiesta non è eccessiva, puoi semplicemente creare un'istanza di tutte le risorse necessarie e disabilitarle/attivarle su richiesta. Se i requisiti di memoria delle risorse sono enormi, questo non è possibile.
  • Evitare chiamate in entrata a Instantiate e Destroy. Creare un pool di oggetti in cui un insieme di risorse viene Istanziato all'avvio dell'applicazione. Abilita le risorse necessarie e disabilita tutto il resto. Invece di distruggere un oggetto, rilasciarlo nel pool, in modo che possa essere disabilitato e rianimato su richiesta.
  • Evitare chiamate in entrata a Resources.UnloadUnusedAssets. Questo può solo aumentare il tempo necessario per creare un'istanza di una nuova risorsa se in precedenza l'hai rilasciata. È utile per ottimizzare l'utilizzo della memoria, ma chiamarlo a intervalli costanti o ogni volta che si distrugge un oggetto non ha senso.