2011-12-21 17 views
6

Actualmente estoy desarrollando un proyecto con SDL. Básicamente dibuja y mueve imágenes (superficies) en la pantalla.¿Cuál es la forma más rápida de borrar un bloque de memoria (o una superficie SDL)?

Para mover una imagen sin dejar un rastro, primero debe limpiar la superficie pantalla, más o menos como glClear(), y actualmente lo estoy haciendo con un sencillo para la iteración del bucle sobre los píxeles de la superficie (también dibujo una caja negra en la superficie o memset).

Si bien las soluciones anteriores funcionan bien para superficies pequeñas, cada vez son más lentas a medida que la superficie crece, así que estaba buscando la forma más rápida de borrar (cero) un bloque de memoria.

Además, un amigo señaló que el uso de instrucciones SIMD podría hacer el trabajo muy rápido, pero la última vez que hice ASM fue en un 8085, cualquier idea sobre esto también podría ser útil.

Respuesta

13

La manera más rápida es usar memset.

memset(ptr, 0, length); 

Este utiliza automáticamente en arquitecturas SIMD que lo apoyan *. No vas a vencerlo. Ya está vinculado a la memoria, por lo que está escribiendo ceros tan rápido como el procesador pueda escupirlos. No sé quién le dijo que memset es más lento para bloques más grandes, pero debe dejar de escuchar a esa persona.

* Hay algunas cadenas de herramientas que no le dan un rápido memset. Es poco probable que estés usando uno.

+1

En realidad, solo se aplica a las funciones SDL, no probé completamente memset. <* Hay algunas cadenas de herramientas que no le dan un memset rápido> Algunas cadenas de herramientas MCU PIC, por ejemplo (obviamente no es el caso) – NeonMan

+0

Bueno, es un poco extraño ejecutar SDL en un microcontrolador PIC, después de todo, y PIC no tiene SIMD. –

+0

YMMV. Mi experiencia es que memset suele ser bastante lento. Los que he visto en la fuente solo hacen conjuntos de bytes. He tenido un gran éxito al escribir el mío que (para áreas más grandes) usa escrituras más grandes para las secciones del medio (simplemente usando escrituras pequeñas en los extremos según sea necesario). –

3

Debe probar memset, la implementación debe ser altamente optimizada para aprovechar las instrucciones disponibles en su sistema.

Cuestiones relacionadas