2012-04-20 19 views
13

Mi juego usa demasiada batería. No sé exactamente cuánto usa en comparación con juegos comparables, pero usa demasiado. Los jugadores se quejan de que usa mucho, y algunos de ellos señalan que hace que su dispositivo se "caliente". Estoy comenzando a investigar esto y quería formular algunas preguntas teóricas y prácticas para reducir el espacio de búsqueda. Esto se trata principalmente de la versión iOS de mi juego, pero probablemente muchos de los mismos problemas afectan la versión de Android. Perdón por hacer muchas subpreguntas, pero todas parecían estar tan interrelacionadas que pensé que era mejor mantenerlas juntas.cómo medir y mejorar el uso de la batería en el iPhone/iPad (también en Android)

Notas al margen: Mi juego no tiene acceso a la red (llamado en varios lugares como una gran pérdida de batería) y no consume mucha batería en el fondo; es el primer plano el problema.

(1) Sé que hay API para leer el nivel de la batería, por lo que puedo hacer algunas pruebas automáticas. Mi pregunta aquí es: ¿cuánto tiempo (o tal vez: aproximadamente cuánto consumo de batería) necesito para que funcione para obtener una lectura confiable? Por ejemplo, si se ejecuta durante 10 minutos, ¿es eso confiable? Si drena el 10% de la batería, ¿es eso confiable? ¿O es mejor correr más de una hora (o, por ejemplo, ver cuánto tarda la batería en drenar el 50%)? Lo que estoy preguntando aquí es qué tan sensible/confiable es el medidor de la batería, entonces sé cuánto tiempo debe durar cada prueba.

(2) Estoy tratando de comprender cuáles son las posibles causas del uso de batería alta. A continuación, enumero algunos posibles factores. Ayúdenme a entender cuáles son los culpables más probables:

(2a) Como en muchos juegos, mi juego necesita dibujar la pantalla completa en cada fotograma. Funciona a aproximadamente 30 fps. Sé que Apple dice que "solo actualice la pantalla todo lo que necesite", pero necesito dibujar cada fotograma. En realidad, podría poner algo de trabajo en solo dibujar las partes de la pantalla que han cambiado, pero en mi caso esa seguirá siendo la mayor parte de la pantalla. Y en cualquier caso, incluso si puedo localizar el dibujo en solo una parte de la pantalla, todavía estoy haciendo una llamada de buffer de intercambio OpenGL 30 veces por segundo, así que realmente importa que haya trabajado duro para dibujar un poco menos ?

(2b) Al dibujar los elementos de la pantalla, hay una cierta cantidad de matemáticas de coma flotante que continúa (por ejemplo, al calcular las coordenadas UV de textura) y algunas matemáticas de precisión (menos) doble. No sé cuán caras son, en cuanto a la batería, en comparación con las operaciones enteras similares. Probablemente podría almacenar en caché muchos de estos valores para no tener que calcularlos repetidamente, si esa fuera una ganancia probable.

(2c) Hago una cierta cantidad de cambio de textura al renderizar la escena. Anteriormente, solo me había preocupado por hacer que el juego fuera demasiado lento (no es así), pero ahora también me pregunto si la reducción del cambio de textura reduciría el uso de la batería.

(2d) No estoy seguro de si esto sería práctico para mí pero: he estado leyendo acerca de los sombreadores y OpenCL, y quiero entender si descargo parte del procesamiento de la CPU a la GPU, ya sea eso probablemente ahorraría batería (además de correr presumiblemente más rápido para las operaciones de tipo vector). ¿O tal vez usaría aún más batería en la GPU que en la CPU?

Me doy cuenta de que puedo reducir los factores que están en juego al deshabilitar ciertas partes del juego y realizar pruebas de batería iterativas (de ahí la parte (1) de la pregunta). Es solo que la desactivación no es trivial y hay suficientes culpables potenciales que pensé que pediría primero consejo general.

+0

Sé que dijiste que es principalmente la versión ios, pero la versión de Android no tiene anuncios? Incluso si no está utilizando la red explícitamente, ¿hay algo que podría estar usándola en segundo plano? – Michael

+2

Además, si está de acuerdo con leer artículos de investigación [esto] (http://research.microsoft.com/en-us/people/mzh/eurosys-2012.pdf) acaba de salir de una conferencia reciente. Es todo Android, pero tal vez esto te dará una idea de cómo otras personas han hecho mediciones de potencia. – Michael

+0

Michael, gracias por la referencia. He leído el documento y lo voy a ver más de cerca. No parece que la herramienta eprof esté disponible para descargar en este punto. (?) Pero tal vez pueda obtener suficientes ideas del periódico para señalarme en la dirección correcta. En respuesta a su otra pregunta, no, no estoy mostrando anuncios. –

Respuesta

1

Trate de leer este artículo: Android Documents on optimization

Lo que funciona bien para mí, está disminuyendo el uso de la recolección de basura, por ejemplo
cuando programo para una computadora de escritorio, usted está (o estoy) acostumbrado a definir variables dentro de los bucles cuando no son necesarios fuera del ciclo, esto causa un uso masivo de la recolección de basura (y no estoy hablando de primitivo VARs, pero los objetos grandes.

intentan evitar las cosas por el estilo.

+0

Gracias, pero en realidad estoy usando Marmalade, así que mi código está en modo nativo (al menos todo el código que tengo control) por lo que no hay recolección de basura. Y no es un problema con Marmalade, ya que mis otras aplicaciones de Marmalade no tienen este problema. –

1

Un pequeño consejo que realmente me ayudó a conseguir el uso de la batería (y el calor del dispositivo!) hacia abajo era de estrangular FPS en mi costumbre OpenGL motor.

Especialmente mientras la escena es estática (por ejemplo, un juego basado en turnos o la pausa girada por el usuario) acelere FPS. O acelere si el usuario no responde durante más de 10 segundos, como una pantalla er en una pc de escritorio. En el mundo real, los usuarios a menudo se distraen mientras usan dispositivos móviles. No dejes que tu aplicación descargue la batería mientras tu usuario averigua qué estación de metro está;)

También en el iPhone, a veces 60 FPS es el valor predeterminado, estrangular esto manualmente a 30 FPS es apenas visible y te asegura la mitad de los ciclos de gpu (¡y por lo tanto, mucha batería!).

Cuestiones relacionadas