Actualmente estoy trabajando en un juego de plataformas Flash muy grande (cientos de clases) y estoy lidiando con un problema donde el juego se detiene lentamente si lo dejas el tiempo suficiente. No escribí el juego, así que solo estoy vagamente familiarizado con sus aspectos internos. Algunos de los misteriosos síntomas incluyen,AS3 gran degradación del rendimiento del juego en el tiempo
- El juego funcionará bien durante un tiempo determinado (en un nivel determinado) cuando, de repente, se iniciará una fuga de memoria de forma exponencial.
- El tiempo que demora el juego en llegar al punto donde se produce una fuga exponencial es más corto cuando hay más sprites en la pantalla.
- Incluso cuando no se muestra nada visiblemente en la pantalla, el juego se ralentiza.
- El juego se ralentiza más rápido con colisiones de sprites más frecuentes.
- Inhabilitar por completo el código de colisión ralentiza la degradación, pero no impide que el juego caiga eventualmente.
Mirando a la fuente y el uso de Flex perfilador, mis primeros sospechosos son,
- hay muchos objetos vagancia, especialmente
WeakMethodClosure
, tomando grandes cantidades de memoria. - El programa hace un uso extremadamente extenso de oyentes de eventos débiles (docenas enviados por cuadro).
- BitmapData se está copiando cada vez que se crea un nuevo sprite. Estos son sprites de 50x50 píxeles que generan alrededor de 8 sprites por segundo.
Sé que es casi imposible decirme el problema sin ver la fuente, por lo que estoy buscando datos que puedan ayudarme a reducir esto. ¿Alguien ha experimentado esta evasiva degradación del rendimiento en sus propios proyectos? ¿Cuál fue la causa en tu caso?
Creo que este es un gran consejo para alguien que acaba de comenzar un gran proyecto de juego y se pregunta cómo estructurarlo mejor. – Kai