pentacour
|
|
« : 08 de Julio de 2014, 04:04:30 pm » |
|
Desarrollando Náyade he prestado mucha antención a los accesos a memoria, para minimizarlos lo máximo posible en operaciones que se repiten mucho, como la colisión de cada disparo con cada enemigo, nave con cada enemigo, etc. Se trata de encontrar un buen balance entre velocidad y espacio: usar funciones con sus parámetros y sus accesos a RAM o si esas funciones son cortas, duplicarlas con los parámetros fijos y convertirlas en macros. Bueno, no descubro nada nuevo. Pero veo situaciones como al escribir a VRAM en que no se puede asumir que los puertos 98 y 99 sean para todos los MSX, en que se podría consultar el valor, modificar la rutina al inicio y así ya no hay que consultarlo cada vez. Y a partir de aquí se me ocurren un montón de "bizarradas" para rascar algún acceso a memoria. Mi pregunta es: ¿Es una práctica habitual? Konami por ejemplo, ¿lo solía hacer? A cada uno nos atrae un motivo para programar para MSX. A mi me hace gracia hacerlo dentro de las limitaciones/costumbres de la época (con todas las comillas que queráis, porque ahora tengo emulador, debugger, etc). Es obvio que debería copiar a RAM la rutina. Pues eso, ¿es una prática habitual? ¿Lo usáis los developers? ¿Se usaba? Edición: Sí, he quitado el offtopic
|
|
« Última modificación: 08 de Julio de 2014, 06:27:42 pm por pentacour »
|
En línea
|
|
|
|
MsxKun
|
|
« Respuesta #1 : 08 de Julio de 2014, 07:13:53 pm » |
|
Pero veo situaciones como al escribir a VRAM en que no se puede asumir que los puertos 98 y 99 sean para todos los MSX, en que se podría consultar el valor, modificar la rutina al inicio y así ya no hay que consultarlo cada vez. Y a partir de aquí se me ocurren un montón de "bizarradas" para rascar algún acceso a memoria.
Xasto. Si no usas la BIOS por lenta, la forma correcta entonces es consultar los puertos en las posiciones 6 y 7 de la BIOS. Mi pregunta es: ¿Es una práctica habitual? Konami por ejemplo, ¿lo solía hacer? A cada uno nos atrae un motivo para programar para MSX. A mi me hace gracia hacerlo dentro de las limitaciones/costumbres de la época (con todas las comillas que queráis, porque ahora tengo emulador, debugger, etc).
Pues tengo bastante entendido que Konami no se calentaba tanto y que, de hecho, hacia marranadas varias. A dia de hoy, teniendo la info, se puede hacer mejor. Los japos, en general, no eran de virguerias tecnicas, sino de solventar todo eso via diseño. Es obvio que debería copiar a RAM la rutina. Pues eso, ¿es una prática habitual? ¿Lo usáis los developers? ¿Se usaba?
Se habra usado, seguro. Yo personalmente procuro leer el numero de puerto en la BIOS <ld a,(7)>, y lo paso al registro c <ld c,a> antes de "outear" Sin automodificable, vaya. No suelo ir tan apurado como para tener que afinar tanto. Normalmente si necesitas ir tan apretado es que algo falla en el diseño del juego. Pero que poder hacerse, desde luego, y sera correcto.
|
|
|
En línea
|
-- She Bops!
|
|
|
pentacour
|
|
« Respuesta #2 : 08 de Julio de 2014, 08:01:39 pm » |
|
Yo personalmente procuro leer el numero de puerto en la BIOS <ld a,(7)>, y lo paso al registro c <ld c,a> antes de "outear" Sin automodificable, vaya. No suelo ir tan apurado como para tener que afinar tanto. Normalmente si necesitas ir tan apretado es que algo falla en el diseño del juego. Ok, así lo hago. Respecto al diseño, pues seguro que es mejorable. Pero me refiero a que si con "el diseño perfecto" muevo n elementos en pantalla, y haciendo tres apaños así consigo mover n+x elementos, pues mejor, independientemente del diseño Pero no me he puesto a medir exactamente el tiempo que ocupo entre interrupciones y el que me queda libre (porque no se hacerlo con exactitud básicamente). Entonces no se si estos apaños tampoco darían para mucho. Por eso preguntaba si es una práctica habitual, en cuyo caso supongo que sí se gana, o no lo es tanto por lo que creo entender.
|
|
|
En línea
|
|
|
|
Mortimer
|
|
« Respuesta #3 : 08 de Julio de 2014, 09:31:11 pm » |
|
Redondeando y en el peor de los casos (Estar en una máquina a 60Hz) cada interrupción son 59500 ciclos, así que normalmente unos cuantos "LD A,[0007h]; LD C,A" que si no me equivoco contando suponen sólo 11 ciclos más que un "LD C,98h" no deberían de marcar mucha diferencia. Yo tengo algunas rutinas en RAM a las que les hago un parcheo, pero principalmente porque estaban ya en RAM por razones de espacio, no las puse en RAM sólo para poder parchearlas.
Para ver como vas de tiempo, el truco más sencillo y visual creo que es cambiar el color del borde, ya que cambiar ese registro en el vdp hace que inmediatamente el borde empiece a dibujarse en el color indicado. Así que incluso le puedes poner incluso a cada rutina un color distinto y tienes una visual de cómo van los tiempos en el borde.
|
|
|
En línea
|
|
|
|
MsxKun
|
|
« Respuesta #4 : 08 de Julio de 2014, 10:02:44 pm » |
|
Ok, así lo hago. Respecto al diseño, pues seguro que es mejorable. Pero me refiero a que si con "el diseño perfecto" muevo n elementos en pantalla, y haciendo tres apaños así consigo mover n+x elementos, pues mejor, independientemente del diseño Como te dice Mortimer, es poca cosa, asi que X quiza sea = 1, como mucho. Dependerá del caso. Para eso, generalmente, no hace falta molestarse. Ahora si, como también te dice, ya lo tienes en RAM y no te supone molestia ponerlo asi, pues tampoco pierdes nada. Y, vaya, de nuevo según el caso, si por meter 1 elemento más el juego (o lo que sea) va a ganar bastante, o te es crucial, adelante. Como he dicho, no pierdes nada tampoco, si acaso un poco de RAM, pero si te es asumible esa pequeña pérdida, pues bien. Cada caso es diferente, no hay que hacerlo así o asá siempre, unas veces te convendrá una cosa y otras lo contrario. Y, como ambas formas son correctas, no es problema el pasar de una otra. Lo de las lineas del borde va realmente bien y es muy visual, así no tienes que ir contando ciclos. Y además, que queda bonito Eso sí, procura siempre probarlo en 60hz. Si te va bien así en 50hz no tendrás problemas. Pero si te va bien a 50hz, a menos que ya veas que tienes mucho margen, luego a 60hz puede haber sorpresa. Imagino que no te digo nada que no sepas, pero por si acaso.
|
|
|
En línea
|
-- She Bops!
|
|
|
MsxKun
|
|
« Respuesta #5 : 08 de Julio de 2014, 10:07:03 pm » |
|
Además recuerda que fuera del vblank, al VDP del MSX1 no le puedes meter demasiada tralla, y ahí en vez de apurar tanto has de ralentizar con los nops. Dentro del vblank sí, métele, métele.
|
|
|
En línea
|
-- She Bops!
|
|
|
pentacour
|
|
« Respuesta #6 : 09 de Julio de 2014, 09:36:45 am » |
|
Gracias por las respuestas. Veo que la ganancia no es muy significativa entonces. Para ver como vas de tiempo, el truco más sencillo y visual creo que es cambiar el color del borde, ya que cambiar ese registro en el vdp hace que inmediatamente el borde empiece a dibujarse en el color indicado. Así que incluso le puedes poner incluso a cada rutina un color distinto y tienes una visual de cómo van los tiempos en el borde.
Me parece superinteresante. Es algo que había oído pero no me había puesto. Así que he hecho unas pruebas y veo que el tiempo que me ocupa una rutina parece fijo porque el rectángulo que se dibuja en pantalla es siempre del mismo tamaño. Pero noto que a veces me sale más arriba y a veces más abajo... Todo esto en un emulador.Hago: Loop:
//Cambio fondo a blanco ld a,15 ;color out [$99],a ld a,7+128 out [$99], a
//Rutina
//Cambio fondo a negro ld a,0 ;color out [$99],a ld a,7+128 out [$99], a
HALT //Escribo en VRAM jp Loop
En el VBLANK el VDP va dibujando el fondo. Entonces en el momento que le digo que cambie el fondo, ¿lo sirve al momento? Porque entonces no entiendo bien porqué no me sale siempre el rectángulo en la misma posición. Sí que sale siempre en la misma zona (inferior o superior según las pruebas) pero no siempre exactamente en la misma línea. (Todo esto partiendo de que he comentado casi todo el código y lo que calculo a cada pasada en teoría es siempre lo mismo.)Edito: Perdón, perdón, como lo estaba probando sin sonido tenía el pequeño detalle que estaba el player funcionando de fondo Sale perfecto, igual tamaño y mismo posición. Genial.
|
|
« Última modificación: 09 de Julio de 2014, 09:56:54 am por pentacour »
|
En línea
|
|
|
|
pentacour
|
|
« Respuesta #7 : 10 de Julio de 2014, 06:22:36 pm » |
|
Decía que sale el rectángulo del mismo tamaño y en el mismo sitio. Y bueno, en el mismo sitio exacto no. Si hago: Loop HALT Borde=blanco noop noop noop Borde=negro jp Loop
Sale una línea en la parte baja pero no siempre comenzando en el mismo píxel exacto, aunque sí del mismo tamaño cuando sale. Se repite un patrón en la que comienza en un píxel, en el siguiente refresco desplazado y en el siguiente refresco no sale. Esto con el openmsx al 1% de velocidad. Con el bluemsx sale algo parecido pero no en el mismo sitio que el open. Y en un MSX real... pues a ver si luego puedo montarlo y lo pruebo que estoy intrigado. ¿Es normal que no salga siempre en el mismo sitio, cosa que no entiendo, o es cuestión del emulador?
|
|
|
En línea
|
|
|
|
Mortimer
|
|
« Respuesta #8 : 10 de Julio de 2014, 08:57:34 pm » |
|
¿Podrías mandar un par de pantallazos?
De todas formas es normal que no aparezca exactamente en el mismo punto. Supongo que estás enganchado a la interrupción con el BIOS, y esta hace varias cosas antes de pasarle el control a tu rutina, como explorar el teclado. Y alguna debe ser de tardar más o menos cada vez.
Además creo recordar que incluso poniendo directamente tu propio gestor de interrupciones sin BIOS, el punto de comienzo también baila un poco, imagino que porque el VDP tendrá algún margen y/o el Z80 según el ciclo máquina en el que le llegue la INT tarda más o menos en responder...
|
|
« Última modificación: 11 de Julio de 2014, 12:19:12 am por Mortimer »
|
En línea
|
|
|
|
MsxKun
|
|
« Respuesta #9 : 11 de Julio de 2014, 12:16:12 am » |
|
Decía que sale el rectángulo del mismo tamaño y en el mismo sitio. Y bueno, en el mismo sitio exacto no.
¿Es normal que no salga siempre en el mismo sitio, cosa que no entiendo, o es cuestión del emulador?
Es normal. Cuando salta la interrupcion, la BIOS hace cosicas (como leer el buffer de teclado). Y esas cosicas dependen de varios factores. Y no siempre tarda lo mismo.
|
|
|
En línea
|
-- She Bops!
|
|
|
pentacour
|
|
« Respuesta #10 : 11 de Julio de 2014, 03:22:57 pm » |
|
Okk. Lo que sí veo es que siempre ocupa el mismo ancho, que sí que es de esperar. Gracias.
|
|
|
En línea
|
|
|
|
|