Rendimiento de renderizado para juegos Flash

11

Estaba leyendo en SO sobre la representación flash nativa en comparación con la construcción de un BitmapDatabúfer de cuadros personalizado y algunas de las respuestas eran un poco conflictivas, así que me preguntaba:

  1. ¿Es generalmente una mejor práctica ir a la ruta del búfer de mapa de bits personalizado o es mejor dejar el renderizado en el motor flash?
  2. Si está utilizando animaciones vectoriales MovieClipen lugar de sprites, ¿eso cambia la respuesta a lo anterior?
  3. Si es así, ¿es una buena práctica usar animaciones basadas en sprites?

(Estoy apuntando a Flash 10 si eso hace alguna diferencia)

Alconja
fuente

Respuestas:

14

1. No existe una mejor práctica general.

Si tienes muchos elementos (forma compleja), partículas, etc. en tu juego, el enfoque del búfer de mapa de bits será mucho más rápido. El búfer de mapa de bits también se escalará mejor al aumentar la complejidad de sus sprites. El renderizador vectorial se volverá más lento con formas más complejas o animaciones de interpolación (interpolación de forma), aunque tiene algunos otros beneficios:

  • Puede escalar libremente sus activos o incluso ampliar la escena sin pérdida de calidad.
  • La rotación u otras transformaciones como sesgar serán mucho más fáciles de realizar en gráficos vectoriales

En conclusión, se reduce a qué tipo de juego estás construyendo.

2. Uso de MovieClips en lugar de hojas de sprites de mapa de bits

¿Supongo que te referías a "hojas de sprites de mapa de bits" y no a la clase AS3 Sprite ?

Esto no hace la diferencia, de verdad. Siempre puede convertir sus animaciones basadas en MovieClip en mapas de bits animados. Ya sea manualmente, exportando la película a cuadros y convertirlos en una hoja de sprites , o dinámicamente, renderizando una hoja de sprites desde su MovieClip en tiempo de ejecución. Así es como haría esto:

  1. Cree una instancia de MovieClip y stop()ésta.
  2. Cree un new BitmapDataobjeto con el mismo ancho y alto que Movieclip.
  3. Use el método draw () para representar el MovieClip en BitmapData.
  4. Almacene el objeto BitmapData en una matriz o vector.
  5. Vaya al siguiente cuadro de su MovieClip y repita los Pasos 2 - 4, haga esto hasta llegar al último cuadro de su MovieClip. También es una buena idea actualizar dos variables con el ancho máximo y la altura máxima de sus cuadros MovieClip (ya que estos pueden cambiar de cuadro a cuadro).
  6. Ahora puede combinar todos los objetos BitmapData almacenados en una Sprite-Sheet (use BitmapData.copyPixels () )

3. Animaciones basadas en sprites.

Como se menciona en la respuesta a su primera pregunta, no hay una respuesta definitiva para eso. Si necesita realizar muchas transformaciones con sus objetos, por ejemplo. escalar y rotar probablemente esté mejor usando el renderizador nativo flash. Si tiene animaciones predefinidas que se pueden hornear en hojas de sprites (manual o dinámicamente), y si necesita mostrar cientos de sprites al mismo tiempo, busque un motor de representación de mapas de bits.

bummzack
fuente
Cuando (si?) Flash comienza a usar aceleración de hardware para su representación, un renderizador copyPixel probablemente será más lento que el renderizador nativo.
Bart van Heukelom el
6

Diría que si está creando un juego basado en ráster utilizando sprites, vaya a crear una solución de representación personalizada utilizando BitmapData. Si está creando un juego basado en vectores, use los mecanismos de animación incorporados con MovieClips.

Si va a crear una solución de representación personalizada, se desasociará de Flash utilizando ActionScript solo para lograr lo que necesita. El motor flixel usa este método y es bastante agradable. Sin embargo, prefiero escribir mi propio motor desde cero, pero entiendes la idea.

Ir con los mecanismos de animación Flash incorporados funciona mejor para juegos basados ​​en vectores porque puede crear fácilmente los activos de su biblioteca como MovieClips que luego puede instanciar en ActionScript a pedido. Utiliza la línea de tiempo proporcionada por los clips de película para manejar la animación y mover la ubicación del sprite en consecuencia. ¡Toda la batalla! juegos como Adventure Quest Worlds usan este método. Se ve bien también.

Supongo que su última pregunta se refiere al uso de la clase Sprite en lugar de la clase MovieClip para animaciones vectoriales. Un Sprite es un MovieClip sin una línea de tiempo, por lo que perderías la comodidad de tener las animaciones administradas por ti.

Consty
fuente
3

A pesar de que es una creencia común que el bliting es más rápido, no he visto ningún punto de referencia que lo demuestre. Algunos desarrolladores prefieren el blit porque les permite tratar Flash como una máquina virtual genérica y controlar el renderizado ellos mismos. Sin embargo, si le gusta la lista de visualización incorporada (que es lo que hago), Flash puede mover, escalar, rotar y aplicar efectos agradables a cientos de objetos de visualización en pantalla (por ejemplo, MovieClips, Sprites, Bitmaps) a altas velocidades de cuadros, así que siempre que sean bastante pequeñas en dimensiones, por ejemplo, menos de 200x200 píxeles cada una. Puede usar MovieClips sin usar vectores. La mayoría de los juegos usarán recursos de mapa de bits, independientemente del sistema que usen. Pero a veces es útil diseñar y animar activos de mapa de bits en la línea de tiempo, especialmente si está trabajando con un diseñador especialista en Flash en lugar de un artista de píxeles. Al establecer la calidad del escenario en BAJA, obtendrá un rendimiento mucho mejor a expensas de las transformaciones más feas. Flash no representará ningún objeto que esté fuera de la pantalla, por lo que no lo ralentizará.

Donde Flash puede ralentizarse es moverse y transformar mapas de bits muy grandes, por ejemplo, si tiene un nivel de desplazamiento muy grande o muchas capas de paralaje. Un enfoque híbrido de usar MovieClips para los objetos de su juego mientras borra el fondo de un búfer fuera de la pantalla puede ser más rápido y le permitirá tener niveles infinitamente grandes, al tiempo que permite la facilidad de uso de Sprites y MovieClips estándar.

Iain
fuente
Las formas vectoriales complejas también pueden tener un impacto significativo en el rendimiento. Si tiene MovieClips animados con muchos degradados, y si no presta atención al nivel de detalle de sus formas vectoriales, se dibujará mucho más lento que un mapa de bits.
bummzack
Puede usar MovieClips sin usar vectores. La mayoría de los juegos usarán recursos de mapa de bits, independientemente del sistema que usen. Pero a veces es útil diseñar y animar activos de mapa de bits en la línea de tiempo, especialmente si está trabajando con un diseñador especialista en Flash en lugar de un artista de píxeles.
Iain
Sí, para los juegos flash, recomiendo no usar gradientes para nada que vaya a ser vectorial y renderizado por flash en cada fotograma, excepto algunas cosas en el HUD y el sprite del jugador. Los gradientes comen rápido el rendimiento.
AttackingHobo
Algunos puntos de referencia de renderizado y actualización: 8bitrocket.com/2007/12/23/…
Max Dohme