Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: cybernoid en 29 de Septiembre de 2010, 10:35:43 am



Título: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: cybernoid en 29 de Septiembre de 2010, 10:35:43 am
Hola,

Vereis tengo un mapa de 12x4 Pantallas cada una de ellas de 30x20 caracteres, 600 bytes por pantalla

lo estoy comprimiendo con RLE con una herramienta propia, la cuestion es que por mucho RLE que use la cosa sigue sin bajar mucho y eso que el mapa tampoco es que este super cargado.

Tampoco tengo claro si mi herramienta tiene algun problema por que veo que la app de Karoshi parece que comprime un pelin mas que la mia, cosa que no comprendo.

el algoritmo que uso es mas o menos asi:
Código:
while (index<array.lenght)
{
a=array[index];
index++;
repetidos=0;
while (a==array[index])
{
   repetidos++;
   index++;
}
if (repetidos>0)
{
  añade codigo de control al resultado
  añade nº de ocurrencias al resultado
  añade nº de caracter al resultado
}
else
{
  añade nº de caracter al resultado
}

}

creo que el algoritmo es correcto, pero aun y asi me queda bastante grande el fichero resultado.

Alguien sabe que algoritmo usan juegos como Dynamite Dan o Abu simbel?

Saludos,
David




Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: kabish en 29 de Septiembre de 2010, 10:59:01 am
Usa el bitbuster, el rle solo te dara buenos resultados en casos excepcionales.

http://es.msx.org/BitBuster-1.2.newspost1626.html (http://es.msx.org/BitBuster-1.2.newspost1626.html)


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: Metalbrain en 29 de Septiembre de 2010, 11:23:20 am
Vereis tengo un mapa de 12x4 Pantallas cada una de ellas de 30x20 caracteres, 600 bytes por pantalla

lo estoy comprimiendo con RLE con una herramienta propia, la cuestion es que por mucho RLE que use la cosa sigue sin bajar mucho y eso que el mapa tampoco es que este super cargado.

El algoritmo RLE es extremadamente simple, así que es normal que apenas comprima. Los mejores compresores son exomizer, pucrunch y aPLib, y otras alternativas que pueden funcionar bien son MegaLZ y pletter. Lo suyo es que los pruebes todos y te quedes con el que de el menor tamaño considerando tanto los datos comprimidos como el tamaño del descompresor en si mismo.


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: cybernoid en 29 de Septiembre de 2010, 11:59:03 am
gracias a los dos.

Probare pletter ya que los enlaces al bitbusters estan rotos :P

menuda putadica, por que lo estoy programando en C con el SDCC y pasar el ASM al C es un poco coñazo jejeje

ya os contare

edit: bastante complicado :P nadie lo tiene pasado a sdcc por casualidad ¿no?


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: pitpan en 29 de Septiembre de 2010, 01:56:12 pm
El mejor método de compresión dependerá de lo que tengas que comprimir y lo que quieras conseguir (tamaño, velocidad, etc.). Si las pantallas son las típicas de plataformas, lo mejor es usar metatiles, es decir, definir como un bloque una colección de caracteres, por ejemplo ARBOL. Y entonces, simplemente indicas ARBOL, X,Y. Y ya está. Y sobre eso, si quieres, añades la compresión. Como no vas a tener que manipular mucho los datos, probablemente BitBuster/Pletter te puedan dar una muy buena compresión. Pero vamos, lo de los metatiles es interesante para crear mapeados mucho más extensos, siempre que tengas elementos repetitivos entre pantallas.

En cuanto a RLE, olvídate para algo así. Es muy rápido y está pensado para descomprimir a lo bestia de RAM a VRAM sin necesidad de tener un buffer, pero es muy ineficiente. Lo dicho.


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: cybernoid en 29 de Septiembre de 2010, 02:13:32 pm
En cuanto a RLE, olvídate para algo así. Es muy rápido y está pensado para descomprimir a lo bestia de RAM a VRAM sin necesidad de tener un buffer, pero es muy ineficiente. Lo dicho.

Ok, pasare del RLE, de momento sigo mirando si adapto el pletter a asm de SDCC (de momento chungo) o si paso del SDCC y vuelvo al asm :P



Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: SapphiRe_MSX en 29 de Septiembre de 2010, 02:25:53 pm
o si paso del SDCC y vuelvo al asm :P

Será lo mejor ::) ::)


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: cybernoid en 29 de Septiembre de 2010, 04:34:49 pm
o si paso del SDCC y vuelvo al asm :P

Será lo mejor ::) ::)

en ello estoy :)

ahora otro problemita :P

este es mi intento de pasar la rutina de descompresión de pletter a asMSX
original:
Código:
; pletter v0.5c msx unpacker

; call unpack with hl pointing to some pletter5 data, and de pointing to the destination.
; changes all registers

; define lengthindata when the original size is written in the pletter data

;  define LENGTHINDATA

  module pletter

  macro GETBIT
  add a,a
  call z,getbit
  endmacro

  macro GETBITEXX
  add a,a
  call z,getbitexx
  endmacro

@unpack

  ifdef LENGTHINDATA
  inc hl
  inc hl
  endif

  ld a,(hl)
  inc hl
  exx
  ld de,0
  add a,a
  inc a
  rl e
  add a,a
  rl e
  add a,a
  rl e
  rl e
  ld hl,modes
  add hl,de
  ld e,(hl)
  ld ixl,e
  inc hl
  ld e,(hl)
  ld ixh,e
  ld e,1
  exx
  ld iy,loop
literal
  ldi
loop
  GETBIT
  jr nc,literal
  exx
  ld h,d
  ld l,e
getlen
  GETBITEXX
  jr nc,.lenok
.lus
  GETBITEXX
  adc hl,hl
  ret c
  GETBITEXX
  jr nc,.lenok
  GETBITEXX
  adc hl,hl
  ret c
  GETBITEXX
  jp c,.lus
.lenok
  inc hl
  exx
  ld c,(hl)
  inc hl
  ld b,0
  bit 7,c
  jp z,offsok
  jp ix

mode6
  GETBIT
  rl b
mode5
  GETBIT
  rl b
mode4
  GETBIT
  rl b
mode3
  GETBIT
  rl b
mode2
  GETBIT
  rl b
  GETBIT
  jr nc,offsok
  or a
  inc b
  res 7,c
offsok
  inc bc
  push hl
  exx
  push hl
  exx
  ld l,e
  ld h,d
  sbc hl,bc
  pop bc
  ldir
  pop hl
  jp iy

getbit
  ld a,(hl)
  inc hl
  rla
  ret

getbitexx
  exx
  ld a,(hl)
  inc hl
  exx
  rla
  ret

modes
  word offsok
  word mode2
  word mode3
  word mode4
  word mode5
  word mode6

  endmodule

;eof
asmsx:
Código:
; pletter v0.5c msx unpacker
; call unpack with hl pointing to some pletter5 data, and de pointing to the destination.
; changes all registers
; define lengthindata when the original size is written in the pletter data
;.define LENGTHINDATA
unpack:

  ;ifdef LENGTHINDATA
  ;  inc hl
  ;  inc hl
  ;endif

  ld a,[hl]
  inc hl
  exx
  ld de,0
  add a,a
  inc a
  rl e
  add a,a
  rl e
  add a,a
  rl e
  rl e
  ld hl,modes
  add hl,de
  ld e,[hl]
  ld ixl,e
  inc hl
  ld e,[hl]
  ld ixh,e
  ld e,1
  exx
  ld iy,loop
literal:
  ldi
loop:
  add a,a
  call z,getbit
  jr nc,literal
  exx
  ld h,d
  ld l,e
getlen:
  add a,a
  call z,getbitexx
  jr nc,lenok
lus:
  add a,a
  call z,getbitexx
  adc hl,hl
  ret c
  add a,a
  call z,getbitexx
  jr nc,lenok
  add a,a
  call z,getbitexx
  adc hl,hl
  ret c
  add a,a
  call z,getbitexx
  jp c,lus
lenok:
  inc hl
  exx
  ld c,[hl]
  inc hl
  ld b,0
  bit 7,c
  jp z,offsok
  jp ix

mode6:
  add a,a
  call z,getbit
  rl b
mode5:
  add a,a
  call z,getbit
  rl b
mode4:
  add a,a
  call z,getbit
  rl b
mode3:
  add a,a
  call z,getbit
  rl b
mode2:
  add a,a
  call z,getbit
  rl b
  add a,a
  call z,getbit
  jr nc,offsok
  or a
  inc b
  res 7,c
offsok:
  inc bc
  push hl
  exx
  push hl
  exx
  ld l,e
  ld h,d
  sbc hl,bc
  pop bc
  ldir
  pop hl
  jp iy

getbit:
  ld a,[hl]
  inc hl
  rla
  ret

getbitexx:
  exx
  ld a,[hl]
  inc hl
  exx
  rla
  ret

modes:
  dw offsok
  dw mode2
  dw mode3
  dw mode4
  dw mode5
  dw mode6

no encontre ninguna equivalencia para las macros asi que he substituido las llamadas a las macros por el contenido.

basicamente es lo unico que he cambiado, pero parece que no funciona bien, alguna idea?


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: pitpan en 29 de Septiembre de 2010, 04:48:08 pm
Ojito: el Pletter utiliza descompresores distintos para cada tamaño de tablas. Es decir, las macros sirven para generar código distinto en función de un parámetro. Por lo tanto, te sugiero que pases directamente al BitBuster, cuyo descompresor BitBuster Extreme ocupa unos 80 bytes y es perfectamente compatible - tal cual - con asMSX.


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: cybernoid en 29 de Septiembre de 2010, 04:57:16 pm
Ojito: el Pletter utiliza descompresores distintos para cada tamaño de tablas. Es decir, las macros sirven para generar código distinto en función de un parámetro. Por lo tanto, te sugiero que pases directamente al BitBuster, cuyo descompresor BitBuster Extreme ocupa unos 80 bytes y es perfectamente compatible - tal cual - con asMSX.

y de donde saco bitbuster? lo he buscado, en la web de teambomba no hay link  ¿teneis alguno por aqui?


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: pitpan en 29 de Septiembre de 2010, 05:17:00 pm
Está en la página antigua del TEAM BOMBA: Link directo (http://www.teambomba.net/bombaman/download/bitbuster1_2.zip).

En cuanto al descompresor que te dije, no sé por dónde andará... A ver si alguna alma caritativa te lo pasa. No lo tengo a mano. Caso de no salir, lo recuperaré de mis fuentes y lo posteo en la sección de snippets del foro en todo caso.


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: pitpan en 29 de Septiembre de 2010, 05:22:33 pm
Puesto en snippets... Sin probar ;)

Vivamos peligrosamente...


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: ARTRAG en 29 de Septiembre de 2010, 10:52:54 pm
MSX-O-Mizer v1.5 is by far better of pletter and bitbuster for compression ratio, but a bit slower and needs some ram for working

The file here
http://www.msx.org/MSX-O-Mizer-v1.0.newspost4723.html
is already version 1.5


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: cybernoid en 30 de Septiembre de 2010, 09:05:04 am
Puesto en snippets... Sin probar ;)

Vivamos peligrosamente...

Pues parece que no va :P

Sapphire me paso uno por correo que me funciona bien :)

gracias

MSX-O-Mizer v1.5 is by far better of pletter and bitbuster for compression ratio, but a bit slower and needs some ram for working

The file here
http://www.msx.org/MSX-O-Mizer-v1.0.newspost4723.html
is already version 1.5

Hola,

Disculpa que te conteste en español, escribir en ingles no es lo mío (parece que leer se me da mejor).

De momento me quedo con BitBuster :) pero probare el MSX-O-Mizer.

Gracias :D



Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: SapphiRe_MSX en 30 de Septiembre de 2010, 10:58:03 am
Sapphire me paso uno por correo que me funciona bien :)

Como para que no fuera... tienes un cachito del código del QBIQS en tus manos ::qbiqsray:: ::qbiqsglow:: ::qbiqsbeam::

Tengo más "librerías" disponibles por aquí por si hacen falta :)


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: pitpan en 30 de Septiembre de 2010, 08:19:44 pm
Pues manda todo hacia los snippets, Sap!

Y si quieres publicar el código fuente de cualquier cosa, ya sabes ;)


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: SapphiRe_MSX en 30 de Septiembre de 2010, 11:37:27 pm
Pues manda todo hacia los snippets, Sap!

Algo iré publicando, sí.

Citar
Y si quieres publicar el código fuente de cualquier cosa, ya sabes ;)

A ver si hay tiempo, de momento las librerías más genéricas irán para snippets, como el posicionar las páginas de la ROM en modo 32K y 48K, que no se si están.

Pero ahora a la cama, que mañana hay viajecito :D


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: Madonna Mk 2 en 13 de Octubre de 2010, 03:41:42 pm
En Seleniak usé Jetpack™ (LOL!) para hacer caber el copón de datos (sobre todo la música, que iba muy a saco) en 8 KB. La rutina es sencilla, ocupa poco y descomprime rápido. La monté basándome en no sé qué fuentes para Z80 con las que me topé investigando en internet sobre el tema.

La verdad, no soy muy amigo de la compresión, sobre todo porque te hace perder la noción de lo que va a ocupar un determinado fragmento de código o datos, porque alterar n bytes tiene efectos imprevisibles en el resultado de la compresión, y una rutina que te cabía justita, puede acabar desbordándose por bastante al alterar unos pocos bytes :-\ Pero teniendo el MSX una cantidad de RAM nada despreciable -en comparación con las máquinas arcade de la época- y siendo la ROM cara, vale la pena comprimir.

No tengo la rutina muy a mano, ni me acuerdo demasiado bien cómo iba, ni sé dónde fue a parar el comando para comprimir, pero si te ves muy apurado y no encuentras nada que te vaya bien, te la puedo buscar, ya que en breve he de hacer limpieza/inventario de proyectos.


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: cybernoid en 14 de Octubre de 2010, 08:10:55 am
Pues te agradezco la oferta :) pero de momento con el Bitbuster que me paso Sapp tengo mas que suficiente, vamos que las 40 pantallas se me quedan en miseria y compañia :)



Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: Madonna Mk 2 en 14 de Octubre de 2010, 10:15:58 am
Perfecto, así le podrás encasquetar más pantallas :joe:


Título: Re: Metodos de compresión de datos ¿cual es el mejor?
Publicado por: cybernoid en 14 de Octubre de 2010, 11:04:13 am
Perfecto, así le podrás encasquetar más pantallas :joe:

:P más ?  nooooooo

que se me hace muy cuesta arriba, es el primer proyecto que parece que estoy sacando adelante sin tirarlo al cubo de "proyectos que ya terminare cuando pueda" XD

De momento al menos parece que gracias a ese cubo de proyectos inacabados mi experiencia ensamblera va subiendo de nivel :) desgraciadamente no ocurre lo mismo con mi experiencia dibujera porque sigo haciendo unos sprites que parecen churros (de feos que son)