Probando mi juego en un dispositivo más lento (Orange San Francisco aka ZTE Blade) y he estado obteniendo una velocidad de cuadros espantosa.lockCanvas() realmente lento
que poner un poco de código de depuración en el bucle de tracción y descubrió la siguiente línea se hace cargo de 100 ms:
c = mSurfaceHolder.lockCanvas();
Alguien más ve este comportamiento? He reemplazado temporalmente la vista de superficie extendiendo View e implementando onDraw(), y obtuve un mucho mejor framerate.
Aunque en general SurfaceView es mucho más rápido en mi HTC Desire. Sospecho que este puede ser un problema de Android 2.1. Estoy considerando rootear el teléfono y actualizarlo a 2.2 si es posible, pero quería un dispositivo que se ejecutara en 2.1, por lo que podría ser contraproducente a largo plazo.
** ** actualización
He estado trabajando en esto un poco más, y he descubierto algunos aspectos más desconcertantes a ella.
Arreglé el teléfono e instalé 2.2 y el problema todavía ocurre. Cuando se inicia la aplicación por primera vez, lockCanvas está funcionando como se esperaba (0-1 ms). Luego, en algún momento durante mi inicialización, lockCanvas de repente comienza a tomar aproximadamente 100 ms.
Podría valer la pena señalar que estoy cargando mis activos en una tarea Async, de modo que pueda mostrar una pantalla de carga.
A pesar de mis mejores esfuerzos para determinar qué está haciendo realmente el programa cuando ocurre la lentitud, no pude hacerlo. De hecho, cuando lo ejecuto en modo de depuración y en un solo paso, ¡funciona rápido!
Ahora descubrí que si agrego un retraso en el constructor de mi SurfaceView (de aproximadamente 10 segundos), la lentitud no ocurre y todo funciona bien.
Sin embargo, si presiona Inicio y luego vuelve, la lentitud vuelve.
¡Estoy casi al límite de este estúpido problema ilógico! Tengo la intención de atribuirlo a un problema específico del dispositivo.
Creo que podría tener algo que ver con el uso de la memoria. Tal vez algo se está intercambiando y afecta el video ram?
Me interesarían las teorías al menos.
Describa qué controles * cuando * se produce la representación ... ¿está utilizando un hilo dedicado, o invalida() al final de cada dibujo(), o utiliza un mecanismo de tiempo, o qué? –
I usando un hilo para dibujar (de la misma manera que SpriteMethodTest). Solo bucle mientras es cierto. – Kevin
¿Es posible que se quede atrapado en un gran GC? Quiero decir que estoy de acuerdo en que lockCanvas() no es la llamada más barata, pero no debería demorar tanto.Sin embargo, si se quedara atrapado en un GC durante la llamada durante la espera, la llamada parecería tardar 100 ms más de lo que debería. ¿Tienes un logcat o algunos ejemplos de código? –