2012-03-30 15 views
5

Realizo una aplicación para el iPhone en 3D que utiliza muchas vallas publicitarias. Mi frame buffer es dos veces más grande en la pantalla retina porque quiero aumentar su calidad en iPhone 4. El problema es que los sombreadores de fragmentos consumen mucho más tiempo debido al tamaño del framebuffer. ¿Hay alguna manera de administrar la pantalla retina y las texturas de alta definición sin aumentar la precisión del sombreado?Optimización del sombreado para la pantalla retina en iOS

Respuesta

9

Si renderiza con un framebuffer a la resolución completa de la pantalla Retina, tendrá cuatro veces más píxeles que raster en comparación con la misma área física de una pantalla que no sea Retina. Si está limitado a la velocidad de relleno debido a la complejidad de sus sombreadores, esto hará que cada cuadro tarde más tiempo en renderizarse.

En primer lugar, querrá verificar que está realmente limitado por la parte de procesamiento de fragmentos de la canalización de procesamiento. Ejecute el instrumento OpenGL ES Driver contra su aplicación y mire las estadísticas de Tiler y Utilización de Render. Si la utilización del procesador está cerca del 100%, eso indica que está limitado por los sombreadores de fragmentos y su capacidad general de empujar píxeles. Sin embargo, si ve su porcentaje de utilización de solador allí arriba, eso significa que tiene una geometría limitada y los cambios en la resolución de la pantalla no afectarán el rendimiento tanto como la reducción de la complejidad y el tamaño de sus datos de vértice.

Suponiendo que esté limitado por los sombreadores de fragmentos, hay algunas cosas que puede hacer para mejorar significativamente el rendimiento en las GPU de iOS.

En su caso, parece que el tamaño de la textura podría ser un problema. Lo primero que haría sería usar texturas PowerVR Texture Compressed (PVRTC) en lugar de fuentes de mapa de bits estándar. Las texturas PVRTC se almacenan en un formato comprimido en la memoria, y pueden ser mucho más pequeñas que los mapas de bits equivalentes. Esto podría permitir un acceso mucho más rápido al aumentar los hits de caché en las lecturas de texturas.

Haga que sus texturas tengan una potencia de dos, y habilite los mipmaps. He visto que los mipmaps realmente ayudan a texturas más grandes que a menudo se encogen para aparecer en objetos más pequeños. Esto definitivamente suena como el caso de su aplicación que podría necesitar dispositivos Retina y no Retina.

Evite las lecturas de textura dependientes en los sombreadores de fragmentos como la plaga. Cualquier cosa que realice un cálculo para determinar una coordenada de textura, o cualquier textura que aparezca dentro de una declaración de ramificación, desencadena una lectura de textura dependiente que puede ser más de un orden de magnitud más lenta en las GPU de iOS. Durante las lecturas de textura normales, las GPU PowerVR pueden leer un poco antes que los valores de textura, pero si utiliza una lectura de textura dependiente, puede perder esa optimización.

Podría continuar sobre varias optimizaciones (usando lowp o mediump precision en lugar de highp cuando sea apropiado, etc.), tengo had a little help in this area myself, pero estas parecen ser las primeras cosas en las que me enfocaría. Finalmente, también puede intentar ejecutar sus sombreadores a través del PowerVR's profiling editor, que le puede dar estimaciones de tiempo de ciclo para el mejor y el peor de los casos de estos sombreadores.

Los dispositivos de visualización Retina no son ni siquiera los peores ofensores en lo que respecta a las limitaciones del sombreador de fragmentos. Intente obtener algo de renderizado en la pantalla completa del iPad 1 para que funcione, porque tiene más píxeles que el iPhone 4/4S, pero una GPU mucho más lenta que el iPad 2/3 o iPhone 4S. Si puede ejecutar algo bien en el iPad 1, será bueno en todo lo demás (incluso en el iPad Retina).

+0

Gracias por todas estas precisiones. La utilización del procesador es aproximadamente 99% y Tiler aproximadamente 5%. Creo que el mipmapping no mejorará las actuaciones porque la mayoría de mis vallas publicitarias se muestran como sprites 2D (las texturas no están escaladas). Probaré el editor de perfiles de PowerVR y probaré mi aplicación en un iPad 1. – Klem

+0

Gracias Brad. He estado codificando sombreadores como locos durante los últimos 6 meses y cuando aprendí a modificar las coordenadas de la textura fue como encender una luz en mi cerebro. Pero últimamente me he estado preguntando si es mejor leer dos texturas diferentes o colocar la base y los mapas normales en una sola textura. Cual es mas rápido. La guía de mejores prácticas de Apple para shaders implica que si la modificación de texcoord se hace en el sombreador de vértices, no es una lectura de textura dependiente. Voy a probar eso para ver si la renderización de iphone4 se acelera. Y tal vez probar diferentes mapas también. – badweasel

Cuestiones relacionadas