Estoy teniendo una interesantíma conversación con na_th_an vía correo electrónico tratando un tema concreto de SPLIB2, que es el cómo funciona internamente. En esta conversación, na_th_an me apunta:
na_th_an escribió:(SPlib2) se maneja sobre un buffer orientado a tiles de 8x8 y aparte están los sprites. Se tiene una rejilla. Para cada casilla se almacena el número de tile de fondo. Bien a mano, bien como resultado de mover un sprite, las casillas que se "invaliden" serán redibujadas en VRAM en la próxima llamada a sp_UpdateAll(). Lo que hace entonces es usar un buffer donde, por orden, vuelca el tile de fondo y renderiza todos los trozos de sprites que caigan en la casilla invalidada, y luego la copia este buffer a VRAM en la posición correcta.
¿Qué significa esto? Que un sprite sólo puede moverse sobre un fondo "tile" escrito en el buffer de splib2 con sp_PrintAtInv o sp_PrintAt. Cualquier cosa que pintemos nosotros por nuestra cuenta en VRAM será ignorada en el próximo sp_UpdateAll.
Esto me ha llevado a plantearme una pregunta:
- ¿Es habitual en el Spectrum el usar buffers de memoria intermedios, del mismo tamaño que la VRAM, donde trabajar y que luego se vuelquen a VRAM, o no era una práctica usada por los programadores?
Está claro que la principal desventaja es el consumo de casi 7KB de RAM para dicho buffer, además de que se "escribe" 2 veces: una sobre el buffer más luego el volcado a la VRAM.
Las ventajas también son obvias: como se escribe en un buffer intermedio, no hay parpadeos al borrar o dibujar sprites, y tan sólo tenemos que sincronizarnos con el haz de electrones para hacer un LDIR que vuelque todo el buffer rápidamente.
Teniendo en cuenta que nunca he hecho en el Spectrum un juego que requiera movimiento fluido, es decir, que jamás he tenido que enfrentarme a contar t-stados y organizar el orden en que imprimo los sprites para que no haya parpadeos, etc... preguntas que me surgen:
- ¿Es el LDIR lo bastante rápido para copiar los 7KB de memoria desde el buffer intermedio a la VRAM antes de que el haz de electrones pase por encima y tal? (Es decir, salen las cuentas de la copia para que no haya parpadeos?)
- ¿Conocéis juegos comerciales que usaran esta técnica, o para ahorrar memoria todos pintaban encima de la pantalla aprovechando lo más posible los t-stados del tiempo de dibujado del borde o cosas similares?
- ¿Qué pensáis de esa "técnica"?
saludos