https://www.segasaturno.com/portal/viewtopic.php?f=19&t=8570&p=104441#p104441
-----------------------------------
KeiDash
01 Junio 2018, 09:47 AM

Re: Tutorial BennuGD De Indiket Para Dreamcast
-----------------------------------
[quote user="Ryo Suzuki" post="104436"]Pues se ve que es una cosa heredada de la mala gestión de la RAM que se ve que ya tiene KOS, creo recordar que me comentó Indiket, pero yo lo que hago aunque es un poco chapuzas es reutilizar variables y recargar assets en la misma después de su correspondiente descarga y parece que me funciona mejor.

Ya me dirás si te funciona. Ya sé que parece una tontería...[/quote]

Gracias por tu contesta amigo Ryo.

Esa solución que comentas es una "posible solución" y nótese las comillas, que explico en el tuto que tengo publicado. [b]Realmente no es una solución[/b]. Lamentablemente eso que comentas no funciona, me explico.

Realmente cuando cargas un FPG, el valor devuelto que almacenas en la misma variable como tu comentas, [b]es solo el identificador del FPG[/b] cargado en memoria, no es el fpg en si mismo. En este caso, los dos FPG se quedan en memoria y no se pueden borrar o el indicador de memoria ram libre no funciona, te pongo un ejemplo real:

[code linenumbers=true]
Process Main()
Private
	int fpgid = 0;
End
Begin

	define_region(1, 0, 0, 640, 480);
	set_mode(640,480, MODE_8BITS);

	fpgid = set_FPG("/cd/files/graphs/screen3.fpg");
	
	p_sMemFree = format((memory_free()MB),0);

	write(0, 500, 60, ALIGN_TOP_RIGHT, "Free Mem:");
	write_var(0, 580, 60, ALIGN_TOP_RIGHT, p_sMemFree);

	write(0, 640/2, 480/2, ALIGN_CENTER, "PRESS SPACE");
	
	Repeat
		frame;
	Until(key(_space))
	
	UNLOAD_FPG(fpgid);
	
	CLEAR_SCREEN();
	DELETE_TEXT(ALL_TEXT);
	
	fpgid = set_FPG("/cd/files/graphs/screen4.fpg");
	
	p_sMemFree = format((memory_free()MB),0);
		
	write(0, 500, 60, ALIGN_TOP_RIGHT, "Free Mem:");
	write_var(0, 580, 60, ALIGN_TOP_RIGHT, p_sMemFree);

	write(0, 640/2, 480/2 - 10, ALIGN_CENTER, "CARGA FINALIZADA");
	write(0, 640/2, 480/2, ALIGN_CENTER, "PRESS SPACE");
	
	Repeat
		frame;
	Until(key(_space))
	
End
[/code]

Si te fijas, hago lo que tu comentas, reasigno el valor devuelto por load_fpg() a la misma variable,[b] pero los dos siguen en memoria ¿Cómo se que siguen en memoria?[/b] Pues fácil, comprobando la memoria libre en cada caso, antes y depués de cargar y descargar. Este mismo ejemplo exportado a el emulador, muestra como la memoria RAM a pesar de hacer un UNLOAD_FPG() sigue teniendo la misma RAM ocupada.

[align=center]
 [img]http://www.segasaturno.com/portal/files/images/1551/image_001_1527837263_192211.png[/img] 
 [img]http://www.segasaturno.com/portal/files/images/1551/image_002_1527837275_345746.png[/img] [/align]

Esto indica que: 

1. O el UNLOAD_FPG() no funciona, por lo que más me decanto ya que el juego me da cuelgues de out of memory cuando tengo varias cosas cargadas y hago UNLOADS de los mismos y vuelvo a cargar más.

2. Que el muestreo de la memoria RAM libre tampoco funciona, cosa que no se que pensar, ya que con el punto 1 que indico es muy evidente que la RAM se satura.

Si te fijas en las imágenes, la RAM es la misma tanto al cargar como al descargar los elementos de la RAM, por eso me decanto más por el primer punto.

No se si se me está pasando algo la verdad ¿Tú qué opinas?


