2012-10-02 39 views
12

Estoy haciendo una aplicación de cámara y esta aplicación proporcionará algunos filtros a los usuarios. Actualmente mi código está en NDK y funciona bien, sin embargo, quiero hacerlo un poco más rápido. Parece que GPU y OpenGL Es 2.0 es el camino a seguir. Mi única preocupación con GPU es su limitación de memoria. Dado que las cámaras modernas toman imágenes de 5-10 mp mientras que la limitación de la memoria de la GPU es mucho menor que eso. Me preguntaba si hay una forma de evitar esa limitación. La única opción lógica que me parece es dividir la parte más pequeña de la imagen y luego procesarla en la GPU y finalmente ensamblarlas en la imagen final. Mi pregunta es, si este enfoque aún sería bueno para el rendimiento y también hay alguna otra opción para el procesamiento de imágenes de alta resolución en GPU móviles.¿Cómo manejar la limitación de memoria de la GPU para el procesamiento de imágenes de alta resolución en la GPU?

Editar: Tengo que aclarar que quiero usar la GPU para el procesamiento de imágenes, así que mi objetivo no es presentar resultados en la pantalla. Lo renderizaré a otra textura y lo guardaré en el disco.

+1

Realmente depende de lo que estás tratando de hacer. La ventaja que ofrecen las GPU es que son muy paralelas, pero no todos los problemas se pueden facilitar simplemente arrojando más núcleos hacia ellos. – thecoshman

+0

Quería obtener una solución general a un problema general, sin embargo actualmente estoy tratando de codificar "pirámide laplaciana", que es muy costosa cuando se hace en la CPU. – dirhem

+0

bueno, si está haciendo algo así como aplicar un tinte a una imagen, donde desea aplicar la misma operación a todos los bits, entonces la carga a la GPU es una solución obvia. tareas como difuminar una imagen son un poco más complicadas, ya que cada nuevo valor de píxeles depende de un rango de píxeles. Sin embargo, en su caso, debe tener en cuenta que existen muchas diferencias entre el hardware, como la cantidad de ram que admiten, la textura grande y la cantidad de datos que puede enviarles. Es posible que ni siquiera puedan hacer el procesamiento de estilo OpenCL. – thecoshman

Respuesta

2

Su idea de mosaico se ha utilizado desde el Nintendo Entertainment System, que tiene un Ricoh 2A03 a 1,79 MHz, por lo que es un buen enfoque. Google usa el mosaico para administrar las visualizaciones de mapas, e incluso juegos como Crysis tienden a limitar el tamaño de sus texturas de la mayoría de sus texturas a algo así como 1024x1024 (1 megapíxel). Y sí, 10 megapíxeles requiere 30 megas de RAM, por lo que algunos dispositivos pueden tener problemas, especialmente si se utiliza una fuente y una textura de destino, lo que significa que se requieren 60 megas de RAM.

Solo tenga en cuenta que los tamaños de textura tienden a usar una potencia de 2 (2, 4, 8, 16, 32, 64, etc.). A veces obtendrás una mejor calidad, al menos si la recortas y la realizas.

2

No necesita aplicar filtros en tiempo real en imágenes de 10 mp ... porque no hay tales pantallas (o tal vez las hay pero no son de uso popular entre nosotros). :)

Así que solo necesita aplicar filtros en los píxeles que se muestran (1900x1280?). La técnica de mosaico que mencionó aún será útil con algunos escenarios. La representación diferida es un ejemplo. X-Box 360 empleó ambas técnicas (mosaico con diferido) diariamente. Sin mosaico, no sería posible debido a los altos requisitos de memoria para la técnica diferida.

+0

He editado la pregunta para aclarar que no usaré gpu para renderizar imágenes en la pantalla. No tengo nada que ver con la pantalla y su resolución. El procesamiento de la imagen se realizará en segundo plano y la pantalla solo mostrará una barra de progreso. Entonces, la limitación de la memoria de la GPU todavía está ahí para mí. – dirhem

Cuestiones relacionadas