Karoshi MSX Community
06 de Julio de 2021, 12:28:11 am *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1] 2
  Imprimir  
Autor Tema: Metodos de compresión de datos ¿cual es el mejor?  (Leído 9976 veces)
0 Usuarios y 1 Visitante están viendo este tema.
cybernoid
Karoshi Maniac
****
Mensajes: 368



WWW
« : 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


« Última modificación: 29 de Septiembre de 2010, 12:28:09 pm por gobblin » En línea
kabish
Karoshi Maniac
****
Mensajes: 470


caspaflims@hotmail.com
« Respuesta #1 : 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
En línea
Metalbrain
Karoshi Fan
**
Mensajes: 92


Z80jutsushi


« Respuesta #2 : 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.
En línea
cybernoid
Karoshi Maniac
****
Mensajes: 368



WWW
« Respuesta #3 : 29 de Septiembre de 2010, 11:59:03 am »

gracias a los dos.

Probare pletter ya que los enlaces al bitbusters estan rotos Tongue

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 Tongue nadie lo tiene pasado a sdcc por casualidad ¿no?
« Última modificación: 29 de Septiembre de 2010, 12:21:01 pm por gobblin » En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #4 : 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.
En línea
cybernoid
Karoshi Maniac
****
Mensajes: 368



WWW
« Respuesta #5 : 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 Tongue

En línea
SapphiRe_MSX
Visitante
« Respuesta #6 : 29 de Septiembre de 2010, 02:25:53 pm »

o si paso del SDCC y vuelvo al asm Tongue

Será lo mejor Roll Eyes Roll Eyes
En línea
cybernoid
Karoshi Maniac
****
Mensajes: 368



WWW
« Respuesta #7 : 29 de Septiembre de 2010, 04:34:49 pm »

o si paso del SDCC y vuelvo al asm Tongue

Será lo mejor Roll Eyes Roll Eyes

en ello estoy Smiley

ahora otro problemita Tongue

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?
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #8 : 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.
En línea
cybernoid
Karoshi Maniac
****
Mensajes: 368



WWW
« Respuesta #9 : 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?
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #10 : 29 de Septiembre de 2010, 05:17:00 pm »

Está en la página antigua del TEAM BOMBA: Link directo.

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.
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #11 : 29 de Septiembre de 2010, 05:22:33 pm »

Puesto en snippets... Sin probar Wink

Vivamos peligrosamente...
En línea
ARTRAG
Visitante
« Respuesta #12 : 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
En línea
cybernoid
Karoshi Maniac
****
Mensajes: 368



WWW
« Respuesta #13 : 30 de Septiembre de 2010, 09:05:04 am »

Puesto en snippets... Sin probar Wink

Vivamos peligrosamente...

Pues parece que no va Tongue

Sapphire me paso uno por correo que me funciona bien Smiley

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 Smiley pero probare el MSX-O-Mizer.

Gracias Cheesy

En línea
SapphiRe_MSX
Visitante
« Respuesta #14 : 30 de Septiembre de 2010, 10:58:03 am »

Sapphire me paso uno por correo que me funciona bien Smiley

Como para que no fuera... tienes un cachito del código del QBIQS en tus manos Ray - Qbiqs Glow - Qbiqs Beam - Qbiqs

Tengo más "librerías" disponibles por aquí por si hacen falta Smiley
En línea
Páginas: [1] 2
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!