PDA

Ver la versión completa : Varias ROMs en un mismo .zip?



Multi
23/04/2008, 15:50
Bueno, pues ayer le estube dando vueltas a la cabeza... Como hay Emus que aceptan las ROMS en .zip , se podrían meter varias ROMS en un .zip para ahorrar espacio y tenerlo todo más organizado?

Un saludo. :lovegp2x:

dj syto
23/04/2008, 15:54
yo diria ke no... porque cuanto mas grande es el zip mas memoria se necesita para descomprimirlo.

juanvvc
23/04/2008, 15:58
Sí, claro, solo es cuestión de que el emulador lo reconozca. Por ejemplo, puedes hacerlo en... esto... vaya... pues parece que en ninguno :)

Por cierto, el espacio que ahorrarías es simbólico: apenas la cabecera del zip, unos cientos de bytes. Y probablmente ni eso debido al tamaño de bloque de las SD. Y lo de más organizado es discutible, porque no podrías borrar un juego concreto sino todo el zip.

Lo que dice syto no me convence porque no se descomprimiría todo el zip sino solo la parte que te interesa. Siempre que el emulador no cargue el zip entero en memoria, claro, pero si alguno lo hace ya tiene algo para mejorar :)

dj syto
23/04/2008, 16:00
pero eske si metes unas cuantas roms, por ejemplo ke lleguen a 64 megas (lo cual apenas es nada) tendria ke descomprimir todo el zip o en la sd, o en la nand, o en la memoria ram, y le costaria tela.

Multi
23/04/2008, 16:20
Gracias a todos, pues lo olvido entonces xD

nintiendo1
23/04/2008, 17:02
Yo siempre meto todas mis roms descomprimidas, supongo que así usa menos RAM...

Saludos.

juanvvc
23/04/2008, 17:05
Syto, no hace falta descomprimir el zip entero en memoria ya que dentro de los zip los archivos individuales están separados y cada uno tiene su propia tabla de Huffman. zipfile.seek(directorio-central); archivo=zipfile.unzip(nombrearchivo); zipfile.seek(archivo); contenido=zipfile.unzip(tamaño-archivo)

http://en.wikipedia.org/wiki/ZIP_(file_format)#Technical_information

Nintiendo1, ahorras ram al inicio del juego donde notarás que carga más rápido, pero después debería ser lo mismo porque el emulador debería guardar la rom en memoria descomprimida y ya se olvida del zip (liberando así la memoria que ocupaba). Pero eso es en teoría, puede que algunos emuladores no olviden el zip porque van leyendo y descomprimiendo la rom según la necesitan. Y en ese caso, ahorraras memoria ram a expensas de ralentizar un poco mientras tiene que leer (como le pasa a MegaCD en Picodrive, por ejemplo, pero ahí es bueno porque así "simula" la lectura lenta desde CD) Habría que mirar el código de cada emulador, pero yo uso siempre las rom en zip (Picodrive, Gpfce, Pocketsnes, Temper, por supuesto los arcade) y no tengo problemas de rendimiento, excepto en Gnuboy donde K-teto recomendaba no comprimir.

Darumo
23/04/2008, 17:27
cuando decis "varias roms" os soleis referir a unos cientos de megas en zip... eso es un ladrillo duro de roer.

enkonsierto
23/04/2008, 18:12
eso es poco práctico...

dj syto
23/04/2008, 18:19
Syto, no hace falta descomprimir el zip entero en memoria ya que dentro de los zip los archivos individuales están separados y cada uno tiene su propia tabla de Huffman. zipfile.seek(directorio-central); archivo=zipfile.unzip(nombrearchivo); zipfile.seek(archivo); contenido=zipfile.unzip(tamaño-archivo)

http://en.wikipedia.org/wiki/ZIP_(file_format)#Technical_information

Nintiendo1, ahorras ram al inicio del juego donde notarás que carga más rápido, pero después debería ser lo mismo porque el emulador debería guardar la rom en memoria descomprimida y ya se olvida del zip (liberando así la memoria que ocupaba). Pero eso es en teoría, puede que algunos emuladores no olviden el zip porque van leyendo y descomprimiendo la rom según la necesitan. Y en ese caso, ahorraras memoria ram a expensas de ralentizar un poco mientras tiene que leer (como le pasa a MegaCD en Picodrive, por ejemplo, pero ahí es bueno porque así "simula" la lectura lenta desde CD) Habría que mirar el código de cada emulador, pero yo uso siempre las rom en zip (Picodrive, Gpfce, Pocketsnes, Temper, por supuesto los arcade) y no tengo problemas de rendimiento, excepto en Gnuboy donde K-teto recomendaba no comprimir.

accede directamente al archivo, si, pero para poder acceder a el, primero carga todo el zip en memoria y luego descomprime el que quiere. Vamos, o eso creo... Eske esto lo comentó hace años rili me parece...

juanvvc
23/04/2008, 19:21
Syto, si alguna librería/emulador está cargando el zip entero en memoria sin razón aparente (por ejemplo, para reducir el tiempo de acceso si hay que cargar varios archivos), entonces esa librería/emulador deberían mejorar la parte la carga de roms.

Pongamos por ejemplo PocketSnes. loadzip.c es el encargado de cargar un zip. Se llama a las funciones de unzip.c para leer solo la cabecera del zip, que incluye el directorio central, se escoge el archivo más grande según la cabecera y se descomprime solo ese archivo. Si miras el código comprobarás que para abrir/moverse/leer/cerrar un zip se usan las funciones definidas en ioapi.c, que no son más que alias a fopen/fseek/fread/fclose y no se mapea en memoria. Después de leer el archivo más grande (esperemos que sea la rom), el archivo zip se cierra y se libera la memoria utilizada, que es solo la del directorio central y el buffer de lectura del archivo actual. Así que PocketSnes NO carga todo el zip en memoria, sino que lee desde la SD. Supongo que los demás emuladores harán lo mismo porque es lo lógico y porque todos usan la misma librería de Gilles Volant para leer zips, que es bastante más antigua que la Gp2x :)

Pero no nos despistemos, como ya dije antes y enkonsierto redice, meter varias roms en un zip no solo es poco útil técnicamente, sino que además es poco práctico.

dj syto
23/04/2008, 19:31
Syto, si alguna librería/emulador está cargando el zip entero en memoria sin razón aparente (por ejemplo, para reducir el tiempo de acceso si hay que cargar varios archivos), entonces esa librería/emulador deberían mejorar la parte la carga de roms.

Pongamos por ejemplo PocketSnes. loadzip.c es el encargado de cargar un zip. Se llama a las funciones de unzip.c para leer solo la cabecera del zip, que incluye el directorio central, se escoge el archivo más grande según la cabecera y se descomprime solo ese archivo. Si miras el código comprobarás que para abrir/moverse/leer/cerrar un zip se usan las funciones definidas en ioapi.c, que no son más que alias a fopen/fseek/fread/fclose y no se mapea en memoria. Después de leer el archivo más grande (esperemos que sea la rom), el archivo zip se cierra y se libera la memoria utilizada, que es solo la del directorio central y el buffer de lectura del archivo actual. Así que PocketSnes NO carga todo el zip en memoria, sino que lee desde la SD. Supongo que los demás emuladores harán lo mismo porque es lo lógico y porque todos usan la misma librería de Gilles Volant para leer zips, que es bastante más antigua que la Gp2x :)


una gran explicacion famigo :brindis:

juanvvc
23/04/2008, 19:38
Gracias famigo. Y por cierto, eso prueba que el temor de Nintiendo1 de malgastar ram es infundado y que al menos en PocketSnes haría bien en zippear sus roms para ahorrar espacio en SD :)

dj syto
23/04/2008, 19:47
hombre, esta claro ke una por una si ke conviene zipearlas. Ya que la consola tiene ram de sobras, y una vez cargada la rom, ya no mantiene la version comprimida como tu bien has dicho. Pero yo tenia la duda con el archivo grande, ke tu muy bien me has resuelto.

Jurk
23/04/2008, 20:18
entonces, si es tan facil descomprimir un archivo, por que mi winzip, winrar,7zip SIEMPRE se tiene que leer cada unos de los archivos anteriores? Yo creo que al comprimir se pierde un poco la nocion de donde esta escrito cada uno de los archivos... y asi hay que leer hasta que se encuentra el comienzo del archivo.

Pero esto no tiene sentido ya que al comprimir la informacion que se fragmenta la informacion de los archivos.

neglox
23/04/2008, 20:42
Jurk a mi algunos programas cuando intentaba abrir un fichero desde la propia interfaz siempre me descomprimía todo y luego lo "arrancaba" sin embargo ahora cuando selecciono solo un fichero del lote comprimido y le digo extract to, solo descomprime ese...curioso.

juanvvc
23/04/2008, 22:49
por que mi winzip, winrar,7zip SIEMPRE se tiene que leer cada unos de los archivos anteriores?

Pues ni idea, de programas de Windows ando totalmente pez :confused: Los decompresores que utilizo linkan contra la zlib que funciona como he descrito y te prometo que solo descomprimen el archivo que les pides, como hacen los emuladores de Gp2x. La información de dónde acaba un archivo y empieza el otro se guarda en el "directorio central" del archivo ZIP, como bien explica la wikipedia.

Ahora que pienso, ¿puede ser que no hables de archivos ZIP sino RAR, 7Z ó TGZ? Esos pueden utilizar la técnica comprensión sólida (http://en.wikipedia.org/wiki/Solid_compression), que aunque en ocasiones da mejores resultados obliga a descomprimir todo el fichero para recuperar un solo archivo.