doble buffer

Programando el Amstrad en Ensamblador.
Reglas del Foro
Debido a que hay varios temas pidiendo ayuda para programar en ensamblador máquinas distintas al Amstrad CPC, con micro distinto al Z80 y que incluso dependen del sistema operativo, nos vemos en la necesidad de poner por escrito que estos posts son bienvenidos pero que no es el lugar adecuado ya que por estos lares nos dedicamos más al ensamblador del Z80, un microprocesador de 8 bits que tuvo su gran auge en ordenadores y consolas de los años 80.

De todas formas, esto no quita que alguien que sepa del asunto pueda postear alguna respuesta pero es más fácil encontrar foros dedicados a programar en ensamblador en Windows o MS-DOS que ayudarán más que nosotros:
http://www.lawebdelprogramador.com/news ... nsamblador
Avatar de Usuario
Fran123
Me voy lanzando
Me voy lanzando
Mensajes: 74
Registrado: Lun 24 Feb , 2020 2:44 pm

doble buffer

Mensajepor Fran123 » Mar 20 Abr , 2021 8:11 pm

Hola

Estoy haciendo pruebas con doble búfer ya que sin el obtengo parpadeos, y pensaba que aplicándolo doble búfer eliminaría el problema. Pero no :(

Lo que estoy haciendo es lo siguiente:

Código: Seleccionar todo

loop:
SetPaginaVisible PAGINA_1 ; macro, se visualiza a partir de c000

; borrar sprite anterior
ld de, #8000 ; destino cuadro a borrar
BorrarSprite ANCHO, ALTO ; macro que pinta un cuadro de color del fondo

; pintar el sprite
ld de, #8000 ; destino del sprite
ld hl, sprite
PrintSprite ANCHO, ALTO ; macro que situa el sprite en la dir. de mem. indicada por DE

SetPaginaVisible PAGINA_2 ; macro, se visualiza a partir de la dir. mem. #8000

; borrar sprite anterior que no se ve
ld de, #c000
BorrarSprite BOB_SPR_ANCHO, BOB_SPR_ALTO

; pintar el sprite
ld de, #c000
ld hl, sprite
PrintSprite ANCHO, ALTO

jp loop
¿qué estoy haciendo mal?

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: doble buffer

Mensajepor Artaburu » Mar 20 Abr , 2021 9:30 pm

Pues parece que lo tienes ok, el concepto es ese. ¿Estás cambiando bien la página? Sin ver el código del cambio de página o es eso, o la rutina de dibujado no va bien y como tercera opción, ¿tienes las interrupciones desactivadas o redirigidas?
Salu2,
Arta

Avatar de Usuario
Fran123
Me voy lanzando
Me voy lanzando
Mensajes: 74
Registrado: Lun 24 Feb , 2020 2:44 pm

Re: doble buffer

Mensajepor Fran123 » Mié 21 Abr , 2021 8:44 am

Supongo que las rutinas están bien. Si después "SetPaginaVisible PAGINA_2" pongo HALT se ve el sprite.
Si HALT lo pongo antes de "SetPaginaVisible PAGINA_2" no se ve nada, por lo que supongo que las funciones de poner el sprite y cambiar de pantalla funcionan correctamente.

Avatar de Usuario
Fran123
Me voy lanzando
Me voy lanzando
Mensajes: 74
Registrado: Lun 24 Feb , 2020 2:44 pm

Re: doble buffer

Mensajepor Fran123 » Jue 22 Abr , 2021 10:05 am

la función para cambiar la página es esta:

Código: Seleccionar todo

;; IN
;; A - #00|#10|#20|#30 --> #0000|#4000|#8000|#C0000
set_video_page:
ld bc, #BC0C
out (c), c
inc b
out (c), a
ret

Avatar de Usuario
Fran123
Me voy lanzando
Me voy lanzando
Mensajes: 74
Registrado: Lun 24 Feb , 2020 2:44 pm

Re: doble buffer

Mensajepor Fran123 » Jue 22 Abr , 2021 12:46 pm

interrupciones desactivadas (DI) y ya he probado con varias rutinas de borrado y dibujado (además siempre son invocadas con los mismos valores)
Pues parece que lo tienes ok, el concepto es ese. ¿Estás cambiando bien la página? Sin ver el código del cambio de página o es eso, o la rutina de dibujado no va bien y como tercera opción, ¿tienes las interrupciones desactivadas o redirigidas?

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: doble buffer

Mensajepor Artaburu » Jue 22 Abr , 2021 1:54 pm

Entonces será que pintas y cambias de pantalla muy rápido y no das tiempo a refrescar el frame.
Prueba a sincronizar con el refresco antes de cambiar de pantalla.
Salu2,
Arta

Avatar de Usuario
Fran123
Me voy lanzando
Me voy lanzando
Mensajes: 74
Registrado: Lun 24 Feb , 2020 2:44 pm

Re: doble buffer

Mensajepor Fran123 » Jue 22 Abr , 2021 2:15 pm

se ralentiza demasiado :(
Entonces será que pintas y cambias de pantalla muy rápido y no das tiempo a refrescar el frame.
Prueba a sincronizar con el refresco antes de cambiar de pantalla.

Avatar de Usuario
MoteroV4
Forero habitual
Forero habitual
Mensajes: 106
Registrado: Jue 02 May , 2019 9:26 pm

Re: doble buffer

Mensajepor MoteroV4 » Mar 27 Abr , 2021 4:07 pm

se ralentiza demasiado :(
En YT Fran Gallego tiene videos explicando el doble búfer, como este:
https://youtu.be/apicLvgaqNc

Avatar de Usuario
Fran123
Me voy lanzando
Me voy lanzando
Mensajes: 74
Registrado: Lun 24 Feb , 2020 2:44 pm

Re: doble buffer

Mensajepor Fran123 » Mar 27 Abr , 2021 6:29 pm

se ralentiza demasiado :(
En YT Fran Gallego tiene videos explicando el doble búfer, como este:
https://youtu.be/apicLvgaqNc
Lo he visto, y no me soluciona nada. Sólo muevo un personaje y la sensación es de lentitud. En el código solo recojo las pulsaciones de teclas, borrado de sprite anterior y pintado de sprite, y las rutinas están optimizadas.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8420
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: doble buffer

Mensajepor Artaburu » Mar 27 Abr , 2021 7:43 pm

cuelga todo el código y lo vemos porque solo con fragmentos no se ve donde está el problema. Yo estoy usando esa técnica y te puedo decir que va como un tiro.
Salu2,
Arta

Avatar de Usuario
MoteroV4
Forero habitual
Forero habitual
Mensajes: 106
Registrado: Jue 02 May , 2019 9:26 pm

Re: doble buffer

Mensajepor MoteroV4 » Mar 27 Abr , 2021 7:46 pm


Lo he visto, y no me soluciona nada. Sólo muevo un personaje y la sensación es de lentitud. En el código solo recojo las pulsaciones de teclas, borrado de sprite anterior y pintado de sprite, y las rutinas están optimizadas.
Hay otro video del Profe más detallado de la teoría, de años anteriores. Quizás tengas un problema de "coherencia temporal" al aplicarlo, como él lo denomina.

https://youtu.be/T2u6223FrHU

Avatar de Usuario
Fran123
Me voy lanzando
Me voy lanzando
Mensajes: 74
Registrado: Lun 24 Feb , 2020 2:44 pm

Re: doble buffer

Mensajepor Fran123 » Mié 28 Abr , 2021 9:24 pm

Hola

La diferencia entre lo que cuenta Fran Gallego y lo que estoy haciendo es que yo no espero al VSync. Consideraba que en el momento en el que cambiaba la página a visualizar, el raster empezaría a visualizar esa página aunque fuera empezando por la mitad. Y al parecer no es así.
Ahora mismo, con el código que tengo, por cada pasada de pantalla se ejecuta de 5 a 6 veces el bucle del juego, de ahí la sensación de lentitud.

Avatar de Usuario
MoteroV4
Forero habitual
Forero habitual
Mensajes: 106
Registrado: Jue 02 May , 2019 9:26 pm

Re: doble buffer

Mensajepor MoteroV4 » Jue 29 Abr , 2021 9:23 pm

La diferencia entre lo que cuenta Fran Gallego y lo que estoy haciendo es que yo no espero al VSync.
Creo que ese es un problema, el no sincronizar la conmutación de bancos VRAM con el VSYNC. El raster del monitor va a su bola imprimiendo en pantalla desde la dirección de inicio del banco que tú le digas, antes de que empiece su fotograma de 20mseg .


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic