[Dreamcast] ¿Porqué no se me esá liberando la memoria?

Started by KeiDash, May 08, 2018, 09:18:16 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

KeiDash

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...

FreeYourMind

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.

KeiDash

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.