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í.

Si alguno de ustedes tiene el tiempo podría echar un vistazo rápido a este proyecto de eclipse y ver si:

  1. 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)
  2. 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

Lo probé en mi teléfono (nexo uno), era lo mismo para mí.

Hice algunos cambios que lo hicieron mejor para mí:

  1. 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.

  1. 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 …)

  • Grabación de audio no para archivo en Android
  • Eclipse deja de resaltar las referencias después de un tiempo
  • Clase de llamada en ButtonClick (Android)
  • Openssl no se reconoce como un comando interno o externo
  • Ejecución de pruebas de Junit de Android desde la línea de comandos
  • EXCEPCIÓN FATAL: main java.lang.NoClassDefFoundError: com.google.analytics.tracking.android.EasyTracker
  • Android- Java.io.Exception: contenido Error de longitud Esperado x cantidad de memeory cantidad conseguida y
  • ¿Cómo autenticar la solicitud de POST de usuario de Android con Django REST API?
  • Android - Pasar un conjunto de clases entre actividades
  • Obtener la URL de descarga para el vídeo de YouTube (Android / Java)
  • No hay ningún menú Ejecutar o botón de barra de herramientas en Eclipse Juno
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.