BASIC Standard: Acelerar carga de matrices
Moderador: Sir Cilve Sinclair
- 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
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.
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
- oblo
- Sabreman
- Mensajes: 327
- Registrado: Lun Feb 07, 2011 9:53 am
Re: BASIC Standard: Acelerar carga de matrices
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
salu2
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
salu2
- 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
Me interesa BASIC BASIC, el nativo vamos, la "castaña" original aunque gracias por la info...
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica
- 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
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.
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.
- 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
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
- 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
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.
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.
- 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
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
- 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
La verdad es que (cojo el paraguas) el Sinclair BASIC es un poco basuraca...
- 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
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
- 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
No sé si te dejará. Supuestamente el concurso es para revolcarse como cerdetes en las limitaciones del BASIC 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.
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.
- 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
na_th_an escribió:No sé si te dejará. Supuestamente el concurso es para revolcarse como cerdetes en las limitaciones del BASIC 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
- 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
No hay de qué. Lo mío con Sinclair BASIC es una relación de HAMOR HODIO 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.
- 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
na_th_an escribió:No hay de qué. Lo mío con Sinclair BASIC es una relación de HAMOR HODIO 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
- 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
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)
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
- 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
na_th_an escribió:No hay de qué. Lo mío con Sinclair BASIC es una relación de HAMOR HODIO 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
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados