BASIC Standard: Acelerar carga de matrices

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

BASIC Standard: Acelerar carga de matrices

Mensaje por Hark0 » Jue Nov 15, 2012 7:56 am

Buenas!

Estoy escribiendo un jueguecito integramente en Basic para el concurso de Bytemaniacos...

He creado varias matrices DIM de tamaño 15x15 para almacenar diferentes valores de un mapa. En total CINCO matrices.

De momento introduzco los datos por medio de DATA, aunque es MUY MUY MUY lento. Para el juego final, creo que puedo hacer que las cargue directo desde cinta... aunque en el momento de reinicar una partida habria que rebobinar la cinta para cargar las DATA...

La cosa está en:

¿Como ACELERAR la introducción de datos en una matriz desde Basic?

se me ocurre que quizas podria leer bits en lugar de bytes, con lo que en un valor 0-255 podria tener todo declarado, asi con UNA matriz valdria... ¿opiniones?

byte=gg o it en a (00 0 00 00 0)

Que corresponderia a:

gg= bits que contienen el numero de grafico
o=bit que contiene tipo de tile(obstaculo,objeto,enemigo)
it=bits que contienen el numero de item
en=bits que contienen el numero de enemigo
a=accion en caso de pisar tile


Saludos.
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
oblo
Sabreman
Mensajes: 327
Registrado: Lun Feb 07, 2011 9:53 am

Re: BASIC Standard: Acelerar carga de matrices

Mensaje por oblo » Jue Nov 15, 2012 9:15 am

No sé si es esto lo que buscas, pero en zxbasic las matrices se declaran e inicializan así:

DIM matriz(1,2) as BYTE => {{0,1,2}, _
{0,1,2}}

He programado con matrices de 20x20 para valores BYTE y nunca he tenido problemas de velocidad. Eso sí, nada de usar DATAs, que es pecado :mrgreen:

salu2

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Acelerar carga de matrices

Mensaje por Hark0 » Jue Nov 15, 2012 9:45 am

Me interesa BASIC BASIC, el nativo vamos, la "castaña" original :P aunque gracias por la info...
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: BASIC Standard: Acelerar carga de matrices

Mensaje por na_th_an » Jue Nov 15, 2012 10:32 am

Lo que se hacía antes era precargar los datos antes de grabar el juego, ya que SAVE graba también la zona de variables.

Básicamente tienes en tu programa el código que rellena las matrices. Lo ejecutas. Borras ese código que ya no te sirve para nada, y grabas el programa.

Ojito con hacer RUN, que se cargará las variables. Para ejecutar, GOTO 1.

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Acelerar carga de matrices

Mensaje por Hark0 » Jue Nov 15, 2012 10:37 am

na_th_an escribió:Lo que se hacía antes era precargar los datos antes de grabar el juego, ya que SAVE graba también la zona de variables.

Básicamente tienes en tu programa el código que rellena las matrices. Lo ejecutas. Borras ese código que ya no te sirve para nada, y grabas el programa.

Ojito con hacer RUN, que se cargará las variables. Para ejecutar, GOTO 1.


Me sirve pero a medias...

Supongamos que la matriz de datos se modifica por alguna circunstancia durante el juego (es más que probable)... al volver a empezar la partida, necesito tener dicha matriz COMO NUEVA, que se puede volver a cargar desde cinta, pero claro... un engorro.

Creo que voy a probar a usar 1 byte para almacenar varias variables como he comentado en mi post inicial...


hmmm
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: BASIC Standard: Acelerar carga de matrices

Mensaje por na_th_an » Jue Nov 15, 2012 11:43 am

En ese caso puedes tener un par de arrays (uno para índices y otro para valores) en el que encoles los cambios que hagas y luego reconstruyas el array original usando esa información. A menos que el array original vaya a cambiar muchísimo durante el juego.

El tema de empaquetar bits en bytes en Sinclair BASIC lo desaconsejo con vehemencia. El intérprete ya es lento de por sí operando con variables. Esto lo juntas con que no hay operaciones para tratamiento de bits, y que cualquer manipulación (incluso una lectura) te la tienes que apañar con divisiones, multiplicaciones, y potencias... y ya es el acabóse. El tiempo necesario en "leer" un valor empaquetado puede ser bestial, sobre todo si estamos hablando de un juego.

AND y OR no funcionan a nivel de bits en Sinclair BASIC, por lo que, para leer, por ejemplo, un valor de dos bits a partir del bit 2, no te vale con hacer un (valor AND 12) / 4.

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Acelerar carga de matrices

Mensaje por Hark0 » Jue Nov 15, 2012 11:54 am

na_th_an escribió:En ese caso puedes tener un par de arrays (uno para índices y otro para valores) en el que encoles los cambios que hagas y luego reconstruyas el array original usando esa información. A menos que el array original vaya a cambiar muchísimo durante el juego.

El tema de empaquetar bits en bytes en Sinclair BASIC lo desaconsejo con vehemencia. El intérprete ya es lento de por sí operando con variables. Esto lo juntas con que no hay operaciones para tratamiento de bits, y que cualquer manipulación (incluso una lectura) te la tienes que apañar con divisiones, multiplicaciones, y potencias... y ya es el acabóse. El tiempo necesario en "leer" un valor empaquetado puede ser bestial, sobre todo si estamos hablando de un juego.

AND y OR no funcionan a nivel de bits en Sinclair BASIC, por lo que, para leer, por ejemplo, un valor de dos bits a partir del bit 2, no te vale con hacer un (valor AND 12) / 4.


Cachis!!! Es lo que me temía...

Seguiré el enlace que posteas a ver como lo solvento... ;)
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: BASIC Standard: Acelerar carga de matrices

Mensaje por na_th_an » Jue Nov 15, 2012 11:58 am

La verdad es que (cojo el paraguas) el Sinclair BASIC es un poco basuraca...

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Acelerar carga de matrices

Mensaje por Hark0 » Jue Nov 15, 2012 12:09 pm

na_th_an escribió:La verdad es que (cojo el paraguas) el Sinclair BASIC es un poco basuraca...


LOL


....


Se me ocurre otra cosa... ¿Y si cargo los datos de la matriz desde cinta a una posición X de la RAM...

y cuando me toque restaurar dichos datos de la matriz, incluyo una rutinilla en ensamblador para copiar el BLOQUE entero en la posicion de la matriz...????

(aunque no se si se permite en el concurso, estaba pensando en varias opciones)
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: BASIC Standard: Acelerar carga de matrices

Mensaje por na_th_an » Jue Nov 15, 2012 12:35 pm

No sé si te dejará. Supuestamente el concurso es para revolcarse como cerdetes en las limitaciones del BASIC :lol: En ese caso te recomendaría la opción de restaurar los valores originales.

Otra opción es pasar de arrays por completo y usar directamente PEEK y POKE para leer y escribir los datos en memoria. Además, así ahorras un montón de espacio. Si tus valores son menores de 256, por ejemplo, cada dato sólo te va a pillar un byte frente a los CINCO que ocupan en una representación de punto flotante en un array.

15x15x5 = 1125 bytes, poco más de un KB. Con arrays normales son casi seis lo que te están ocupando.

En el caso de que no te quieras rayar haciendo una cola de restauración para restaurar solo lo que has cambiado, puedes tener dos copias de los cinco bloques de datos y ambas aún te ocuparán la mitad de lo que te ocupa ahora una sola copia. Además, copiar 1125 bytes de un sitio a otro de la RAM en BASIC tarda poco más de 12 segundos (acabo de calcularlo)... Si entretienes al jugador con un texto mientras se realiza la copia tampoco se notará mucho.

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Acelerar carga de matrices

Mensaje por Hark0 » Jue Nov 15, 2012 12:40 pm

na_th_an escribió:No sé si te dejará. Supuestamente el concurso es para revolcarse como cerdetes en las limitaciones del BASIC :lol: En ese caso te recomendaría la opción de restaurar los valores originales.

Otra opción es pasar de arrays por completo y usar directamente PEEK y POKE para leer y escribir los datos en memoria. Además, así ahorras un montón de espacio. Si tus valores son menores de 256, por ejemplo, cada dato sólo te va a pillar un byte frente a los CINCO que ocupan en una representación de punto flotante en un array.

15x15x5 = 1125 bytes, poco más de un KB. Con arrays normales son casi seis lo que te están ocupando.

En el caso de que no te quieras rayar haciendo una cola de restauración para restaurar solo lo que has cambiado, puedes tener dos copias de los cinco bloques de datos y ambas aún te ocuparán la mitad de lo que te ocupa ahora una sola copia. Además, copiar 1125 bytes de un sitio a otro de la RAM en BASIC tarda poco más de 12 segundos (acabo de calcularlo)... Si entretienes al jugador con un texto mientras se realiza la copia tampoco se notará mucho.



Cierto!

Había pensado también en la opción de POKEAR... más que nada es que uno tiene el vicio de programar en otros entronos y claro, el Basic del ZX, no deja ni la mitad XDDDD

Muchisimas gracias por la info y el interés.

;)
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: BASIC Standard: Acelerar carga de matrices

Mensaje por na_th_an » Jue Nov 15, 2012 12:49 pm

No hay de qué. Lo mío con Sinclair BASIC es una relación de HAMOR HODIO :lol: Opino que es un poco basuraca pero de vez en cuando a uno le gusta "volver a enrear". Ahora bien, yo compilo lo que hago. HiSoft BASIC 1.2 te lo pone muy fácil si has programado con vistas a usarlo luego, y el incremento de la velocidad es acojonante.

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Acelerar carga de matrices

Mensaje por Hark0 » Jue Nov 15, 2012 1:14 pm

na_th_an escribió:No hay de qué. Lo mío con Sinclair BASIC es una relación de HAMOR HODIO :lol: Opino que es un poco basuraca pero de vez en cuando a uno le gusta "volver a enrear". Ahora bien, yo compilo lo que hago. HiSoft BASIC 1.2 te lo pone muy fácil si has programado con vistas a usarlo luego, y el incremento de la velocidad es acojonante.



De momento me pelearé con el viejuno Basic... ;)
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Acelerar carga de matrices

Mensaje por Hark0 » Jue Nov 15, 2012 7:33 pm

Se me ha ocurrido hacer una prueba de velocidad:

El programa es muy simple, declaro 5 matrices de 15x15 y las relleno con el tipico bucle FOR-NEXT.

Tiempo según el ZX (emulado) para:

- BASin: 17.66 sec
- Spectaculator: 22.10 sec
- ZXSpin: 18.34 sec

De lo que deduzco que en una máquina REAL no tardará menos de 18~20 sec.

¿qué emulador es el más fiable en cuanto a velocidad comparado con un ZX real?

Voy a probar a cargar una ristra de bytes desde cinta (1125 exactamente) y a meterlos en RAM, y ver cuanto tarda en copiarlos a otra zona de la RAM.



(Después de tanto tiempo de no escribir en Spectrum, se acostumbra uno demasiado pronto a la potencia de las máquinas actuales... vuelta a las limitaciones... XD)
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Avatar de Usuario
Hark0
Freddy Hardest
Mensajes: 545
Registrado: Mar Nov 13, 2012 12:42 pm
Ubicación: Cornella de Llobregat - Barcelona
Contactar:

Re: BASIC Standard: Acelerar carga de matrices

Mensaje por Hark0 » Jue Nov 15, 2012 7:36 pm

na_th_an escribió:No hay de qué. Lo mío con Sinclair BASIC es una relación de HAMOR HODIO :lol: Opino que es un poco basuraca pero de vez en cuando a uno le gusta "volver a enrear". Ahora bien, yo compilo lo que hago. HiSoft BASIC 1.2 te lo pone muy fácil si has programado con vistas a usarlo luego, y el incremento de la velocidad es acojonante.


He tenido que descargar los ficheros, el avatar me despistaba :P ;)
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica

Responder

¿Quién está conectado?

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