Extraños problemas de tartamudez que no puedo deshacerse de (fuente completa incluida)
Basé mi juego en el ejemplo lunarlander y he estado teniendo problemas tartamudos desde que empecé a hacerlo. Nada de lo que he intentado se ha librado de ellos así que he llegado al punto en el que he pasado unas horas creando una versión despojada del ejemplo lunarlander, y poner una imagen de desplazamiento simple para mostrar la tartamudez. NOTA: no está relacionado con el recolector de basura. Si usted piensa que es, basta con mirar el registro, el recolector de basura se ejecuta en ningún lugar tan cerca como el tartamudeo aparece.
La imagen que se desplaza hacia abajo de la pantalla tartamudea aproximadamente cada segundo durante aproximadamente 1/10 de segundo en mi teléfono (Motorola Milestone, 2.2). Este tipo de tartamudeo no destruye completamente completamente el juego, pero es muy distractivo y frustrante. Mi juego también implica un montón de desplazamiento rápido y movimientos rápidos por lo que es generalmente más obvio allí.
- Android sqlite lee todas las filas a la vez
- Concate JSONArray
- JSONException: No hay valor para id
- Patrón de bloqueo de múltiples hilos de SQLiteDatabase
- Instalación de Pocketsphinx en Android
Si alguno de ustedes tiene el tiempo podría echar un vistazo rápido a este proyecto de eclipse y ver si:
- Se tartamudea para ti en tu teléfono (mira de cerca como se desplaza, tiene un pequeño enganche cada medio segundo a segundo y medio)
- Si puedes ver alguna manera de arreglar la tartamudez
Estoy esperando simplemente tener una línea retardada de código que está causando todo esto sin que me diera cuenta. Simplemente no puedo creer que, incluso después de despojar a cabo este mucho todavía tiene la misma cantidad exacta de tartamudeo como mi juego completo con 1000 objetos, sobre todo porque se ejecuta en un sólido 60fps en mi teléfono.
EDIT: Han perfilado mi juego en Traceview, parece bien.
Enlace de descarga de la fuente: http://dl.dropbox.com/u/4972001/LunarLander.rar
- AsyncTask.executeOnExecutor () antes de API Nivel 11
- Android Actualiza ListActivity desde BaseAdapter
- Diferentes fling (swipe) de velocidad en diferentes dispositivos Android con la misma densidad
- ¿Es esta una forma válida de mantener una referencia estática y Actividad / Contexto? ¿Por qué no debo hacer esto?
- 1000 * 60 * 60 * 24 * 30 resultados en un número negativo
- Creación de una función personalizada en sqlite3 en android
- Error: Error de ejecución de la tarea ': app: dexDebug'. Terminado con valor de salida no cero 2 con Facebook Fresco
- ¿Se programará un temporizador en Android para ejecutar cada segundo trabajo durante un salto segundo?
Lo probé en mi teléfono (nexo uno), era lo mismo para mí.
Hice algunos cambios que lo hicieron mejor para mí:
-
En lugar de declarar nuevas variables cada vez durante el bucle, declaré las propiedades as de la clase
Lona c = nulo; // se convierte
Lienzo privado c;
// en el bucle ahora solo usa
C = nulo
Haga esto para todas las variables que declara una y otra vez en la función doDraw y updatePhysics.
-
En vez de aumentar el viewY hasta que para siempre, acabo de poner un poco si statemant
If (viewY> mCanvasHeight) {
viewY -= mCanvasHeight;
}
No estoy seguro de si está funcionando 100% ahora, pero parece mucho mejor para mí.
Suena como su desplazamiento genera mucha basura que debe recopilarse con frecuencia. Si está creando muchos objetos a corto plazo, considere administrar su propia piscina. Siempre y cuando no dejes que la piscina crezca sin límites, esto puede reducir en gran medida el gc preempting su tiempo.
Lo probé en un DroidX de Verizon (2.2.1) y parece que cada 3-6 segundos y MUY breve. Parece un poco mejor con el fondo de pantalla activo y nada más corriendo. Tal vez el subsistema de gráficos simplemente no puede mantenerse al día? ¿Ha intentado una imagen menos intensiva de gráficos (menos píxeles y menos colores) sólo para ver qué hace?
Estás dibujando tres enormes mapas de bits de fondo por marco … eso es más trabajo de lo que necesitas hacer. Puede ser mejor utilizar un BitmapShader
con TileMode establecido para repetir. Entonces es sólo una llamada a la capa nativa.
Añada una Paint paint;
setSurfaceSize()
alguna parte y cambiar su setSurfaceSize()
para incluir las líneas siguientes:
BitmapShader shader = new BitmapShader(mBackgroundImage, TileMode.CLAMP, TileMode.REPEAT); paint = new Paint(); paint.setShader(shader);
Entonces doDraw()
sólo tiene que ser esto:
//translate to viewY position canvas.translate(0,(float)(-viewY)); //draw backgrounds canvas.drawPaint(paint);
En realidad no he medido esto para demostrar que es más rápido, pero por lo que sé acerca de las API gráficas que sin duda debería ser.
(Por supuesto si realmente quieres volar debes usar OpenGL ES …)
- ¿Cómo puedo obtener puntos de interrupción (y ver números de línea de error) al depurar JavaScript en Android?
- Cómo mostrar la barra de escala de mapa en el mapa android v2