Buenas a todos!
De nuevo vengo a buscar ayuda en este foro porque ya llevo con esto 2 semanas y no le veo sentido alguno a qué está pasando.
Informo que estoy desarrollando en PC pero para Dreamcast, así que las pruebas en PC son siempre satisfactorias, mientras que en Dreamcast estoy teniendo problemas continuos y no se si es por mi código/manejo del framework o es un fallo en sí de BennuGd. Indico que las pruebas que realizo son
PC > Emulador > Consola real.
Los fallos los estoy teniendo en emulador, no he llegado al paso de la consola real, pero quiero saber si estoy realizando yo algo mal o puede ser un fallo real del sistema.
Os pongo en sitaución con el caso, La prueba es la siguiente:
QuoteEl método Main, llama a 2 sub-procesos hijos. El proceso A) muestra un gráfico en pantalla, el proceso B) se encarga de DORMIR y DESPERTAR al proceso A) cada un tiempo determinado (3 seg aprox.), no es más.
Como indico, en PC funciona correctamente, pero en Dreamcast (emulador en este caso) cuando lleva un minuto o dos de ejecución el juego, el emulador se cuelga dando el error siguiente:
QuoteRelocated dynarec blocks: 1652 KB before, 1644 KB new, 8280 bytes diff, 0.49%
[GPF]unhandled access to: <una posición en memoria>
Evidentemente el emulador me está dando un error intentando acceder a una posición en memoria concreta, lo que no entiendo es porqué
El error se está provocando al utilizar los signals ¿Que cómo lo se? Pues porque si comento las líneas de código donde están los signals, el error desaparece y el juego ya no se cierra ni da error. Y el código? Aquí está:
GLOBAL
int fpgFile = 0;
END
Process Main()
Private
int screenId = 0;
string p_sMemFree = "";
End
Begin
//En caso de que sea Dreamcast
fpgFile = LOAD_FPG("/cd/assets.fpg");
screenId = ProcToTest();
SignalTester(screenId);
Loop
frame;
End
End
Process SignalTester(int screenId)
Private
Begin
frame;
Loop
Waiting(TimeToMiliseconds("3.000"));
Repeat
frame;
Until(gi_TimeFinished == 1)
gi_TimeFinished = -1;
if(EXISTS(screenId))
SIGNAL(screenId, S_SLEEP_TREE);
end
CLEAR_SCREEN();
Waiting(TimeToMiliseconds("3.000"));
Repeat
frame;
Until(gi_TimeFinished == 1)
gi_TimeFinished = -1;
if(EXISTS(screenId))
SIGNAL(screenId, S_WAKEUP_TREE);
end
frame;
End
End
Process ProcToTest()
Private
Begin
FILE = fpgFile;
GRAPH = 1;
X = 640/2;
Y = 480/2;
Z = 3;
loop frame; end
End
Indicar que el tiempo de espera se ejecuta en otro proceso con el gettimer() que simplemente va consultando el tiempo en milisegundos para generar la espera. Esto no está provocando errores de ningún tipo, por si os genera la duda. En cuanto comento los SIGNALS como indico, se eliminan todos los problemas.
¿Está el código bien?¿No es la manera de realizarlo?
Necesito de vuestra ayuda!!
Saludos y gracias de antemano.
Aunque pueda ser un error del port, deberias probarlo en la consola para salir de dudas, porque puede que el emulador no soporte alguna instruccion del juego, porque seguramente el emulador no sea perfecto y haya mas juegos de dreamcast oficiales que tambien fallen de forma similar.
Antes probaria en otros emuladores
Quote from: FreeYourMind on June 11, 2018, 02:05:07 PM
Aunque pueda ser un error del port, deberias probarlo en la consola para salir de dudas, porque puede que el emulador no soporte alguna instruccion del juego, porque seguramente el emulador no sea perfecto y haya mas juegos de dreamcast oficiales que tambien fallen de forma similar.
Antes probaria en otros emuladores
Pues vas a tener razón...
Resulta que lo he probado en demul y funciona perfectamente sin errores....Llevaba meses usando nullDC..que chasco :'D