2011-01-28 14 views
5

Estoy intentando crear un motor de juego simple en JavaScript con WebGl, pero estoy teniendo algunos problemas no deseados con JavaScript en general, lo que espero se pueda evitar. Además de la falta general de rendimiento con JavaScript, estoy teniendo algunas pausas extrañas cuando renderizo con WebGl, que ocurre periódicamente, una vez cada segundo más o menos. Supongo que esto tiene que pasar con GC en JavaScript. ¿Hay alguna forma de minimizar estos "tartamudeos"? ¿Hay alguna práctica común que deba saber, una forma de forzar, al menos parte de la recolección de basura, a que suceda en un momento que yo pueda controlar?JavaScript Garbage Collection hace una pausa

Sé que estas son preguntas simples, pero soy bastante nuevo en JavaScript, y buscar en Internet no me dio mucha información útil.

+2

Por supuesto * puede * ser GC, pero en mi experiencia, siempre cuando culpamos a GC por algo, resultó que teníamos un error común en alguna parte del código. – Boldewyn

+0

¡Utilice las herramientas de creación de perfiles de su navegador! Como sugirió @Boldewyn, el problema podría no ser GC. La optimización prematura a menudo puede conducir a un código innecesariamente complejo, pero la optimización sin métricas de creación de perfiles probablemente dará lugar a códigos complejos * y * que ni siquiera mejoran el rendimiento. – namuol

Respuesta

2

Reutiliza los objetos con la mayor frecuencia posible. Si está creando docenas de objetos (como vectores y matrices) para cada fotograma procesado, entonces definitivamente recibirá tartamudeo relacionado con GC. Por lo tanto, cuando utiliza un enfoque basado en escenas y gráficos para representar su juego, es posible que desee almacenar en caché los objetos en los nodos del gráfico de escena, por ejemplo. O puede usar el Object Pool Pattern. En otros lenguajes como Java, esta técnica está en desuso debido a que la creación de objetos y el GC son tan rápidos hoy que un grupo de objetos ya no ayuda. Pero en JavaScript todavía podría ayudar.

Tuve problemas de tartamudeo GC en un juego de JavaScript que escribí el año pasado y lo resolví reescribiendo mi motor vectorial 2D para que no se creen absolutamente nuevos objetos durante la renderización de cuadros. Los objetos solo se crean una vez cuando la escena está acumulada o se le agregan nuevos nodos de escena. Pero mostrar y animar la escena no crea absolutamente ningún objeto nuevo.

Es posible que desee echar un vistazo a mi motor 2D:

http://www.ailis.de/~k/hg/javascript/twodee/file/tip/src/main/javascript/twodee

Se dará cuenta de que cacheamos vectores y matrices necesarias temporalmente en los campos estáticos y que utilicé clases de vectores y matrices en lugar mutables de inmutable, por lo que los vectores/matrices existentes se modifican en lugar de crear nuevos vectores de resultados/matrices cuando se hacen cálculos matemáticos con ellos.

Cuestiones relacionadas