2009-06-12 18 views
9

Trabajo en un juego de disparos en 2D con muchos objetos en movimiento en la pantalla (balas, etc.).Vsync en Flex/Flash/AS3?

Uso BitmapData.copyPixels (...) para representar toda la pantalla en un búfer: BitmapData. Luego "copio Píxeles" desde "buffer" a la pantalla: BitmapData. La velocidad de fotogramas es 60.

private var bitmap:Bitmap = new Bitmap(); 
private var buffer:Bitmap = new Bitmap(); 

private function start():void { 
    addChild(bitmap); 
} 

private function onEnterFrame():void { 
    // render into "buffer" 
    // copy "buffer" -> "bitmap" 
} 

El problema es que los sprites están destrozando: alguna parte de un sprite quedó desplazado horizontalmente.

Parece que un juego de PC con VSYNC está apagado.

¿Alguien resolvió este problema?

ACTUALIZACIÓN: la cuestión no se trata de rendimiento, pero acerca de deshacerse de pantalla desgarro. [!]

ACTUALIZACIÓN: He creado another question y aquí se puede probar ambas implementaciones: el uso de Flash manera u BitmapData + copyPixels()

+0

El desgarro de la pantalla está relacionado con el rendimiento. Esa es la única forma de arreglar tu rasgado. – Kekoa

+3

@Kekoa No puedo estar de acuerdo. El rendimiento no tiene nada que ver con el desgarro de la pantalla, porque uso doble buffer. En caso de bajo rendimiento, obtendría un FPS más bajo pero no un desgarro de la pantalla. – oshyshko

+0

los otros tienen razón, que este enfoque no es muy adecuado para Flash Player ... aún así, estoy sorprendido, no funciona en absoluto ... algunas preguntas: - ¿Trataste de bloquear el bitmapData que eres entrando? (De lo contrario, esto puede ayudar mucho). ¿Está utilizando mapas de bits transparentes? (asesino de rendimiento general) - dir prueba 'Stage :: invalidate' y renderizando' Event.RENDER' en lugar de renderizar? greetz back2dos – back2dos

Respuesta

7

Siento tu dolor ya que estoy actualmente en las trincheras desarrollando mi propio juego. En la configuración predeterminada, el renderizador Flash produce horribles problemas de desgarro/sincronización de la pantalla, independientemente del código que se genere.

Es por esto que me complació haber encontrado la respuesta más simple y elegante, que no era un código de factorización (lo que no ayuda en nada, el problema es el reproductor Flash, no el código).

Simplemente habilite la aceleración de hardware en su configuración de publicación. Hay dos opciones diferentes:

Nivel 1: Direct; y Nivel 2: GPU.

Lea más sobre esto en la documentación oficial: Specify publish settings for SWF files, y decida qué opción es mejor para su juego.

El mercado objetivo juega un papel aquí, si se trata de un juego serio para los jugadores, no tiene que preocuparse por posibles problemas de rendimiento, ya que la mayoría de los jugadores tienen GPU.

This article no me proporcionaron la solución específicamente, pero me llevaron en la dirección correcta. PERO, si su juego va a estar en una ventana del navegador, es posible que tenga que usar la misma técnica de configurar wmode a direct o gpu también.

+0

¿Sabe por casualidad si existe un atributo de etiqueta de metadato que pueda especificarse para eso? (Para juegos FlashDevelop AS-only, sin FLA). Algo parecido a lo siguiente: [SWF (hardwareAcc = "gpu")] ¿eso existe? – bigp

+0

El único otro parámetro que conozco es wmode, que se puede establecer en el archivo html que incluye su archivo Flash. Estoy seguro de que debe haber algo que pueda lograr esto sin Flash IDE. –

+0

¿Cuál es la conclusión? Este es realmente un problema de Flash Player y no podemos hacer nada para mejorarlo? –

-4

Lo primero que puede querer hacer es dejar de tratar el reproductor Flash como si fuera DOS. Flash Player es un motor de juego en 2D altamente optimizado y realmente no entiendo por qué está tratando de reinventar la rueda copiando montones de segmentos de mapa de bits. Por supuesto que tendrá problemas de rendimiento.

Flash Player no permite sincronizar con ningún espacio en blanco vertical u horizontal porque Flash Player simplemente no tiene ningún concepto de esto.

Personalmente, creo que debe reconsiderar su enfoque si desea una animación "más suave". El Flash Player es ciertamente capaz de esto, solo estás probando el enfoque equivocado.

+2

Lo extraño, copiando chucks de bytes (mapas de bits) en la memoria debería ser más fácil para la computadora en lugar de renderizarlo con matemáticas cálculos Debería haber una razón por la cual "cacheAsBitmap" existe en Flash. Además, verifique esto: http://aralbalkan.com/759 – oshyshko

+0

Sus Sprites (DisplayObject's) no tienen que ser vector en absoluto. Flash Player está optimizado para lidiar con esto. Cuando comienza a recrear en ActionScript con mapas de bits lo que Flash Player ya hace muy bien y está optimizado, entonces simplemente está perdiendo el punto. Creo que deberías leer más sobre el blog de Tinic Uro: http://www.kaourantin.net – Luke

+2

@Luke: Tu respuesta sería más útil si sugiriera una alternativa práctica, en lugar de solo decir que el enfoque original es incorrecto. Hay varias fuentes en línea que sugieren el uso de bitmaps y copyToPixels en el contexto de hacer juegos 2D, por lo que no es el póster original el que está reinventando. – Kylotan

-5

No guarde cosas en BitmapData, eso matará, mata absolutamente su aplicación. Los datos de mapa de bits no son muy efectivos.

Haz que todos tus elementos del juego estén en flash, como Sprites (o MovieClips, si es necesario), y luego trabaja como debía funcionar el flash, como una plataforma de animación vectorial. Nunca fue optimizado para gráficos 2D de mapa de bits. Los gráficos vectoriales en 2d funcionan bien, e incluso si importas mapas de bits, funcionarán mejor moviéndose y luego se representarán en un objeto BitmapData.

+0

Si renuncio al almacenamiento en búfer y agrego mapas de bits como sprites nativos (aún mapas de bits), ¿resolverá el problema VSYNC? – oshyshko

+0

No, no lo hará. Pero se verá mucho mejor de lo que tienes actualmente. Como dije en mi respuesta a su pregunta, Flash Player no tiene ningún concepto de vsync. Cuando configuras los fps en 60 (lo cual es absurdo, pero eso está al lado del punto), Flash Player TRATARÁ de generar 60 fps. En realidad, casi nunca logrará esto. – Luke

+1

He encontrado que definitivamente hay momentos en que debería usar Bitmapdata para mejorar el rendimiento. –