miércoles, 10 de noviembre de 2010

performance de sprites con cocos y pyglet

english version

Cuántos sprites puedo mostrar al mismo tiempo sin que se caigan mucho las fps ?
Que puedo hacer para mejorar el rendimiento ?
Hago un caso testigo, mido y veo que conclusiones puedo sacar.

Escena testigo, en pseudocódigo:
  • estado inicial: se crean n bolas con una posición y velocidad mas o menos aleatoria; la posición inicial cae dentro del rectángulo visible de la pantalla.
  • update(dt): en cada update, cada bola actualiza su posición con el clásico
    si la bola tocó el borde, rebota de modo que no salga de pantalla

Screenshot


Primera implementación:
La mas sencilla, la escena tendrá una lista de sprites y cada sprite se dibuja llamando a su propio método draw.
Necesito un script que lo implemente en cocos y otro en pyglet
Escribo el código, corro los scripts con diferentes cantidades y obtengo éstos datos:
Usando el interprete interactivo Dreampie y matplotlib, grafico los datos:



A la perinola ! Estamos en el horno ! (argentinismos por <sorpresa><problemas> respectivamente)
En general la aplicación se vé bien si puede sostener 60 fps; la jugabilidad depende bastante del tipo de juego, con mínimos pobres alrededor de 20 fps.
Como no queremos un mínimo demasiado pobre, digamos que 30 fps es nuestro mínimo aceptable (en juegos de acción rápida puede no alcanzar).
De acuerdo al resultado de los test tendríamos que limitar la cantidad de sprites en nuestro juego a:
  • 100 sprites si queremos el mínimo aceptable de fps
  •   50 sprites si queremos que la calidad visual sea buena.
Parece un poco escaso, no ?

En los tutoriales y listas de correo de cocos y pyglet hay menciones de que usando batchs se mejora la performance. Así que:

Segunda implementación:
Aquí esencialmente los sprites se asocian con un batch, para dibujar la escena se llama al método draw del batch.
Obtengo los datos:
graficando como antes fps contra nro de sprites:


Mejoró bastante:
  • En pyglet para al mínimo aceptable de fps podemos usar hasta 1000 sprites, y para buena calidad visual 500 sprites.
  • En cocos 0.4.0 con el mínimo aceptable podemos usar hasta 500 sprites, y para buena calidad visual 250
Me interesaría medir que pasa cuando una fracción importante de sprites no está a la vista, y también cuando una fracción importante de sprites no 'ensucia' la vertex list.
Pero, viendo que el rendimiento de sprites cocos 0.4.0 es pobre relativa a pyglet, y siendo yo un committer de cocos, voy a dejar la continuación de éste artículo en espera para trabajar sobre la performance de cocos sprites.

No puedo resistir adelantarles que con un pequeño cambio en cocos recupero un 50% de la pérdida observada en pyglet -> cocos, y hay a la vista algunas mejoras mas...

Condiciones del test
  • cocos 0.4.0 release , pyglet 1.1.4 release
  • windows xp , python 2.6.5
  • amd athlon 64 x2 5200, integated gpu ati 3200

El código y media de los test puede bajarse de aquí.

No hay comentarios:

Publicar un comentario