06 marzo, 2015

Blitting

En la próxima sesión de live coding voy a ocuparme de construir la pantalla del emulador. Para ello va a ser necesario manipular pixels en SDL. En SDL2, la forma preferente de gestionar una ventana es con aceleración de hardware. Esto implica que las texturas se ubiquen en GPU y sea la GPU quien dibuje, no la CPU. Esto es un bache a la hora de manipular los píxeles, que es exactamente lo que necesita nuestro emulador, ya que a las texturas no les gusta que las manipulen directamente como podríamos hacer con una Surface en SDL1.

En SDL 2 tenemos texturas de tipo streaming. Estas texturas están pensadas para ser usadas en situaciones donde pueda cambiar la textura frecuentemente, incluso cada fotograma. Por medio de la función SDL_LockTexture luego puedo bloquear la textura. Todo lo que hago es pedirle a SDL_LockTexture que me pase la textura a una SDL_Surface y luego manipulo los pixels de esa textura. Cuando he terminado, invoco a SDL_UnlockTexture para desbloquearla. Este proceso se repite 60 veces por segundo. El resultado es este:


Estoy limitando la ejecución a 60 segundos por medio de SDL_WaitEventTimeout. Podría usar SDL_PollEvent pero he comprobado que así el consumo de CPU se dispara al 100% ya que PollEvent no es bloqueante, como sí es SDL_WaitEventTimeout, lo que reduce mucho el consumo de CPU, algo muy importante en ordenadores portátiles y móviles.

El código, un poco sucio, se puede ver aquí, https://gist.github.com/danirod/4008bf7aab2f8b2466d5.

No hay comentarios:

Publicar un comentario