Hola a todos! ¿Qué tal va el desarrollo en bennu? ;D
Yo llevo unas dos semanas optimizando el código, y me estoy encontrando con un caso que no se como controlar en mi caso, me explico.
Estoy desarrollando para Dreamcast. Las pruebas base las hago en PC, luego paso al emulador y posteriormente si va todo bien en los dos previos, paso a consola real.
Me estoy encontrando con problemas de liberación de momoria ram en emulador y consola, ya que estoy descargando elementos cargados después de usarlos pero parece que no se descargan ya que memory_free() me está devolviendo cada vez menos ram (evidentemente por que se está ocupando) y me está dando el sistema error de out of memory entre otros al intentar seguir con la carga de procesos.
¿Qué es lo que estoy haciendo?
Bueno la idea es la siguiente:
- Mostrar pantalla principal
- Seleccionar nivel
- Jugar
En cada uno de estos pasos, libero la carga de ficheros y procesos del paso anterior. Estoy cargando en memoria ficheros FPG, FNT y WAV en cada paso, algunos diferentes y otros iguales, pero descargo lo que no uso, por ejemplo procesos y ficheros fnt, fpg y wav, pero a mi me da la sensación que no se está descargando nada de nada..
Para que podáis haceros una idea de cómo hago todo este proceso, os muestro una sección de código dónde hago lo que comento. Indicar que la consola Dreamcast, dispone de 16Mb de RAM y que con este proceso se me queda en menos de un mega a pesar de que mande a liberar elementos. Indicar que, a pesar de que toda la ejecución del código esté dentro de un Loop y que de la posibilidad de recarga, eso no está pasando porque las sub llamadas eson funciones o procesos que hasta que no terminen de ejecutarse, no continúa el siguiente paso
(como el ejemplo de:
Repeat
frame;
Until(gi_TrackLoaded == true)
)
Process iSCREEN_displayMainMenu()
Private
byte pb_Continue = 0;
int pi_SelectedTrack = 0;
int proc_Ready = 0;
int proc_Track = 0;
int proc_Flash = 0;
int trackId = 0;
Begin
gi_TrackLoaded = false;
LET_ME_ALONE();
Loop
if(OPTIONSEL != -1)
//EN ESTE PUNTO, FREE_MEM() ME DICE QUE HAY 10MB LIBRES
pi_SelectedTrack = iSCREEN_ActionSelectTrack();
CLEAR_SCREEN();
DELETE_TEXT(ALL_TEXT);
trackId = pi_SelectedTrack;
displayLoading(true);
iPLAYER_unload_BasicSounds(); //AQUÍ DESCARGO FICHEROS WAV
iSCREEN_UnloadMainFPG(); //AQUÍ DESCARGO FICHEROS FPG
//EN ESTE PUNTO, FREE_MEM() ME DICE QUE HAY 6.432MB LIBRES, A PESAR DE HABER LIBERADO MEMORIA
fpg_SCR4_RDY = load_fpg(graphPath + "screen4RDY.fpg");
//OBTENEMOS CANCION EN ARRAY Y MEMORIA:
proc_Track = iTRACK_setTrack(trackId);
//MOSTRAMOS PANTALLA READY CON LOS GRÁFICOS DE fpg_SCR4_RDY:
proc_Ready = iSCREEN_DisplayReady();
//Esperamos a que la carga de los datos del tema se complete
Repeat
frame;
Until(gi_TrackLoaded == true)
//CIERRO EL PROCESO Y SUS HIJOS PARA LIBERAR MEMORIA
if(exists(proc_Track)) say("proceso track cerrado"); SIGNAL(proc_Track, S_KILL_TREE); end
//3.Mb libres
//CARGAMOS NUEVOS ASSETS (FPG) PARA EL GAMEPLAY
if(iGAME_LoadGameAssets() == 1)
displayLoading(false);
else
write(0, 640/2, 480/2, 0, "ERROR DE CARGA DE CANCION");
end
if(exists(proc_Ready)) say("proceso ready cerrado"); SIGNAL(proc_Ready, S_KILL_TREE); end
//OCULTAMOS READY Y ESPERAMOS:
proc_Flash = iSCREEN_DisplayFlash(640/2, 480/2, 1);
//EN ESTE PUNTO, FREE_MEM() ME DICE QUE HAY 2.182MB LIBRES, A PESAR DE HABER LIBERADO MEMORIA
Repeat
frame;
Until(gi_GameLoadFinished == 1)
gi_GameLoadFinished = -1;
//CIERRO EL PROCESO Y SUS HIJOS PARA LIBERAR MEMORIA
if(exists(proc_Flash)) say("proceso flash cerrado"); SIGNAL(proc_Flash, S_KILL_TREE); end
//AQUÍ DESCARGO FICHEROS FPG
if (fpg_SCR4_RDY != 0) UNLOAD_FPG(fpg_SCR4_RDY); end
CLEAR_SCREEN();
DELETE_TEXT(ALL_TEXT);
//EN ESTE PUNTO, FREE_MEM() ME DICE QUE HAY 700KB LIBRES, A PESAR DE HABER LIBERADO MEMORIA
//AQUÍ SE INICIALIZARÍA EL JUEGO PERO NO HAY SUFICIENTE MEMORIA PARA CONTINUAR
gi_PROC_Game = RunGame(trackId);
While(gi_trackEnded != 1)
frame;
End
gi_trackEnded = 0;
if(exists(gi_PROC_Game)) SIGNAL(gi_PROC_Game, S_KILL_TREE); end
end
end
End
Si esto es correcto ¿Qué está pasando que no se liberan de memoria los elementos? ¿Qué estoy haciendo mal que la memoria no se libera?
Espero de vuestra ayuda porque si no se me libera la memoria no se cómo voy a poder continuar...
Hola. Creo recordar que sobre este tema con bennu en Dreamcast ya se ha hablado en el foro, por favor busca los mensajes pero creo que era un bug del port.
Cierto, culpa mía no lo había visto.
El link es http://forum.bennugd.org/index.php/topic,4510.15.html
Estaría bien que borraran este post que yo no puedo.