c++ - texturas - ¿Cuál es el punto de una textura SDL2?
sdl c++ (3)
Al crear una textura SDL2 como un tipo de STREAMING, se puede bloquear y desbloquear toda la textura o solo un área de píxeles para realizar operaciones de píxeles directos. Uno debe crear antes una superficie SDL2, y vincular con bloqueo-desbloqueo de la siguiente manera:
SDL_Surface surface = SDL_CreateSurface(..);
SDL_LockTexture(texture, &rect, &surface->pixels, &surface->pitch);
// paint into surface pixels
SDL_UnlockTexture(texture);
La clave es, si dibuja en una textura de mayor tamaño, y el dibujo es incremental (por ejemplo, gráfico de datos en tiempo real), asegúrese de bloquear y desbloquear el área real para actualizar. De lo contrario, las operaciones serán lentas, con una gran cantidad de copias de memoria.
He experimentado un rendimiento razonable y el modelo de uso no es demasiado difícil de entender.
Estoy un poco atascado en la lógica detrás de una textura SDL2. Para mí, son inútiles ya que no puedes atraerlos.
En mi programa, tengo varias superficies (o lo que eran superficies antes de cambiar a SDL2) que acabo de mezclar para formar capas. Ahora, parece que tengo que crear varios renderizadores y texturas para crear el mismo efecto ya que SDL_RenderCopy
toma un puntero de textura.
No solo eso, sino que todos los renderizadores tienen que venir de una ventana, lo que entiendo, pero aún así me enoja un poco más.
Todo esto parece extremadamente voluminoso y lento. ¿Me estoy perdiendo de algo? ¿Hay una manera de dibujar directamente a una textura? ¿Cuál es el punto de las texturas? ¿Estoy seguro de tener múltiples (si no cientos) de renderizadores en lugar de lo que eran las superficies?
En SDL2 es posible renderizar fuera de pantalla / renderizar directamente a una textura. La función a utilizar es:
int SDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture);
Esto solo funciona si el procesador habilita SDL_RENDERER_TARGETTEXTURE.
SDL_Texture
objetos SDL_Texture
se almacenan lo más cerca posible de la memoria de la tarjeta de video y, por lo tanto, su GPU puede acelerarlos fácilmente. El aumento de tamaño, la mezcla alfa, el suavizado y casi cualquier operación de cómputo pesado pueden verse afectadas por este aumento de rendimiento. Si su programa necesita ejecutar una lógica por píxel en sus texturas, le recomendamos que convierta sus texturas en superficies temporalmente. Lograr una solución alternativa con texturas de transmisión también es posible.
Edit : Ya que esta respuesta recibe bastante atención, me gustaría elaborar mi sugerencia.
Si prefiere usar el flujo de trabajo Texture -> Surface -> Texture
para aplicar su operación por píxel, asegúrese de almacenar en caché su textura final a menos que necesite volver a calcularla en cada ciclo de renderizado. Las texturas en esta solución se crean con el indicador SDL_TEXTUREACCESS_STATIC
.
Las texturas de transmisión (la bandera de creación es SDL_TEXTUREACCESS_STREAMING
) se recomiendan para casos de uso donde la fuente de los datos de píxeles es una red, un dispositivo, un frameserver o alguna otra fuente que está fuera del alcance de las aplicaciones SDL y cuando es evidente que el almacenamiento en caché de los marcos de la fuente es Ineficiente o no funcionaría.
Es posible representar sobre texturas si se crean con el SDL_TEXTUREACCESS_TARGET
. Esto limita el origen de la operación de dibujo a otras texturas, aunque esto podría ser lo que necesitabas en primer lugar. "Las texturas como objetivos de renderizado" es una de las características más nuevas y menos ampliamente compatibles de SDL2.
Información de nerd para lectores curiosos:
Debido a la naturaleza de la implementación de SDL, los dos primeros métodos dependen de las operaciones de lectura y copia a nivel de la aplicación, aunque están optimizados para los escenarios sugeridos y lo suficientemente rápidos para las aplicaciones en tiempo real.
Copiar datos desde el nivel de la aplicación es casi siempre lento en comparación con el procesamiento posterior en GPU. Si sus requisitos son más estrictos de lo que SDL puede proporcionar y su lógica no depende de algún origen de datos de píxeles externos, sería sensato asignar texturas OpenGL sin procesar pintadas de sus superficies SDL y aplicarles sombreadores (lógica GPU).
Los sombreadores están escritos en GLSL, un lenguaje que se compila en el ensamblaje de GPU. La aceleración de hardware / GPU en realidad se refiere al código paralelizado en los núcleos de GPU y el uso de sombreadores es la forma preferida de lograrlo con fines de representación.
¡Atención! El uso de texturas y sombreadores de OpenGL sin procesar junto con las funciones y estructuras de representación de SDL puede causar algunos conflictos inesperados o la pérdida de flexibilidad proporcionada por la biblioteca.
TLDR; Es más rápido renderizar y operar en texturas que en superficies, aunque modificarlas a veces puede ser complicado.