miércoles, 7 de octubre de 2026

Tiempos de carga ligeramente optimizados

No me rindo y sigo tratando de mejorar los lentos tiempos de carga de este juego. En esta ocasión Claude Opus 5.5 me ha hecho unas sugerencias que he querido explorar y desarrollar, y al parecer han dado buenos resultados. Como dije, el módulo de los combates ocupa él solo 600 KB y dicho tamaño es fijo y no puede cambiarse, así que la solución era mejorar por otros lados.

La idea de fondo: casi todo el tiempo de carga del juego es leer del CD. Cada lectura tiene un coste fijo, aunque sea de un fichero diminuto, y además el lector tarda más cuanto más lejos tiene que saltar en el disco. Por eso hemos atacado tres cosas: leer menos veces, leer menos datos y saltar menos por el disco.

1. Dejar de leer cosas repetidas

  • La fuente de combate se leía 3 veces seguidas al empezar cada combate (una por personaje). Ahora se lee una vez.
  • La fuente de texto del combate (WRIT0) se cargaba dos veces casi seguidas. Hemos quitado la primera, que sobraba.
  • La fuente de los diálogos del mapa (READ0) y un gráfico del mapamundi (ADBC) se volvían a leer del CD cada vez que volvías de un combate o entrabas al mapamundi. Ahora se guarda una copia en un hueco libre de la memoria y se recupera de ahí. Si algo la estropeara, el juego lo detecta y la lee del CD como antes.

2. Juntar varias lecturas en una

  • Las 5 imágenes del menú se leían una a una. Las pusimos seguidas en el disco y ahora se leen de una vez.
  • Las tres fuentes del inicio de combate también se leen ahora en una sola lectura.

3. Pedir las cosas al CD más deprisa

  • El juego mandaba los comandos del CD de uno en uno, uno por fotograma. Ahora los encadena en el mismo fotograma, y cada lectura arranca antes.

4. Comprimir mejor (LZSA2)

  • Los cuatro bloques grandes del juego (combate, mapa, mapamundi y menú) están ahora comprimidos con un método más eficaz: ~30 % menos datos que leer del CD.

5. Descomprimir mientras se lee

  • Antes el juego leía todo el bloque y, con el CD ya parado, lo descomprimía. Ahora descomprime a la vez que van llegando los datos, así que la descompresión queda prácticamente "escondida" dentro de la lectura.

6. Reordenar el disco (se nota en DuckStation y en consola real)

  • La música está ahora junto a los datos de combate y mapa, en vez de al final del disco.
  • Los datos de cada mapa y sus monstruos estaban en dos ficheros enormes, muy separados. Los hemos intercalado para que el trozo de cada mapa vaya seguido del de sus monstruos.

7. Otros

  • La fuente se sube a la pantalla por filas de 16 letras en vez de letra a letra. No se nota en el emulador, pero en consola real ahorra unas mil esperas a la tarjeta gráfica en cada carga.
  • Arreglamos un fallo antiguo de la traducción. En DuckStation (y probablemente en consola real) la imagen salía como una franja estrecha. No tenía que ver con los tiempos de carga, pero salió a la luz al probar en DuckStation.

Resultado total (segundos ahorrados por transición)

TransiciónPCSX-ReduxExtra en DuckStation / consola real
Inicio de combate~2,5 s—
Abrir el menú~1,7 s~0,3 s más
Cerrar el menú (al mapamundi)~1,25 s—
Combate → mapa~1,1 s~0,3 s más
Entrar en una zona~0,9 s~0,85 s más
Mapa → mapamundi~0,75 s—

Todo está probado en el juego por ti, integrado en workflow.sh y guardado en GitHub.

Lo último que estaba mirando (aún sin implementar): un compresor más fuerte (LZMA) reduciría otro 10–20 % los datos de combate, menú, mapa y mapamundi, aunque descomprime más despacio.