Tengo un problema curioso en Gp2x Wiz (de momento sólo he probado aqui).
Resulta que al hacer un memory_free para saber la memoria disponible, por ejemplo al iniciar el juego despues de cargar 2 o 3 recursos, esta deberia enseñar un valor fijo en todas las ejecuciones, pero no es así...
Lo que me preocupa es que me dice 7 megas libres pero a veces ha llegado a poner 8 e incluso 9.
Entiendo que el origen de la diferencia podria ser algun proceso del menu de la consola ajeno al juego, que ejecute o consuma algun recurso variable, pero el juego en si el solito deberia presentarme valores siempre fijos.
Encima que repito siempre el mismo proceso, o sea, enciendo la consola y me voy directo a ejecutar el juego, asi que el menu no deberia cambiar mucho estos valores...
El problema que tengo con esto, es que tengo la memoria a tope en algunos puntos donde la libero toda antes de cargar mas cosas, pero como resultado de esto, como los nuevos recursos estan a tope de las capacidades de la consola, hay veces que el juego se sale al menu por falta de memoria para su carga (en este caso no pone Abort pero si Killed), pero otras veces no lo hace, me imagino que es cuando estos valores de memoria disponible estan un pelin mas altos...
explica un poco mas, enumera que aplicaciones corres desde que enciendes la consola y en consumo de memoria en cada corrida de tu programa... describe todo, paso a paso lo que haces y los resultados... (no pongas un video...)
Enciendo la consola, entro en el menu de juegos y ejecuto el juego.
El juego carga algunos recursos y al principio dle primer proceso imprimo la memeory_free, solo esto.
El juego va hacer siempre lo mismo, o sea cargar los mismos recursos, y yo siempre hago lo mismo, enciendo la consola y ejecuto el juego.
cada vez que enciendes la consola y ejecutas el juego da valores diferentes? o enciendes la consola, ejecutas el juego varias veces?
o sea:
1) enciendes, ejecutas, apagas, enciendes, ejecutas, apagas, enciendes, ejecutas, apagas, etc...
o
2) enciendes, ejecutas, sales del juego, ejecutas, sales del juego, ejecutas, etc...
(nota: si alguna vez el juego no arranca por falta de memoria y lo vuelves a arrancar, ya no cuenta como "enciendo, ejecuto", hay 2 ejecuciones de programas...)
comenta tambien version de firmware, y cuando modificacion que tengas en la consola.
Quote from: SplinterGU on September 26, 2011, 12:27:43 PM
cada vez que enciendes la consola y ejecutas el juego da valores diferentes? o enciendes la consola, ejecutas el juego varias veces?
o sea:
1) enciendes, ejecutas, apagas, enciendes, ejecutas, apagas, enciendes, ejecutas, apagas, etc...
o
2) enciendes, ejecutas, sales del juego, ejecutas, sales del juego, ejecutas, etc...
(nota: si alguna vez el juego no arranca por falta de memoria y lo vuelves a arrancar, ya no cuenta como "enciendo, ejecuto", hay 2 ejecuciones de programas...)
comenta tambien version de firmware, y cuando modificacion que tengas en la consola.
He probado de las 2 formas, y en ambas los valores varian.
La version no se, te lo digo luego, pero tambien probaré en la Caanoo.
necesito saber resultados de la forma 1, tomando nota a consciencia...
por ejemplo, si corres de la forma 2, y me dices que lo hiciste de la forma 1... entonces no podre darte una solucion... necesito exacto paso a paso... asi sea, entras y salis al menu de la consola 2 o 3 veces, pones y quitas la SD, cambias el volumen, entras a una opcion de configuracion o pulsas botones mientras bootea... incluso si apagas mal la consola puede afectar si esta hace que se chequee la SD o no, en el arranque... lo que hagas, exactamente todo lo que hagas...
intenta que la consola se apague correctamente tras cada corrida/encendida.
necesito exactamente los pasos que has hecho en cada prueba, para poder pensar una solucion/causa correcta del problema... con datos no concretos no le veo solucion...
Jolin, no me explico bien o que ?
A ver si asi entiendes....
LOOP
Enciendo_la consola_en_su_boton();
Entro_en_el_juego();
say(memory_free);
Salgo_del_juego();
Apago_la_consola_en_su_boton();
FRAME;
END
no se me ocurre nada... pone un ejemplo...
solo falta ponerte los valores... luego en casa ya lo hago y pruebo en caanoo a ver.
Mi insinto me hace pensar que tambien pueda ser por la mochila
la mochila consume, pero entiendo que estas probando siempre con el mismo ejecutable... si no es asi, entonces no me estas contando todo... cuando digo que me cuentes el detalle de todo lo que haces, es todo... entende que cuando hay un bug donde no hay con que probar, quien me lo cuenta es mis ojos y oidos... si vos te saltas detalles entonces no tengo una vision completa de lo que pasa...
Ya solo me falta bajarme los pantalones para enseñarte todo ;D
Quote from: FreeYourMind on September 26, 2011, 05:30:04 PM
Ya solo me falta bajarme los pantalones para enseñarte todo ;D
de eso paso...
pero entiende que yo no estoy viendo el problema en vivo y en directo, asi que todo detalle que me des me ayuda a entender el problema... mejor es que me pases un ejemplo... recuerdas cuando tenias el problema con la mochila y no me decias que usabas mochila y a mi me funcionaba? bueno, cuanto mas detalles me pases es mejor para que yo entienda que pasa... si saltas algun detalle la cosa se complica...
por eso, para hacer testing de bugs, lo mejor son los resportes de los no programadores, porque no asumen cosas y uno cuando dice que te pasen los detalles, hasta te dicen con que dedo presionaron el boton de encendido... un programador (a veces) mal asume cosas y no te cuenta todo, porque el no le ve relacion al problema... pero el peor error de un programador es asumir.
Probado en Wiz,y Caanoo.
1 - No cargo recursos
2 - He usado parametro mochila (aunque no cargue recursos)
Program TestMem;
import "mod_wm"
import "mod_video"
import "mod_key"
import "mod_scroll"
import "mod_timers"
import "mod_time"
import "mod_text"
import "mod_string"
import "mod_mouse"
import "mod_map"
import "mod_proc"
import "mod_sound"
import "mod_file"
import "mod_rand"
import "mod_screen"
import "mod_grproc"
import "mod_draw"
import "mod_math"
import "mod_joy"
import "mod_mem";
BEGIN
set_mode(320, 240, 16);
set_fps(60, 0);
write(0, 200, 90, 0, memory_free());
write(0, 200, 100, 0, memory_free()/1024000); // MegaBytes
LOOP
FRAME;
END
END
Resultados:
caanoo
59355136
57
59576320
58
59523072
58
...
Wiz:
16261120
15
(no lo he he apuntao)
14
...
estas pruebas son, apagando la consola en cada uno de los resultados, cierto?
1 MB no es 1024000 es 1048576 = 1024*1024.
por otro lado, prueba hacer write_int y asignar los valores a esas variables int dentro del loop... no sea cosa que este en background el core del operativo con algun servicio o descargando algo...
otra cosa, estas con la consola conectada por cable? con driver de red? o la tienes sola, y pones y quitas la memoria?
por otro lado, antes y despues de arrancar el juego pon un
echo ---------------- >> log
cat /proc/uptime >> /log
ps -ef >> log
sync
juego...
ps -ef >> log
echo ---------------- >> log
sync
cada vez que reinicies la consola, copia el archivo de log y subilos aca.
a ver que da eso...
El write_int congela bennu, lo se porque tuve que cambiarlas a write, eso tampoco lo entiendo, hay tipos de variables que solo funcionan con write_int y otras con write...
no congela, me canso de usarlos...
int a;
write_int(... &a);
loop
a=lala();
frame;
end
eso no congela, pone el ejemplo que decis se congela.
write_int(0, 200, 90, 0, memory_free());
write_int(0, 200, 100, 0, memory_free()/1024000);
(http://forum.bennugd.org/index.php?action=dlattach;topic=2686.0;attach=2164)
write_int(0, 200, 90, 0, &memory_free());
write_int(0, 200, 100, 0, &(memory_free()/1024000));
ERROR: Can't get the address of an inmediate value
No hagas una llamada a una función usando write_int con &.
Write_int se actualiza solo, lo que debes pasarle es una variable, tal como ha puesto Splinter.
Wiz
a = memory_free();
b = memory_free()/1048576;
write_int(0, 200, 90, 0, &a);
write_int(0, 200, 100, 0, &b);
Output:
15069184
14
14938112
14
Quote from: SplinterGU on September 26, 2011, 06:47:37 PM
1 MB no es 1024000 es 1048576 = 1024*1024.
por otro lado, prueba hacer write_int y asignar los valores a esas variables int dentro del loop... no sea cosa que este en background el core del operativo con algun servicio o descargando algo...
otra cosa, estas con la consola conectada por cable? con driver de red? o la tienes sola, y pones y quitas la memoria?
por otro lado, antes y despues de arrancar el juego pon un
echo ---------------- >> log
cat /proc/uptime >> /log
ps -ef >> log
sync
juego...
ps -ef >> log
echo ---------------- >> log
sync
cada vez que reinicies la consola, copia el archivo de log y subilos aca.
a ver que da eso...
Test del ultimo prg en Wiz con:
echo ---------------- >> log
cat /proc/uptime >> /log1
ps -ef >> log
sync
#!/bin/sh
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../bgd-runtime
PATH=$PATH:../bgd-runtime
echo 2 > /proc/cpu/alignment
bgdi TestMem.dcb
cd /usr/gp2x
exec /usr/gp2x/gp2xmenu
ps -ef >> log
echo ---------------- >> log
sync
Output
14675968
13
log:
----------------
PID Uid VmSize Stat Command
1 root 532 S init [3]
2 root SW< [kthreadd]
3 root SW< [ksoftirqd/0]
4 root SW< [events/0]
5 root SW< [khelper]
38 root SW< [kblockd/0]
42 root SW< [kseriod]
64 root SW [pdflush]
65 root SW [pdflush]
66 root SW< [kswapd0]
67 root SW< [aio/0]
199 root SW< [mtdblockd]
200 root SW< [nftld]
214 root SW< [ubi_bgt0d]
215 root SW< [ubiblockd]
222 root SW< [kidle_timeout]
230 root SW< [kmmcd]
242 root SW< [ubifs_bgt0_0]
267 root 456 S < /sbin/udevd --daemon
613 root 880 S -sh
665 root SW< [mmcqd]
681 root SW< [ubi_bgt1d]
684 root SW< [ubifs_bgt1_0]
687 root SW< [loop7]
707 root 876 S /bin/sh ./TestMem.gpe
733 root 928 R ps -ef
---------------------
14692352
14
----------------
PID Uid VmSize Stat Command
1 root 532 S init [3]
2 root SW< [kthreadd]
3 root SW< [ksoftirqd/0]
4 root SW< [events/0]
5 root SW< [khelper]
38 root SW< [kblockd/0]
42 root SW< [kseriod]
64 root SW [pdflush]
65 root SW [pdflush]
66 root SW< [kswapd0]
67 root SW< [aio/0]
199 root SW< [mtdblockd]
200 root SW< [nftld]
214 root SW< [ubi_bgt0d]
215 root SW< [ubiblockd]
222 root SW< [kidle_timeout]
230 root SW< [kmmcd]
242 root SW< [ubifs_bgt0_0]
267 root 456 S < /sbin/udevd --daemon
614 root 880 S -sh
668 root SW< [mmcqd]
682 root SW< [ubi_bgt1d]
687 root SW< [ubifs_bgt1_0]
690 root SW< [loop7]
710 root 876 S /bin/sh ./TestMem.gpe
738 root 928 R ps -ef
bue... pues no...
a ver...
primera pregunta... cuando se queda en el loop, los valores en pantalla se mueven o permanecen estaticos? si se mueven, lo hacen para arriba o para abajo o ambos sentidos?
script
#!/bin/sh
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../bgd-runtime
PATH=$PATH:../bgd-runtime
echo 2 > /proc/cpu/alignment
echo - uptime --------------- >> log
cat /proc/uptime >> log
echo - ps -ef (1)--------------- >> log
ps -ef >> log
sync
echo - bgdi TestMem --------------- >> log
bgdi TestMem.dcb >> log
echo - ps -ef (2)--------------- >> log
ps -ef >> log
echo - fin --------------- >> log
sync
cd /usr/gp2x
exec /usr/gp2x/gp2xmenu
prg
import "mod_time"
import "mod_string"
import "mod_mem";
import "mod_say";
private
m;
BEGIN
m = memory_free();
say( "mem_free() -> " + m + " [ " + format(m / (1024.0*1024.0),2) + " MB ]" );
END
proba esto, y en cada corrida guarda el archivo log y subilos aca, no los copies, atachalos.
Sigues con tu say... pero en wiz y caanoo como ves tu el say ?
no necesitas ver nada, tienes que adjuntar los archivos log aqui...
hazte un curso de unix urgente... ya te lo dije varias veces, pero te encaprichas en no hacerlo... te ayudaria muchisimo de formas que no te imaginas a resolver los problemas...
aca tenes un link de un curso cortito, basico y bastante claro...
http://www.todoprogramas.com/manuales/ficheros/2009/10.3555.1460.pdf
aca hay otro para complementar el anterior... es mas reducido, pero toca algunos temas/detalles que el otro no... (por si solo le falta para ser basico)
http://www.todoprogramas.com/manuales/ficheros/2008/12.9177.6781.pdf
otro mas completo, pero ya son 70 y pico de paginas
http://www.todoprogramas.com/manuales/ficheros/2008/12.3466.8445.pdf
espero no ofender con estas sugerencias, pero te aseguro que te ayudara a entender mucho de lo que preguntas.
Macho si ahora curro sobre Linux, es una question de tiempo.
Luego te hago la prueba cuando llegue a casa.
entonces estos cursos te vienen bien... los 2 ultimos tocan tambien sobre compilacion en C.
Gracias, pero antes que eso tengo miles de lineas de codigo con comentarios en chino que leer xD
Quote from: SplinterGU on September 27, 2011, 12:40:06 PM
aca tenes un link de un curso cortito, basico y bastante claro...
http://www.todoprogramas.com/manuales/ficheros/2009/10.3555.1460.pdf (http://www.todoprogramas.com/manuales/ficheros/2009/10.3555.1460.pdf)
aca hay otro para complementar el anterior... es mas reducido, pero toca algunos temas/detalles que el otro no... (por si solo le falta para ser basico)
http://www.todoprogramas.com/manuales/ficheros/2008/12.9177.6781.pdf (http://www.todoprogramas.com/manuales/ficheros/2008/12.9177.6781.pdf)
otro mas completo, pero ya son 70 y pico de paginas
http://www.todoprogramas.com/manuales/ficheros/2008/12.3466.8445.pdf (http://www.todoprogramas.com/manuales/ficheros/2008/12.3466.8445.pdf)
espero no ofender con estas sugerencias, pero te aseguro que te ayudara a entender mucho de lo que preguntas.
Grax por esto, no solo son utiles a free
:)
yo tambien me estoy leyendo los cursos esos de unix xDDDD aunq claro , toy suponiendo q mi ubuntu es 100% identico xDD
te va a servir para tu ubuntu...
Quote from: SplinterGU on September 26, 2011, 10:35:58 PM
bue... pues no...
a ver...
primera pregunta... cuando se queda en el loop, los valores en pantalla se mueven o permanecen estaticos? si se mueven, lo hacen para arriba o para abajo o ambos sentidos?
script
#!/bin/sh
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../bgd-runtime
PATH=$PATH:../bgd-runtime
echo 2 > /proc/cpu/alignment
echo - uptime --------------- >> log
cat /proc/uptime >> log
echo - ps -ef (1)--------------- >> log
ps -ef >> log
sync
echo - bgdi TestMem --------------- >> log
bgdi TestMem.dcb >> log
echo - ps -ef (2)--------------- >> log
ps -ef >> log
echo - fin --------------- >> log
sync
cd /usr/gp2x
exec /usr/gp2x/gp2xmenu
prg
import "mod_time"
import "mod_string"
import "mod_mem";
import "mod_say";
private
m;
BEGIN
m = memory_free();
say( "mem_free() -> " + m + " [ " + format(m / (1024.0*1024.0),2) + " MB ]" );
END
proba esto, y en cada corrida guarda el archivo log y subilos aca, no los copies, atachalos.
- uptime ---------------
33.53 5.45
- uptime ---------------
24.43 3.70
- uptime ---------------
26.15 4.57
y las otras lineas del log?
Se quea la pantalla en negro y freeze, al encender de nuevo la consola solo estan estas en el log...
imposible... debes tener el script en formato DOS, con los saltos de linea de DOS... no puede ser...
si te leyeras los cursos de unix ayudaria un monton a resolver los temas... estamos perdiendo el tiempo en cosas muy simples y basicas...
bueno, ya paso, cuando tenga tiempo te prometo que lo miro...
Dejate de tonterias, uso el notepad++ y no tengo problemas de formato hace años...
que uses el notepad no tiene nada que ver, pero no te preocupes, cuando pueda lo miro...
De todas formas, la memoria libre puede variar de una ejecución a otra: tienes un SO por debajo que debe administrar el espacio libre, y no siempre lo hace de la misma forma, porque en ocasiones los programas no se ejecutan en el mismo orden (sobre todo, si usan hilos) y se almacenan en distintas partes de la memoria, dejando huecos más o menos grandes (y algunos huecos pequeños son inútiles).
A eso le puedes sumar algún dispositivo HW que usa distintas partes de la RAM para que se desgaste por igual (por ejemplo, las SD tienen un dispositivo que lo hace, y cada vez que se lee algo, esta se vuelve a grabar en otra parte).
Por esto mismo tuve que retrasar la salida de uno de mis juegos (y aun sigue sin salir): la GP2X no tenía suficiente memoria RAM para cargar algunas animaciones y tuve que dividir los FPGs como buenamente pude (a ver si ahora con WIZ puedo volver a la distribución original).
Consejo: optimiza el uso de la memoria, y deja siempre 5 MB o 10 MB de sobra respecto a la memoria disponible, para que no te pase esto.
si, es correcto lo que decis, pero bueno...
Quote from: Drumpi on October 05, 2011, 07:44:55 PM
De todas formas, la memoria libre puede variar de una ejecución a otra: tienes un SO por debajo que debe administrar el espacio libre, y no siempre lo hace de la misma forma, porque en ocasiones los programas no se ejecutan en el mismo orden (sobre todo, si usan hilos) y se almacenan en distintas partes de la memoria, dejando huecos más o menos grandes (y algunos huecos pequeños son inútiles).
A eso le puedes sumar algún dispositivo HW que usa distintas partes de la RAM para que se desgaste por igual (por ejemplo, las SD tienen un dispositivo que lo hace, y cada vez que se lee algo, esta se vuelve a grabar en otra parte).
Por esto mismo tuve que retrasar la salida de uno de mis juegos (y aun sigue sin salir): la GP2X no tenía suficiente memoria RAM para cargar algunas animaciones y tuve que dividir los FPGs como buenamente pude (a ver si ahora con WIZ puedo volver a la distribución original).
Consejo: optimiza el uso de la memoria, y deja siempre 5 MB o 10 MB de sobra respecto a la memoria disponible, para que no te pase esto.
Si supieras la ya optimizada que esta no me decias eso xD
Creeme, nunca está lo más optimizado posible, siempre hay alguna forma de usar menos recursos: yo llevo haciéndolo con el motor de scroll tileado desde 2004.
¿Has probado a usar gráficos de 8bits? ¿Y con paletas propias para cada proceso? ¿Y fusionando gráficos? o separando para ahorrar los huegos libres ¿La música está en OGG? ¿Has probado el formato S3M, XM, MOD o IT, a ver si te sirven? ;D