Thyl-Thalion escribió:Probado con Pendrive USB Kingston de 256MB. Funciona. Probaré hoy con más cosas (PSP, HDD, otros pendrive). Molto bene !!!!
Erep escribió:esta va mucho mejor pero tarda mucho al cargar las canciones
Hermes escribió:Buenas
rodries siento no haber podido responderte antes, pero ayer estuve ocupado haciendo otra cosa y no podía probar la libreria y hoy he tenido un grave problema que no sabía si era debido a libfat o aun nivel mas bajo (driver usb) o era algo de mi programa y al final ha resultado ser, que sin darme cuenta había metido demasiada carga en el mezclador de audio que utiliza la interrupción de sonido.
El caso es que era muy raro. en cierto juego petaba cuando se cerraba/abria de nuevo un fichero y de una forma un tanto aleatoria: podía darse en el primer caso o despues de 20 intentos, según le diera.
Es algo que siempre me ha preocupado en sndlib, que el mezclado se produjera en la misma interrupción, pero que no tiene porque pasar nada sialvo que hagas algo similar a lo que mio (que era un mezclado externo a la librería y algo excesivo)
Por otro lado, ya no me da problema con los saves, pero si que parece que el dispositivo USB le cuesta algo pillarlo (uso una deteccion que busca si existe el directorio conveniente primero en el dispositivo USB y si no está en la SD). Sobre todo le cuesta cuando accede por primera vez, pero se resuleve repartiendo usleeps por doquier
Hermes escribió:Sobre guitarfun el programa necesita cachear en memoria las tres pistas Ogg (como maximo). En el programa original, en PS2, una pista la leia directamente del dispositivo y el resto desde memoria, para acortar la espera, pero decidí cachear las 3 porque por alguna razón, al reproducir el Ogg metía un pequeño parón leyendo de dispositivo a veces (no se si ahora se producirá o no, parece que no, pero he estado centrado en otras cosas y no me he dado cuenta)
El caso es que se deben cachear las pistas porque acceder a tres dispositivos a la vez, es demasiado lento. Quizá se podría hacer un hilo que fuera cargando poco a poco el fichero mientras se reproduce, pero sería algo complejo y añadiría un plus de proceso que a lo mejor, lo acabas pagando.
El problema es la velocidad de los dispositivos: en PC es una espera corta, con la SD es media y por lo que decís, por USB es demasiado lenta. Hay canciones que pueden transferir unos 25 MB entre los 3 Oggs.
rodries escribió:A mi también me ha ocurrido cosas similares, de hecho en una de las modificaciones del usbstorage.c en la carpeta ogc_io de la libfat en la linea 104 hay un comentario que he puesto:
usleep(50); // I don't know why I have to wait but it's needed
prueba a subir el usleep a 100 o 200 a ver si se te soluciona. Ese parche es para poder montar y desmontar el usb sin que se quede bloqueado el dispositivo.
rodries escribió:Pienso que podría intentar a ver como queda con un hilo con baja prioridad en 2º plano que vaya rellenando la memoria mientras se reproduce, no debería afectar al rendimiento ya que la lectura consume poca cpu
Lo que no pillo es lo de las 3 pistas, en las dos canciones que me he bajado solo hay 2 ogg guitar.ogg y song.ogg, aunque desconozco el formato FOF y puede que haya canciones con 3 ogg.
Si me lio te mandaré un privado para que me expliques el hilo de reproducción, es que tu código cuesta un egg seguirlo, está poco estructurado y funciones muy largas con muchos ifdef y if , aunque no es complicado de entender, solo que me pierdo muchas veces siguiendo la traza.
La verdad es que disfruto mas trajinando el código de tu juego que jugando
Edit:
Ya veo en el código que puede existir rhythm.ogg, ¿me puedas dar por privado un enlace a una canción que tenga 3 ogg?
Hermes escribió:Si, eso lo vi ayer.
Hay una cosa que me mosquea del uso USB y es que hace llamadas asíncronas a IOS, pero no parece tomarse muchas molestias
en comprobar si al entrar a ciertas funciones, puede haber una de estas llamadas en proceso: podría explicar por que se necesitan esos delays. Meter un delay está indicando que hay un proceso que trabaja en paralelo al que hay que esperar y solo se me ocurre que venga de ahí.
Hermes escribió:Si metes un hilo de "baja prioridad", tienes que tener en cuenta, sobre todo la prioridad de thread_ogg, puesto que en las canciones asume el rol de hilo permanente y las lecturas al realizarse desde memoria, interrumpen poco y encima tener en cuenta
que la lectura de ogg necesita datos del principio y del final del fichero por lo menos, antes de poder echar a andar.
Ademas ten en cuenta que podría afectar al Online... y por supuesto: trata de respetar el código de PC (el programa tiene mucho código y se vuelve mas lioso por éste hecho) y tambien recuerda que no debería estar trabajando durante la reproduccion de la lista de canciones (ahi se tira de dos oggs desde dispositivo ya que tiene poca carga de trabajo)
En PC no puedes fijar la prioridad tan a dedo como en la consola, por lo que no te aconsejo cachear ahí los ficheros, aparte de que no merece la pena en mi opinión.
Hermes escribió:Sobre las canciones de tres pistas, debes buscar packs de canciones de los Guitar Hero a partir del 2 que es el primero en dar la posibilidad de tocar el bajo (no confundir con "tocarse los bajos" ). Hacer canciones de estas, es algo que solo está al alcance de los profesionales y no te extrañes no haberlas visto antes: a mi me pasó en PS2 que monté el juego para usar solo dos pistas y cuando me encontré con una tercera pista se me quedó cara de gilipollas, porque si ya le costaba al bicho mover dos pistas, imaginate 3 (al final, no solo pudo con las tres, si no que pudo con dos jugadores, despues de algunos arreglos )
Saludos.
rodries escribió:
usa LWP_CondTimedWait para dar error si se produce un timeout, puede que se le haya olvidado usarlo en algun sitio que utilize una llamada asincrona y no controle el timeout, la verdad es que es algo lioso el código.
rodries escribió:
Ok, ya veremos a ver si se complica o no, si se me lia lo dejaré estar.
Una duda que tengo en thread_ogg es porque despues de cargar el track1 en memoria haces close y le asignas el valor 0x666 y ese es el valor que luego le pasas a ov_open.
y lo mismo con los otros 2 tracks restantes.
Edit:
ya me he dado cuenta de lo que has hecho en f_read, joe podias haber puesto un comentario
rodries escribió:Pienso que una mejora es que si son solo 2 ogg el tercer ogg no deberias de volver a leerlo ya que podrías reutilizar guitar.ogg, digamos que file[1]=file[2] mas o menos. Así se acortaría 1/3 la carga de las canciones que usen 2 ogg. ¿Ves alguna pega en esto?
fatInit(8, false);
fatSetDefaultInterface(PI_INTERNAL_SD);
usleep(1000*1000);
have_device=0;
{
char fat[7] = "fat0:/";
fat[3] = 48+PI_INTERNAL_SD;
dir = diropen(fat);
if (dir) {dirclose(dir); have_device|=1;fatEnableReadAhead(PI_INTERNAL_SD, 6, 64);}
usleep(200*1000);
fat[3] = 48+PI_USBSTORAGE;
dir = diropen(fat);
if (dir) {dirclose(dir); have_device|=2;fatEnableReadAhead(PI_USBSTORAGE, 6, 64);}
usleep(200*1000);
}
Hermes escribió:Por cierto, se me ha olvidado decirte que lo mismo que hace que no me liste el USB a mi, sobre todo en el primer acceso desde el arranque, hace que tu deteccion "mounted()" falle y en realidad, no estes usando cache alguna!!!
Yo uso algo asi:fatInit(8, false);
fatSetDefaultInterface(PI_INTERNAL_SD);
usleep(1000*1000);
have_device=0;
{
char fat[7] = "fat0:/";
fat[3] = 48+PI_INTERNAL_SD;
dir = diropen(fat);
if (dir) {dirclose(dir); have_device|=1;fatEnableReadAhead(PI_INTERNAL_SD, 6, 64);}
usleep(200*1000);
fat[3] = 48+PI_USBSTORAGE;
dir = diropen(fat);
if (dir) {dirclose(dir); have_device|=2;fatEnableReadAhead(PI_USBSTORAGE, 6, 64);}
usleep(200*1000);
}
Quizá sea algo exagerado con los tiempos, pero prefiero ser holgado que quedarme corto.
En PS2, yo tenía preparado el device USB de tal forma, que si abria el dispositivo con un open, me devolvia un error caracteristico si no había nada conectado y otro error si no estaba preparado (no se si aquí hay algo similar). De forma esa forma sabía si no habia dispositivo USB y si lo había, solo tenia que hacer un bucle de espera por un determinado tiempo que se cortaba en cuanto me devolviera un OK (es decir, se adaptaba a los tiempos de cada dispositivo que suele ser difente, obviamente)
Aqui como no hay nada de eso, pues lo mejor es meter una buena pausa al principio
rodries escribió:Pues la verdad es que no tengo ni idea de porque puede ser el fallo, pero me alegro mucho que te funcione la libfat sin problemas y como dicen en mi tierra si funciona no lo toques
El usleep que puse era porque al hacer fatunmont y famount para ver si se ha cambiado de llave usb no me detectaba el dispositvo y eso que al no cambiarla no intento ni siquiera inicializarla ya que el pid y el vid coinciden. Si quitas el usleep de la linea 104 y haces fatunmont y famount la llave dejar de funcionar casi siempre pero no me preguntes el porque.
En el gitarfun lo que he hecho es que el f_seek devuelva -1 por lo que no es seekeable y ya no va al final de la cancion a sacar informacion, el unico efecto negativo es que ov_time_seek ya no funciona pero solo lo usas para adelantar 30 segs el inicio de la cancion cuando estás en la lista, como ventaja es que inmediatamente se pone a reproducir en la lista. También he mejorado la carga al hacer que el tercer track sea igual al segundo sino existe rhythm.ogg por lo que en la mayoria de las canciones se acelera la carga 1/3 y ademas al no tener seek la apertura que antes tardaba 1,5 segundos te la ahorras y como son 2 tracks se ha ganado 3 segundos de carga adicionales. Como te comento el único efecto negativo es no poder reproducir a partir del segundo 30 en la lista de canciones.
A lo mejor mañana me pongo a hecharle un vistazo al thread de carga en 2ºplano
Ya veré de que humor me levanto.
También he mejorado la carga al hacer que el tercer track sea igual al segundo sino existe rhythm.ogg por lo que en la mayoria de las canciones se acelera la carga 1/3 y ademas al no tener seek la apertura que antes tardaba 1,5 segundos te la ahorras
if(midi_ritmo) sprintf(pathname,"%sguitar.ogg",list_songs[tema].path);
else sprintf(pathname,"%srhythm.ogg",list_songs[tema].path);
my_eof3=0;
fd3=open(pathname,O_RDONLY | O_BINARY, S_IREAD);
if(fd3>=0)
{
file[1].size=lseek(fd3,0,2);
lseek(fd3,0,0);
file[1].pos=0;
file[1].mem=malloc(file[1].size);
if(!file[1].mem)
{
close(fd3);
fd3=-1;
if(debug_mode) s_debug("Track #3: malloc fail");
}
else
{
delay_online=1;
n=read(fd3,file[1].mem,file[1].size);
delay_online=0;
close(fd3);
fd3=0x667;
if(n<file[1].size)
{
f_close(&fd3);
fd3=-1;
if(debug_mode) s_debug("Track #3: truncated file");
}
}
}
Hermes escribió:Si no se abre el fichero, aqui no se usa nombre alternativo, como si sucede en el caso de fd y fd2, donde si no existe guitar.ogg, se toma song.ogg o viceversa (pero eso solo pasa en el caso de que solo haya 1 ogg)
En la continuacion del codigo se puede ver que si fd3<0, no se abre el ogg de ritmo y ese guitar.ogg no es posible tomarlo a menos que exista un rhythm.ogg y ademas, esté seleccionado el bajo como instrumento. Además, se ve claramente que está separado porque aqui no se toma como un error el que fd3 sea menor que 0 ya que el resto del programa está preparado para ello.
Asi que no se que estás haciendo ahí, pero no tendrias que tocar nada
for(i=0;i<2000;i++)
{
ov_read(&vf,(void *) pcmout,MAX_PCMOUT,¤t_section);
ov_read(&vf2,(void *) pcmout,MAX_PCMOUT,¤t_section2);
}
rodries escribió:¿Tienes alguna variable gobal para saber si estás en la lista o en loading?
basicamente prondré en el f_seek if(loading) return -1;
En cuanto revise el código te lo subo para que le heches un vistazo y colgaré una versión compilada.
Hermes escribió:No, no uso ninguna variable global porque usos metodos distintos. los ogg de la lista se reproducen en la misma funcion, mientras que los ogg del juego se reproducen en un hilo aparte.
Y sobre lo de echar un vistazo, bastante jaleo tengo yo ahora como para mirarlo (por no tener, no tnego ni las canciones en la SD)
Hermes escribió:Por cierto, me estoy fijando en un problema poco conveniente en libfat. Por razones curiosas, necesito conocer el espacio libre en el dispositivo y en el caso de la SD, me lo devuelve de forma casi inmediata, mientras que por USB tarda un huevo, como 8 segundos.
Rastreando la función veo que se lee un solo sector si no está dentro de la cache y eso está mal: en la cache solo deberian entrar CLUSTERS y no sectores sueltos (asi no me extraña que vaya tan lento, si la FAT necesita acceder a todo el cluster y aqui se lee sector a sector...)
rodries escribió:Realmente no tienes ganancia con eso, ya que un cluster son 2 sectores, y si usas la readaheadcache tendras PageSize sectores contiguos leidos de golpe.
No recuerdo en que sitio lee el espacio disponible pero si me dices por donde anda le hecho un vistazo, a ver si me imagino como mejorar la velocidad.
Por ejemplo antes cuando habrias un fichero siempre iba hasta el final del fichero y usaba _FAT_fat_lastCluster que es lentisimo porque va saltando de cluster en cluster y cuando habrías un fichero grande tardaba un huevo, puede ser algo similar.
Hermes escribió:Ahi te has equivocado, compañero: el tamaño del cluster es variable y lo minimo que he visto, es utilizar 4 (en un dispositivo USB de 256MB). Pero ahora mismo acabo de probar una modificacion que asigna la cache en grupos de 8 sectores (con las pertinentes correcciones claro) y la cosa se ha acelerado por 4 (mi pendrive usar 4096 bytes por cluster, luego 512x8=4096)
Lo que si es verdad es que no deberias tratar de leer mas de un cluster desde un dispositivo USB, porque es muy probable que no lo soporte, pero que sepas que es típico tener 32KB o 64KB en un disco duro como cluster (depende del tamaño del HDD, por ejemplo, mi unidad de D: es FAT32 y usa 32KB por cluster)
Si no lees por clusters, estás desperdiciando velocidad, sobre todo en este caso, que tiene que mirar las tablas de la FAT (cada entrada ocupa el tamaño de un cluster, por lo que si lo lees de una tacada, ganas mucha velocidad y encima evitas tener que
gestionar demasiadas entradas en la cache, que tanto bucle for tampoco es bueno)
En fin, que voy a seguir toqueteando y cuando tenga el codigo adaptable, te paso mis cambios
Ahora algo que tardaba unos 8 segundos en hacerse, tarda solo 2 (para mirar el numero de asignaciones libres, tiene que hacer una buena lectura)
rodries escribió:Hermes escribió:Ahi te has equivocado, compañero: el tamaño del cluster es variable y lo minimo que he visto, es utilizar 4 (en un dispositivo USB de 256MB). Pero ahora mismo acabo de probar una modificacion que asigna la cache en grupos de 8 sectores (con las pertinentes correcciones claro) y la cosa se ha acelerado por 4 (mi pendrive usar 4096 bytes por cluster, luego 512x8=4096)
Lo que si es verdad es que no deberias tratar de leer mas de un cluster desde un dispositivo USB, porque es muy probable que no lo soporte, pero que sepas que es típico tener 32KB o 64KB en un disco duro como cluster (depende del tamaño del HDD, por ejemplo, mi unidad de D: es FAT32 y usa 32KB por cluster)
Si no lees por clusters, estás desperdiciando velocidad, sobre todo en este caso, que tiene que mirar las tablas de la FAT (cada entrada ocupa el tamaño de un cluster, por lo que si lo lees de una tacada, ganas mucha velocidad y encima evitas tener que
gestionar demasiadas entradas en la cache, que tanto bucle for tampoco es bueno)
En fin, que voy a seguir toqueteando y cuando tenga el codigo adaptable, te paso mis cambios
Ahora algo que tardaba unos 8 segundos en hacerse, tarda solo 2 (para mirar el numero de asignaciones libres, tiene que hacer una buena lectura)
No te lo discuto pero las 3 usb que he probado tienes dos sectores por cluster, y están formateadas con windows. En el chkdsk puedo leer 1024 bytes en cada unidad de asignación, pero la verdad es que el tamaño del cluster puede variar sin problemas, va en función del tamaño total del dispositivo.
En el usb el buffer máximo de trabajo son 4kb, pero cuando haces una lectura de 4kb manda 3 comandos scsi, el primero le dice que va a leer el segundo lee los 4kb y el tercero lee el posible resto del buffer y cierra lectura. Si le dices que lea 32kb (que serían 64 PageSize en readaheadcache) ejecuta 10 comandos , 1 apertura lectura, 8 lecturas de 4kb y 1 cierre lectura, por eso se acelera mucho la lectura si le dices que lea mas sectores de la cuenta. Antes para leer 32kb ejecutaba 34 comandos, en caso de tener el cluster a 1kb.
Me encanta que arregles la cache de la libfat de esta forma no hará falta readaheadcache en cuanto tengas los cambios hechos pásamelos a ver si mejora la velocidad respecto readaheadcache, aunque básicamente haces algo parecido, lees mas datos en una pasada.
Supongo que la mejora puede que se note en la escritura. Estoy deseando ver que cambios has hecho
Hermes escribió:Por cierto, he visto que usas FAT_racache_readSectors para leer y que usa su propia cache particular, pero aqui hay dos errores:
1) En _FAT_write_r no te has ocupado de escribir los datos en la cache de racache, por lo que si un dato se escribe y luego tratas de leerlo, no se habra refrescado (dependiendo de lo que pase en el punto 2) )
Hermes escribió:2) Para leer sectores parciales, utilizas _FAT_cache_readPartialSector en _FAT_read_r y eso es un error fatal por que tira de una cache distinta!!! . Asi que te podrias encontrar con que algo que está en racache, pasa a leerse, de nuevo en cache, por lo que aparte de la perdida de tiempo, jodes la cache de la que tiras al leer las entradas FAT.
Hermes escribió:Lo que voy a hacer para solucionar esto, es usar dos caches separadas: una para lectura y escritura, y la otra que se ocupe de tratar con las tablas y santas pascuas.
Al usar clusters existe un problemilla a tener en cuenta: cuando le especificas el numero de paginas, lo haces pensando en sectores, por lo que lo suyo sería adaptar el numero de paginas pensando en el numero de sectores por cluster, pero teniendo en cuenta el tamaño que le estamos pidiendo.
Vamos que no es lo mismo pedir que cachee 256 entradas de sectores que 256 entradas de cluster, por lo que en mi caso 256 paginas deberian traducirse a 32 de forma interna y eso me haria ganar velocidad en las gestiones, leyendo la misma cantidad de datos.
En fin, voy a seguir con ello
Hermes escribió:Ya se que racache solo cachea los datos de los archivos, pero al principio, hay una lectura parcial para los datos que no estan alineados, que tira desde la otra cache y luego al final, hay otra lectura desalineada
Vamos que esto es asi:
cache-> lectura desalineada con el sector al comienzo
racache-> lecturas alineadas con el sector
cache-> lectura desalineada con el sector final
Todo depende de lo que leas, pero se puede armar ahi una buena. Y en los Writes he visto que invalidas racache, pero cache no la actualizas (sobre todo cuando hace la escritura directa por bloques )
De todas formas, deja que lo mire con calma a ver que es lo que se consigue. Lo que está claro es que por cachear ficheros no vas a ganar velocidad de transferencia, salvo que haya lecturas recurrentes sobre la misma zona.
rodries escribió:De usar cache a no usarla pasa de 250kb/s a 760kb/s ya que normalmente los archivos estan en zonas contiguas. Cuando active la cache para leerlo todo no se noto mejoría por lo que lo quité para simplificar, la verdad es qu no estudié mucho la cache ya que no me gusó como la hizo chism que es el autor y le expliqué que debería hacer lecturas porbloques mayores n vez de por sector y dijo qu le hecharía un vistzo por lo que no seguí co el tema. La mayoria de los parches son de sven y no mio, no quiero que la gente se piense que le estoy quitando credito, yo ayudé a sven a averiguar el porque inicialmente el driver usb no pasaba de 60kb y a arreglar un par de fallos de libfat.
Hermes escribió:rodries escribió:De usar cache a no usarla pasa de 250kb/s a 760kb/s ya que normalmente los archivos estan en zonas contiguas. Cuando active la cache para leerlo todo no se noto mejoría por lo que lo quité para simplificar, la verdad es qu no estudié mucho la cache ya que no me gusó como la hizo chism que es el autor y le expliqué que debería hacer lecturas porbloques mayores n vez de por sector y dijo qu le hecharía un vistzo por lo que no seguí co el tema. La mayoria de los parches son de sven y no mio, no quiero que la gente se piense que le estoy quitando credito, yo ayudé a sven a averiguar el porque inicialmente el driver usb no pasaba de 60kb y a arreglar un par de fallos de libfat.
La verdad es que la librería es rara de cojones .
Yo estoy implementado dos lineas de caches (de momento tengo la escritura deshabilitada, por si meto un gazapo) y la idea es que la escritura tambien tire de ahi, incluso en los bloques desalineados para cubrir todos los posibles fallos que pueda haber.
El cachear muchos sectores, no sirve para nada salvo que los vuelvas a releer: por eso es mas importante cachear las tablas que los propios datos.
No es cuestion de poner 4MB de cache para datos, si luego resulta que le asignas a la cache de las tablas, solo 8 entradas de 512 bytes!
Asi en cuanto leas dos clusters, te has cepillado la cache y te va a estar penalizando.
EDIT:
Un fallo muy curioso en la cache, algo tremendo
Resulta que si se llena, mira a ver cual es la entrada que tiene menos uso y la sustituye... pero si la sustituye, la que tiene menos uso es la nueva!: la proxima vez que necesite alojar un cluster (sector antiguamente), que va a ser presumiblemente pronto, se va a cepillar la entrada mas nueva qu eno por nueva, deja de ser util
rodries escribió:
Por eso cambie el contador por gettick para que te de la mas vieja en racache, en racache tamien estaba por numero de usos y la cambié por antiguedad.
Yo intenté hacer que en 2º plano continuese leyendo mientras que se le pedía o no paginas haciendo una lectura de los siguientes sectores ya que lo normal es leer los siguientes sectores a no ser que el archivo esté fragmentado, pero tuve problemas raros de sincronización y tuve que quitarla. De todas formas aumentaba la velocidad solo un 2% así que la quité.
Normalmente uno lee ficheros por lo que la mejora está en hacer lecturas anticipadas de los ultimos sectores solicitados, no creo que te aumente el rendimiento por cachear las tablas ya que apenas se hacen acceso a ellas, solo para abrir un fichero y ya está en modo lectura.
¿ Has conseguido mejorar la velocidad algo respecto a racache actual ?
Hermes escribió:Si, yo estoy usando un contador global que tiene el mismo uso y asi evitamos incompatibilidades con otros sistemas.
Sobre ganar velocidad o no, no se hasta que punto he ganado pues salvo lo de pillar el tamaño del disco, que es algo muy visible (y ahi he ganado como un 400% ) , no puedo hacer medidas desde el emulador que sean significativas (con guitarfun si se notaria, pero eso ya se verñá con mas calma).
#define FREAD_BUFFER_SIZE 4096
#define ticks_to_msecs(ticks) ((u32)((u64)(ticks)/(u64)(TB_TIMER_CLOCK)))
void SpeedTest(char *fichero)
{
FILE *f;
char buf[FREAD_BUFFER_SIZE];
u32 bytes_read;
u32 total;
double secs;
u32 t1;
f=fopen(fichero,"rb");
if(f==NULL)
{
printf("No existe archivo: %s\n",fichero);
return;
}
total=0;
t1=gettick();
while(1)
{
bytes_read = fread(buf, sizeof(char), FREAD_BUFFER_SIZE, f);
total+=bytes_read;
if (bytes_read < FREAD_BUFFER_SIZE)
{
s32 result = -!feof(f);
if (result < 0)
{
printf("DEBUG: fread error: [%i] %s\n", ferror(f), strerror(ferror(f)));
}
break;
}
secs=ticks_to_msecs(gettick()-t1)/1000.0;
printf ("\x1b[%d;%dH", 5, 1 );
printf("read: %f kb sg: %f kb/s: %f \n",total/1024.0,secs,(total/1024.0)/secs);
WPAD_ScanPads();
if ( WPAD_ButtonsDown(0) & WPAD_BUTTON_1 ) //si se apreta el boton 1 se para el test
{
return;
}
}
fclose(f);
}
Hermes escribió:De momento estoy monitorizando la cache de las tablas, para ver que valor es optimo para la cache .
En el Dracula X, que es un CD cuyas pistas estan fraccionadas en ficheros, parece que se mantiene en 7 cambios, de momento, lo cual no está mal, porque por defecto, nosotros ponemos 8 en fatInit (la diferencia es que antes eran 8 sectores, es decir un cluster de mi pendrive y ahora serian 8 clusters, segun ese dato).
Luego... yo creo que estamos ganando velocidad de cajon, porque ahora la cache es mas amplia y funciona mejor
Por cierto, ¿sabes si el memcpy de Devkitpro esta optimizado?
Lo digo porque podriamos ganar velocidad si asignaramos memoria a la cache con memalign(8, ...) si es asi
Edit 2:
Al final he asignado memoria alineada a 32 bytes y he tocado el usbstorage para evitar el memcpy en la lectura de sectores, si está alineado a 32 bytes y parece que va bien ¿puede haber algun problema si no se usa dev->buffer?
Hermes escribió:Bueno, he hecho una prueba tirando de una ROM, usando 8 clusters de cache para tablas y 2 para ficheros (mas no tiene sentido y no gana velocidad, tratandose de un fichero que se lee y no necesita volver atras)
He optimizado el acceso a las entradas del cluster, memorizando la entrada de cache donde se aloja y recuperandola despues: el truco es que al pedir la pagina de la cache, se usa preferentemente esta y si no esta, pues entonces hace el bucle.
Hermes escribió:En USB, tanto fragmentando la lectura en grupos de 256 bytes, como si lo leo de una tacada, la transferencia es de unos 584 KBytes/sec, para un fichero de unos 2,6MBytes
En SD, la misma lectura es de 6666 Kbytes/sec.
Lo cual deja claro que el principal problema del USB, es que tiene el driver en el PPC y que hay que mejorar el driver en todo lo posible, evitando cosas inutiles como memcpy que se pueden evitar usando memoria alineada, por ejemplo.
Hermes escribió:En usbstorage veo que se le asigna 4096 como tamaño maximo de lectura. Por lo general, un dispositivo USB debe estar preparado para poder leer de una tacada el tamaño de un cluster y como en mi caso coincide con ese tamaño, no se debe variar.
Hermes escribió:No se debe variar porque el dispositivo puede no soportar un tamaño mayor (como yo comprobé cuando trabaje en esto en PS2), pero seguramente si se ajustara ese tamaño al del cluster, ganara velocidad en los discos duros.
Leer de fondo varios clusters de forma consecutiva no tiene mucho sentido cuando realmente, estamos leyendo varios clusters de una sola tacada mediante la lectura normal (por eso en el test que hago, da lo mismo 2 que 64 clusters de cache en esa zona): lo que hay que mejorar es el acceso al dispositivo.
En un programa hacer lecturas en paralelo tiene sentido para evitar bloquear un proceso y solo es eficaz si es capaz de entregar los datos a tiempo de que los use el proceso: se piden unos datos adelantados y cuando el proceso los requieres, deben estar ahi.
Pero aqui el proceso está esperando esos datos de forma inmediata, por lo que si implementaramos un modo especial de lectura multiple (que se puede hacer) podemos ganar algo de tiempo desde el punto de vista de acelerar libfat, pero no en el proceso de lectura del dispositivo
La prueba es que la SD va como un tiro y usa las mismas funciones de libfat que el USB: mas de 10 veces de diferencia de velocidad, deja claro que el problema es la implementacion del driver USB en el PPC y que hay que trabajar por ahi (si se puede)
Mis cambios por el momento, aportan otras cosas, pero si no se mejora eso...
rodries escribió:Es que soy un impaciente
Hermes escribió:rodries escribió:Es que soy un impaciente
Pues he vuelto todo atras, he vuelto a meter tu libfat, la he probado y he visto que iba a unos 730 KB. He apañado lo de la cache de las tablas (leyendo solo sectores) y ha subido algo la velocidad (aunque pillar el tamaño del disco duro, tarda un huevo, 6 segundos de reloj, frente a los 2 de antes)
Entonces me he dicho ¿cuantos sectores lee este tio a la vez, para que su sistema sea tan rapido? Y ahi me he quedado sorprendido ¿solo 2? ¿pero como coño puede ser que lea solo dos sectores, si tiene ahi una funcion racache que deberia leer todo el cluster de una tacada? Pues porque no llega a llamarla nunca . Nunca le llegas a pedir mas de dos sectores, porque atencion: a la funcion read, lo maximo que le llega, son 1024 bytes a leer (aunque le este pidiendo un bloque de 2,6 MB)
La madre que me pario: asi no me extraña que esto rinda tan poco
rodries escribió:
Correcto, ¿recuerdas la primera versión que te daba problemas y tenía muchos warnings? Pues en esa versión todo tiraba de racache, incluso el acceso a tablas y cuando se escribía solo se invalidaba la página afectada por la escritura, pero se ve que hice algo mal y heché para atrás todos los cambios, para dar estabilidad. Pienso que lo ideal sería partir de esa versión y reparar lo que hice mal, pero voy a estar fuera de circulación durante una semana. Ahora que entiendes como va libfat (que es mas rara que un perro verde ) puede que veas donde me equivoqué .
Yo había pensado usar 2 caches, una para archivos y otra para las tablas, de esta forma los accesos estarían siempre cacheados y deberían ser muy rápidos, pero ultimamente el curro no me deja hecharle tiempo. Ya me contarás.
Saludos.
rodries escribió::O Estas hecho una máquina.
Pensaba que no existía nada para el tema de los archivos fragmentdos, a no ser que leas primero como está repartido el fichero para preveer que no se lean sectores innecesarios, pero en este caso pienso que vale mas la salsa que el pollo, ya que o está muy fragmentado y los clusteres son pequeños o no creo que ganes apenas velocidad. Y si están muy fragmentados que usen el defrag
Bueno, me has puesto los dientes largos ya tengo ganas de que rule esos fuentes.
offspringboy escribió:Funciona si conecto por usb la guitarra del GH3 de xbox360? si no funciona crees que lo puedas hacer?
offspringboy escribió:Funciona si conecto por usb la guitarra del GH3 de xbox360? si no funciona crees que lo puedas hacer?
Thyl-Thalion escribió:a) Descarga el .rar
b) Descomprimelo
c) copia toda la carpeta guitarfun a la raiz de la SD
d) crea los directorios apps\guitarfun\
e) copia el "guitarfun.dol" a este último directorio. Renombralo a "boot.dol"
Te tiene que quedar así:
________________________
Aplicación para el HBC:
G:\apps\guitarfun\boot.dol
_________________________
Directorio para el juego:
G:\guitarfun\songs
G:\guitarfun\bitmaps
G:\guitarfun\guitarfun.dat
G:\guitarfun\songs_score.dat
__________________________
Si quieres icon.png y meta.xml para el HBC, descargate del hilo de cangrejo y comepiedras, que creo que ya lo traen.
a ver si así te va.....
EDITO: el hilo del que hablaba es este
http://www.elotrolado.net/hilo_homebrew-channel-packs-elf-icono-meta_1029712
PiratePila escribió:A ver si lo puedo probar esta tarde...
¿Sabéis si con adaptadores PS/2 a USB funcionan los teclados normales?
Nunca he jugado a este juego pero los Guitar Hero me gustan, así que lo tendré que probar.