[Noticias Daedalus] "SMB is running at around 30-40fps in game on the PSP"

http://strmnnrmn.blogspot.com/

Interesante [oki]

Basicamente la noticia dice eso, y que intentará usar esa optimización en otros juegos
yeahhhh flama de la rama, perfec cubata ^^
wua entre esto y la noticia de CPS3 estoy flipando [amor]
grishnakhelorco está baneado por "Clon de usuario baneado"
selim escribió:wua entre esto y la noticia de CPS3 estoy flipando [amor]


Hombre la del CPS3 tiene mas hype que esta, pero es menos importante xD (pocos juegos y ya presentes en la DreamCast y la PS2, aunque un Warzard en la PSP, uff, sería un sueño).

A mi el SMB nunca me llamó la atención pero bueno, será la pera jugarlo a esa velocidad...

Salu2.
30-40 es muchisimo, como el doble de lo que rulaba antes. Lastima que no diga cuando lo sacara
Bien bien estos progresos me molan bastante. Solo espero k las kompatibilidades kon las roms pesadas (tales komo banjo tooie, mario party 3 o conkers bad fur day) sean solucionadas.
El dia ke me pase la saga Banjo Kazooie en mi PSP sera 1 dia glorioso kompañeros (jajajajaja flipo 1 poko no? XD )
OLEEEEEE!!! A ver si sale ya que tengo unas ganas... [amor]
solo comentar que acabo de ver la noticia en el blog y comentar que me alegro de tener este juegazo en la psp!!! espero que el siguiente sea el pokemon :D
Mario karts, Mario karts, Mario karts, Mario karts, Mario karts, Mario karts, Mario karts, Mario karts, Mario karts, Mario karts, Mario karts.....
Diooos quiero vicios por ad-hoc de 4 jugadores al smash bros ratataaaa
Gran noticia, y gran trabajo que está realizando este hombre.

La verdad, yo pienso que este ha sido uno de los mejores juegos que ha tenido la Nintendo 64, y como se pueda jugar ahora a esta velocidad en la PSP... vamos a pasar un gran verano gracias a este hombre :D.

Esperemos que se confirmen fechas y demás actualizaciones.

Saludos.
¿40fps significaría full-speed o son los fps relacionados con el juego (que iría a 50 PAL, 60 NTSC)? En cualquier caso, lo de este chico no tiene nombre. Para mí es el auténtico rey de la scene. Alex es el rey del hacking, que es distinto xdd Pero pedazo de curre se está pegando con su emulador, desde que comenzó con el mario64 a 5fps hasta ahora ha sido bestial la diferencia...y en cada versión que saca mejora más la cosa.

¿podremos jugar a la N64 100% algún día? La verdad es que visto lo visto cada día hay más esperanzas XD
lo de los 40 fps depende mucho del juego... pero en principio a partir de 25-30 el ojo no distingue por lo que da igual simplemente suele suceder que da un efecto más suave entre transiciones pero amos... con 30 fps hazte a la idea que será full speed y con suerte hasta con el limitador.

la verdad es que no se el fps del ssb pero en la época de n64 una técnica para eliminar cálculo a la gpu era disminuir el framerate. No se si sabreis la frase de kutaragui "ps3 puede ir a 120 fps" bueno eso es una vacilada sin sentido ;) pero se refiere a que va sobrada para renderizar.
Zor escribió:¿40fps significaría full-speed o son los fps relacionados con el juego (que iría a 50 PAL, 60 NTSC)? En cualquier caso, lo de este chico no tiene nombre. Para mí es el auténtico rey de la scene. Alex es el rey del hacking, que es distinto xdd Pero pedazo de curre se está pegando con su emulador, desde que comenzó con el mario64 a 5fps hasta ahora ha sido bestial la diferencia...y en cada versión que saca mejora más la cosa.

¿podremos jugar a la N64 100% algún día? La verdad es que visto lo visto cada día hay más esperanzas XD
Huuuy por encima del autor de Daedalus están Exophase, ZX81, NJ en temas de emulación y muuuuuuy por encima está el equipo desarrollador del Popstation (aunque claro, siendo sony es más facil xD)
Zor escribió:¿40fps significaría full-speed o son los fps relacionados con el juego (que iría a 50 PAL, 60 NTSC)?


Imagínate un juego que originalmente va a 60 FPS, si lo consigues emular a 30 fps con un frameskip de 1 tienes FULL SPEED.
Yesterday I said I'd provide some more details about the Super Smash Bros. dynarec fix. The actual fix is fairly straightforward, but I thought the process of tracking down the issue was quite interesting and worthy of a couple of blog posts.

When I first started looking at SSB I noted that although the game ran fine without dynarec, it would always hang when trying to enter the main entry with dynarec enabled.

I've been programming professionally for around 6 years now and I can safely say that debugging dynarec bugs is one of the hardest categories of problems I've ever had to work on. For a start, because the code is generated on the fly, you don't have the luxury of source level debugging, and without spending time reverse engineering the original rom image, you don't even know what the generated dynarec code is meant to be doing. It's very much like working blindfolded.

And it gets even worse. I've fixed dynarec problems in the past which were the result of generating incorrect code for a fragment over 500 million instructions into emulation. This would be bad enough, but it can be many thousands of instructions later before this causes emulation finally diverges from the correct path. Just identifying the exact point at which the emulation starts to diverge from the correct sequence of instructions can be like finding a needle in particularly large haystack. While blindfolded :)

Over the years of trying to debug problems like these I've built up a set of tools and learned a few tricks along the way which you might find quite interesting. Although I'm going to talk about them in the context of tracking down this dynarec issue, I've found some of the techniques useful in solving other problems so you might find other ways of applying them too.

One of the first things I do when trying to identify a dynarec issue with Daedalus is to see if the problem is reproducible on the PC build of the emulator. Although it is possible to use GDB with PSPLink, I've never got this up and running and I'm much more comfortable debugging with Visual Studio. Also, working with the PC build is usually much faster than working with the PSP build (debug builds run around 10x faster on the PC, and build times are much quicker.)

Not all dynarec issues can be debugged in this way - the PSP and PC builds have different code generation back-ends (i.e. MIPS and x86 code generation respectively) so bugs in the MIPS code generation won't usually be reproducible in the PC build. The dynarec system in Daedalus shares a common frontend (trace selection and recording) between the two platforms, which means that if I can reproduce the problem on both platforms, I can narrow down the likely location of the bug to this area.

Fortunately this particular bug manifested itself in both the PC and the PSP builds, so I knew that if I fixed the bug on the PC build, it should fix the PSP build too. What I needed to find out next is what the emulator was doing differently when dynarec was enabled compared to when it was disabled.

If dynarec is running without errors, then the sequence of executed instructions should exactly match that executed with dynarec disabled. If I could log details about all the instructions executed with dynarec disabled, and again with dynarec enabled, I should be able to compare the two logs to figure out the exact point at which dynarec is going out of sync. This all relies on the fact that the emulator is totally deterministic, i.e. that running the emulator twice in succession with the same settings should give exactly the same results.

Unfortunately, for a variety of reasons my dynarec solution doesn't produce identical results to interpretation, the main reason being that for performance reasons I can only handle vertical blank and timer interrupts on the boundaries between fragments. For example, with dynarec disabled, the first vertical blank interrupt might occur exactly on the 625,000th instruction, but with dynarec enabled with might not occur until the 625,015th instruction. This means that the logs diverge at the instant the first VBL fires, and never regain synchronisation.

When I was originally developing the new dynarec system I put a lot of effort into writing a fragment simulator, the idea being that rather than executing the native assembly code for a given trace, I could keep track of the instructions making up the trace and interpret these individually instead. Theoretically fragment simulation is identical to dynarec code execution, even down to the way I handle VBLs and timer interrupts, and it's been very useful at identifying bugs in the dynarec code generation. What's particularly useful about fragment simulation however is that I can enable a setting which makes it handle interrupts exactly in the same way as the non-dynarec core, i.e. interrupts are handled precisely rather than on fragment boundaries.

Essentially Daedalus has four modes of operation:


* Dynarec + fragment execution
* Dynarec + fragment simulation (imprecise interrupt handling)
* Dynarec + fragment simulation (precise interrupt handling)
* Interpretative core



This tool is particularly powerful, because if I can ensure that dynarec+fragment execution is equivalent to dynarec+fragment simulation, and that dynarec+fragment simulation is equivalent to running the interpretative core, then I can use the transitive properties of these relations to ensure that dynarec+fragment execution is equivalent to running the interpretative core. Fragment simulation allows me to bridge the gap between these two modes of operation which would otherwise be very difficult to compare.

I think that's long enough for one post. Tomorrow I'll talk about how I used this technique to help track down the SSB dynarec bug.

-StrmnNrmnYesterday I said I'd provide some more details about the Super Smash Bros. dynarec fix. The actual fix is fairly straightforward, but I thought the process of tracking down the issue was quite interesting and worthy of a couple of blog posts.

When I first started looking at SSB I noted that although the game ran fine without dynarec, it would always hang when trying to enter the main entry with dynarec enabled.

I've been programming professionally for around 6 years now and I can safely say that debugging dynarec bugs is one of the hardest categories of problems I've ever had to work on. For a start, because the code is generated on the fly, you don't have the luxury of source level debugging, and without spending time reverse engineering the original rom image, you don't even know what the generated dynarec code is meant to be doing. It's very much like working blindfolded.

And it gets even worse. I've fixed dynarec problems in the past which were the result of generating incorrect code for a fragment over 500 million instructions into emulation. This would be bad enough, but it can be many thousands of instructions later before this causes emulation finally diverges from the correct path. Just identifying the exact point at which the emulation starts to diverge from the correct sequence of instructions can be like finding a needle in particularly large haystack. While blindfolded :)

Over the years of trying to debug problems like these I've built up a set of tools and learned a few tricks along the way which you might find quite interesting. Although I'm going to talk about them in the context of tracking down this dynarec issue, I've found some of the techniques useful in solving other problems so you might find other ways of applying them too.

One of the first things I do when trying to identify a dynarec issue with Daedalus is to see if the problem is reproducible on the PC build of the emulator. Although it is possible to use GDB with PSPLink, I've never got this up and running and I'm much more comfortable debugging with Visual Studio. Also, working with the PC build is usually much faster than working with the PSP build (debug builds run around 10x faster on the PC, and build times are much quicker.)

Not all dynarec issues can be debugged in this way - the PSP and PC builds have different code generation back-ends (i.e. MIPS and x86 code generation respectively) so bugs in the MIPS code generation won't usually be reproducible in the PC build. The dynarec system in Daedalus shares a common frontend (trace selection and recording) between the two platforms, which means that if I can reproduce the problem on both platforms, I can narrow down the likely location of the bug to this area.

Fortunately this particular bug manifested itself in both the PC and the PSP builds, so I knew that if I fixed the bug on the PC build, it should fix the PSP build too. What I needed to find out next is what the emulator was doing differently when dynarec was enabled compared to when it was disabled.

If dynarec is running without errors, then the sequence of executed instructions should exactly match that executed with dynarec disabled. If I could log details about all the instructions executed with dynarec disabled, and again with dynarec enabled, I should be able to compare the two logs to figure out the exact point at which dynarec is going out of sync. This all relies on the fact that the emulator is totally deterministic, i.e. that running the emulator twice in succession with the same settings should give exactly the same results.

Unfortunately, for a variety of reasons my dynarec solution doesn't produce identical results to interpretation, the main reason being that for performance reasons I can only handle vertical blank and timer interrupts on the boundaries between fragments. For example, with dynarec disabled, the first vertical blank interrupt might occur exactly on the 625,000th instruction, but with dynarec enabled with might not occur until the 625,015th instruction. This means that the logs diverge at the instant the first VBL fires, and never regain synchronisation.

When I was originally developing the new dynarec system I put a lot of effort into writing a fragment simulator, the idea being that rather than executing the native assembly code for a given trace, I could keep track of the instructions making up the trace and interpret these individually instead. Theoretically fragment simulation is identical to dynarec code execution, even down to the way I handle VBLs and timer interrupts, and it's been very useful at identifying bugs in the dynarec code generation. What's particularly useful about fragment simulation however is that I can enable a setting which makes it handle interrupts exactly in the same way as the non-dynarec core, i.e. interrupts are handled precisely rather than on fragment boundaries.

Essentially Daedalus has four modes of operation:


* Dynarec + fragment execution
* Dynarec + fragment simulation (imprecise interrupt handling)
* Dynarec + fragment simulation (precise interrupt handling)
* Interpretative core



This tool is particularly powerful, because if I can ensure that dynarec+fragment execution is equivalent to dynarec+fragment simulation, and that dynarec+fragment simulation is equivalent to running the interpretative core, then I can use the transitive properties of these relations to ensure that dynarec+fragment execution is equivalent to running the interpretative core. Fragment simulation allows me to bridge the gap between these two modes of operation which would otherwise be very difficult to compare.

I think that's long enough for one post. Tomorrow I'll talk about how I used this technique to help track down the SSB dynarec bug.

-StrmnNrmn

Aqui trae mas info al respecto del bug por lo q mas o menos logro entender de todas fomras son nuevas noticias

Saludos :)
Alguien se curra una traduccion o nos da a entender algo a los que no sabemos idiomas??

un saludo.
pero en principio a partir de 25-30 el ojo no distingue por lo que da igual simplemente suele suceder que da un efecto más suave entre transiciones pero amos... con 30 fps hazte a la idea que será full speed y con suerte hasta con el limi


No estoy de acuerdo contigo pero bueno.

La cosa es que si el juego original va a 60,como es el caso, a 30 o 40 va a ir ralentizado si, o si.

Y otra cosa es que yo no me haria muchas ilusiones el que haya conseguido hacer que el juego funcione a esa velocidad no quiere decir que lo vaya a conseguir en todos.

En SMB hay 4 poligonos en pantalla dudo mucho que en otros juegos el incremento sea tan notable.

Parece que no escarmentamos [rtfm]
moli_malone está baneado por "Troll"
Fijo que antes se emulara la N64 al 100 % que la SNES XD.
Para quien no lo sepa, el ojo humano "va" a unos 100-120 Hz (fps si lo preferís), y tanto las estructuras de la retina como cerebrales que se encargan de manejar toda la información visual, emplean métodos de procesado que se parecen mucho a los de compresión de video (como la identificación de bordes, el movimiento de estructuras en bloque y varias cosas más).
Así que sí que tiene sentido llevar un juego hasta esas cotas de suavidad extrema (lo digo por la PS3).

Saludos.
Yo no se mucho del tema pero... ¿los hrz (hercios) son lo mismo que los fps (frames por segundo)? Es que la gente habla como si fueran lo mismo y yo creyendo que eran cosas distintas.

Pero es que juego a juegos en las consolas que están en NTSC (60hrz) y tienen bajadas de framerate de la hostia. (ej: matrix path of neo por ejemplo en xbox).

Yo creía que los juegos suelen ir a 30fps y rara vez sobre los 50 fps.

(que a lo mejor me equivoco, ya que no tengo ni idea de esto).
Yo la verdad ni idea de ftps ni frames ni na de ná XD. Solo se que a 25-30 frames el juego ya es jugable verdad? pues contentisimos.

No quiero motivar a nadie ni mucho menos pero...
Si el smas bros iva antes a 11 frames aprox, y el ocarina a unos 15 o por ahi...¿eso significaria que el ocarina ahora iria a 40 o por ahi?

¿o no tiene nada que ver?

Pos eso, que este tio es dios xd
Celduques está baneado por "utilizar clon para saltarse baneo de subforo y querer tomar el pelo a la administración"
El ojo humano a partir de los 24 FPS no se entera de la movida... así que ponerlo a 120 FPS sería una estupidez. solo conseguiría llevar al límite la consola con poca cosa... nada más!
Y el que diga que no... el cine rueda a 26 FPS constantes!
Los juegos manejan frame rate mayores porque al manejar información a tiempo real y tener que procesarla, tiene poca estabilidad así que se trabaja normalmente entre 25-35 FPS.
Que muchos hablais sin saber lo que decis.
Otra cosa es que el juego esté pensado para que fluya a unos 50 FPS que es el caso de F-Zero X cuyo resultado no agradó demasiado. Así que si este fuera en el emulador a 30 FPS no sería ni mucho menos full speed!
zulykat escribió:Yo la verdad ni idea de ftps ni frames ni na de ná XD. Solo se que a 25-30 frames el juego ya es jugable verdad? pues contentisimos.

No quiero motivar a nadie ni mucho menos pero...
Si el smas bros iva antes a 11 frames aprox, y el ocarina a unos 15 o por ahi...¿eso significaria que el ocarina ahora iria a 40 o por ahi?

¿o no tiene nada que ver?

Pos eso, que este tio es dios xd
No tiene nada que ver, el autor está optimizando una rutina grafica determinada, que no tienen porqué compartir otros juegos
Celduques escribió:El ojo humano a partir de los 24 FPS no se entera de la movida...
Eso lo he oido muchas veces pero no lo entiendo... Por ejemplo el Oblivion en mi PC va sobre los 15-26 fps. Y luego lo he probado en casa de un amigo con un PC más potente a 30-40 fps y se nota muchísimo la fluidez y que no pege ningún tirón.

(los fps mirandolos con el programa Oldblivion)
Celduques, digo lo que digo pq sé de lo q hablo, q para eso soy médico leñe.
Y el cine va a 24 fps, que es aproximadamente el umbral para la sensación de movimiento estable.
Herzios son ciclos por segundo, en el caso de pantallas y tal, el número de veces que se redibuja la imagen en la pantalla.
Frames por segundo se refiere al número de imágenes que el video/juego/programa o lo que sea, envía a la pantalla por segundo.

No son lo mismo, pero en ocasiones son superponibles (cuando un juego va a tantos FPS como la frecuencia de refresco de la pantalla).
Celduques escribió:El ojo humano a partir de los 24 FPS no se entera de la movida... así que ponerlo a 120 FPS sería una estupidez. solo conseguiría llevar al límite la consola con poca cosa... nada más!
Y el que diga que no... el cine rueda a 26 FPS constantes!
Los juegos manejan frame rate mayores porque al manejar información a tiempo real y tener que procesarla, tiene poca estabilidad así que se trabaja normalmente entre 25-35 FPS.
Que muchos hablais sin saber lo que decis.
Otra cosa es que el juego esté pensado para que fluya a unos 50 FPS que es el caso de F-Zero X cuyo resultado no agradó demasiado. Así que si este fuera en el emulador a 30 FPS no sería ni mucho menos full speed!


Eso debe ser el ojo humano con 3 heineken en el buche porque yo si que me entero, por lo menos hasta los 30 FPS.
Rey Arturo escribió:
Eso debe ser el ojo humano con 3 heineken en el buche porque yo si que me entero, por lo menos hasta los 30 FPS.


emm... los findes yo sólo voy a 10 fps como mucho xD... pero bueno si no quieres no me creas, soy ingeniero informático y programador gráfico... así que creo que sé de que me hablo. Lo que tu notas normalmente es una bajada de la velocidad en el juego, no una bajada de frames ya que en el cine se suele emitir a unos 26 (creo que en formato pal) por segundo. Porque lo notas? porque el juego cambia de velocidad aunque parezca poco y piensas ah pues serán los fps.

si consiguen tener el smash bross a 30 fps creo que será jugable ya he dicho antes que en la época no se solía aumentar mucho el frame rate alguien ha dicho por ahí que curra a 60 fps seguro que es un listo que lo ha puesto en el project 64 y le ha dicho que lo estaba ejecutando a 60 fps ;) eso no vale!
Yo siempre he oido que el ojo humano capta alrededor de 25 imagenes por segundo. Eso no quiere decir que no haya diferencia entre ver un juego a 25 que a 100. Pero si, se suele decir que a partir de 25 imagenes por segundo, ya es perfectamente jugable (aunque no tan comodo como 50 o mas).
A ver a ver, que la gente sse confunde bastante, el ojo segun dicen por ahi por encima de los 25 fps el ojo ya no percibe tanto.

El problema viene que en emulacion cuando se habla que algo va a 30 fps, significa que va a la mitad de velocidad si esta a 60hz, es decir, si el lylat wars en una N64 va a 30 fps a 60hz, en emulacion iria a 15 fps, para ir a 30 fps como una N64, el emulador deberia de tener una velocidad de 60fps.

Creo que me explicado como el culo, pero bueno ahi esta, a ver si alguien lo entiende y lo explica mejor.

Saludos.
Bueno, en realidad la polémica no va mucho por la tasa de refresco.

Los 60Hz son la tasa de refresco del MONITOR. Es bastante más superior a los 25 fps. Recordad que la frecuencia es el inverso del periodo.

Si tenemos una frecuencia de 60Hz, el periodo de actualización nos dice que vemos 1/60, es decir, 60 imagenes por segundo. Al menos... porque eso es imposible afinarlo.

Otra cosa es el FrameRate de la aplicación visual (por aquí había un ingeniero informático, como yo, que decía que programaba cosas "visuales". Vamos juegos, yo también). El FrameRate es la velocidad con la que el programa, juego, CPU, procesador o tarjeta gráfica (en realidad es la tarjeta gráfica) envía las imagenes a pantalla.

Si tienes un FrameRate de 100 (que lo hay) y tienes 60Hz, ¿perdemos frames? Sí. Y no.

Porque ahí entra la cuestión de "a partir de qué FR es jugable un juego". No es cuestión de qué frame rate, ni de hercios.

Es algo que EFECTIVAMENTE (como decía nuestro compañero médico) tiene que ver con el ojo humano.

En parte tiene razón, y en parte le ha faltado "hacer notar" ciertas cosas.

Es cierto, el ojo puede ver más de 100 FPS, o herzios como querais llamarlo.

Si mirais a otra parte de la habitación donde esteis (tengais TFT o CRT [aunque en las TFT el efecto es menor por el alto contraste de colores]) podreis ver parpadear la pantalla si la mirais de reojo (bueno, no es exactamente mirarla de reojo, es dejarla dentro del campo visual pero fuera del foco de atención). Y eso os ocurrirá incluso poniendo un monitor a 120Hz...

Por eso, porque al enfocar a otro punto REAL que EMITE EN CONTINUO (la señal de la pantalla al estar dividida en Frames es DISCONTINUA, aunque muy levemente) nuestor ojo vuelve a captar todo el "framerate" del mundo real, y parpadea esa pantalla que está en nuestro campo de visión, porque le faltan FRAMES!

¿Y todo esto a qué viene?

A que es algo que se trata en el cine y aún más en profundidad en el campo de la magia-ilusionismo (si se estudia en profundidad).

La sensación de movimiento.

¿Es un juego jugable a 25FPS? Sí, a 23 FPS se produce en la retina la SENSACIÓN DE MOVIMIENTO y se lanza al cerebro. Con eso basta. Se producirá la sensación de movimiento en el punto ENFOCADO, pero directamente también se percibirá la FALTA de sensación de movimiento en el resto del campo de visión en el que no está el foco de atención de la retina. Es decir, aunque no lo notemos, las cosas parpadean para nosotros. Por ese motivo no percibimos movimiento en el resto de la imagen por mucho que nos esforcemos.

¿Y por qué se ponen los juegos a más FPS?

Por eso, para que se perciba una sensación de MOVIMIENTO TOTAL.

¿Y esto de qué depende?

Del tamaño. Como muchas otras cosas en la vida. Si tienes una televisión de 14" y pones un juego a 50FPS, lo más probable (no tengo hecho ni calculos ni experimentos) es que notes sensación de movimiento EN TODO el juego. Verás y "fijarás" en tu cerebro cómo se mueve al viento una bandera colocada en cualquier esquina por alejada que esté en el horizonte.

¿Y si el televisor es de 21"?

Ya no lo percibirás con tanta claridad. ¿Por qué? Porque conforme se aleja de tu campo de visión (pensemos siempre que estamos jugando, que todo es inconsciente y que estamos con el foco de atención en el centro de la pantalla) se produce el tan ODIADO parpadeo. Por eso en el cine no nos gusta que nos sienten delante. No es por incomodidad, podrían ponerte la pantalla a la altura de tus ojos y seguiríamos quejandonos y esta vez no por el cuello, sino porque inconscientemente, sabemos que nos estamos perdiendo parte del metraje y no por tamaño, que también!.

Todo esto del tamaño es relativo en cuanto a FPS y Herzios, ya que se sabe que en el cine disfrutamos, y a 25FPS nada más.

El problema es la SENSACIÓN DE MOVIMIENTO.

Y con 25FPS se produce esa sensación, así que se puede jugar.

Si el cine fuese a 60 FPS, probablemente nos daríamos cuenta de los detalles en segundo, tercer e incluso cuarto plano de profundidad. Y eso no lo quiere ningún director. Como mucho te dejará ver 2 planos.

Perdón por el rollo [tomaaa]
Wow ![tadoramo] [tadoramo] [tadoramo] [tadoramo] [tadoramo] [tadoramo]

(Ahora sí, me quedé viendo visiones, jaja !)

Saludos !
MJJMarkos escribió:Perdón por el rollo [tomaaa]


Perdón? OLÉ COMPAÑERO. ^^

Acabas de dar una visión muy conciliadora e integradora sobre tema, en definitiva muy completa. Mis felicitaciones.

No tengo ni la más remota idea de si tal argumento es correcto o no (estudio economicas... nada que ver xD) Pero sin lugar a dudas tus explicaciones han dejado aclaradas muchas de mis dudas.

Un saludo y gracias!
SMB es un juego o esta dicendo que va a ir todo entre 30 y 40 fps por que si es asi wooooooooow mama :P perferct dark powa.
Bueno me reafirmo en que el SMB funciona a 60fps no hace falta meterlo en ningun emulador para darse cuenta de ello, al igual que el ZOOT funciona sobre 20fps por que se mueve que da pena.

Mucho titulo y lo que querais pero los hay que no diferencian algo tan basico.
Impresionante MJJMarkos [Ooooo] [Ooooo]
Natsu escribió:Bueno me reafirmo en que el SMB funciona a 60fps no hace falta meterlo en ningun emulador para darse cuenta de ello, al igual que el ZOOT funciona sobre 20fps por que se mueve que da pena.

Mucho titulo y lo que querais pero los hay que no diferencian algo tan basico.


Y también los hay que no quieren ver la realidad... [toctoc]


Bufff... jugar al smash bros en psp tiene que ser la hostia, y no digamos ya si le mete multiplayer por ad-hoc. [babas]

Un Saludo ;)
Me da igual lo que digáis...30fps se notan, e incluso de 60 a 90 fps se notan...y eso es evidente xd
nuevas noticias, e leido un poco pero mi nivel de ingles no es k sea muy bueno, creo k al final dice k si no funciona 100% es problema del juego y no del emulador o algo asi, a ver si alguien puede traducirlo aunk es un buen curro....

Tracking down the SSB Dynarec Bug - Part 2

On Monday I talked about the fragment simulator and how this could be used to help track down bugs in the dynarec implementation. In this post I'm going to talk a bit about a tool I use mostly for regression testing, but also to help determine the exact point at which the fragment simulator and the interpretative core go out of sync. It's a bit of a long post, so apologies in advance :)

Daedalus can be compiled with a flag which enables a special 'synchronisation' mode. This build configuration creates an instance of a synchronisation class which can be initialised in one of two modes - either as a producer or as a consumer. At various points during program execution I pass information about the internal state of the emulator to the synchroniser for processing. In the case of the producer, it simply writes this data out to a file on disk. The consumer is a bit more interesting; it reads data of the required size from disk, and compares this 'baseline' value against the value provided by the emulator. If these two values are found to be different, the synchroniser knows that things have drifted out of sync and it can trigger a breakpoint and drop out into the debugger.

This technique relies on the fact that the emulator is deterministic, i.e. running the emulator twice in a row with the same inputs generates exactly the same results. By 'inputs' this means not just the same rom image, but external inputs such as data from the controller must match exactly too. Obviously pressing buttons on the controller in exactly the same order with the same timings would be impossible to duplicate, so the other function the synchroniser performs is to record input from the pad in the case of the producer, or play input back in the case of the consumer. Other external input, such as calls to timer functions (e.g. time(), QueryPerformanceCounter() or rdtsc) can be synchronised in the same way.

The synchroniser works with as few or as many sync points as you provide. For debugging very simple problems, you can get away with just checking the value of the program counter as each instruction is executed. For more tricky problems you can end up adding many more sync points - for instance you can synchronise the entire register set after every instruction to ensure that the synchroniser catches any instruction which generates a different result from the baseline.

I add sync points to Daedalus using a set of macros. When synchronisation is enabled, the macros expand out to calls to a virtual method on a global instance of the synchroniser class. An example sync point in the code might look like this:


u32 pc = gCPUState.CurrentPC;

SYNCH_POINT( DAED_SYNC_REG_PC, pc );

OpCode op;
if( CPU_FetchInstruction( pc, &op ) )
{
CPU_Execute( pc, op );
}



The interesting line here is the SYNC_POINT macro, which synchronises on the current program counter value. For producers, this just writes the value of 'pc' to disk. For consumers, it checks that the value we have for 'pc' matches the one read from disk.

The DAED_SYNC_REG_PC argument is simply a flag to describe what is being synchronised. Another global constant allows easy control of what is synchronised:


enum ESynchFlags
{
DAED_SYNC_NONE = 0x00000000,

DAED_SYNC_REG_GPR = 0x00000001,
DAED_SYNC_REG_CPU0 = 0x00000002,
DAED_SYNC_REG_CCR0 = 0x00000004,
DAED_SYNC_REG_CPU1 = 0x00000008,
DAED_SYNC_REG_CCR1 = 0x00000010,

DAED_SYNC_REG_PC = 0x00000020,
DAED_SYNC_FRAGMENT_PC = 0x00000040,
};

static const u32 DAED_SYNC_MASK(DAED_SYNC_REG_PC);

#define SYNCH_POINT( flags, x, msg ) \
if ( DAED_SYNC_MASK & (flags) ) \
CSynchroniser::SynchPoint( x, msg )



If I want to enable more thorough debugging, I can change DAED_SYNC_MASK and OR in more values:


static const u32 DAED_SYNC_MASK(DAED_SYNC_REG_PC|DAED_SYNC_REG_GPR);



Changing the mask value requires the emulator to be rebuilt from scratch and the baseline synch file to be recreated. This is a bit time consuming but doing it in this way means that the compiler can optimise out any synch points which we aren't interested in, keeping things running as quickly as possible.

One problem with this technique is that the synchroniser can quickly generate a massive amount of data, so much that most of the execution time is spent shifting this data to or from disk, slowing debugging to a crawl. In the example I gave on Monday, it can sometimes take over 500 million instructions before things go out of sync. Even when just synchronising on the program counter, that's over 2GiB of data that needs to be read/written to disk. When you throw in more sync points such as register sets (the GPR registers on their own are around 256 bytes) this can very quickly become impractical. To get around these limitations in Daedalus I gzip the stream of data on the fly which compresses the data significantly. Another trick I use is to hash each register set to a 32bit value and synchronise on this value instead. When using both these techniques the sync files typically end up around 100-200MiB, which is much more manageable.

One of the main uses of this synchronisation code is for regression testing optimisations I've made. I can take a 'known good' build of the emulator and initialise the synchronisation class as a producer to generate a baseline sync file. I can then take a modified version of Daedalus with the optimisations that I want to test, and initialise the synchroniser as a consumer. If the synchroniser detects that things have gone out of sync, then I know that my changes are buggy, and I can investigate why they're not working as planned. It's worth noting that even if everything stays in sync, this isn't a guarantee that my changes are bug-free, but it's a pretty good indication that they're ok.

I also use the synchronisation code to debug tricky dynarec issues. When debugging these types of problems I typically start off by disabling the dynarec engine and setting up the synchroniser to produce a baseline for testing. I'll then re-enable dynarec, but using the fragment simulator with precise interrupt handling (see the end of Monday's post for more on this) and run Daedalus with the synchroniser in consumer mode. Theoretically, as soon as the dynarec code gets out of sync with the interpretative core, the breakpoint triggers and I can investigate things more closely in the debugger.

This is exactly the process I used to track down the Super Smash Bros. bug. When I ran the emulator with the synchroniser in consumer mode, it detected that the program counter was different from the expected baseline value after exactly 387,939,387 instructions had been executed. I'd like to think that an error rate of 2.57e-7% wasn't all that bad, but apparently it is :)

Now that I knew the point at which the emulator was going out of synch, I set a few breakpoints in the emulator to see what exactly was happening. My usual trick is to disassemble the executed instructions just before and after things diverge, and see what's different. Here are snippets from the 'good' and 'bad' logs as things go out of sync:


Count 171f7c35: PC: 80132500: LW ra <- 0x0014(sp)
Count 171f7c36: PC: 80132504: ADDIU sp = sp + 0x0018
Count 171f7c37: PC: 80132508: JR ra
Count 171f7c38: PC: 8013250c: NOP
Count 171f7c39: PC: 80132ae8: JAL 0x80131fb0 ?
Count 171f7c3a: PC: 80132aec: NOP
Count 171f7c3b: PC: 80131fb0: ADDIU sp = sp + 0xffd8
Count 171f7c3c: PC: 80131fb4: SW ra -> 0x0024(sp)
Count 171f7c3d: PC: 80131fb8: SW s0 -> 0x0020(sp)
Count 171f7c3e: PC: 80131fbc: CLEAR a0 = 0
Count 171f7c3f: PC: 80131fc0: CLEAR a1 = 0




Count 171f7c35: PC: 80132500: LW ra <- 0x0014(sp)
Count 171f7c36: PC: 80132504: ADDIU sp = sp + 0x0018
Count 171f7c37: PC: 80132508: JR ra
Count 171f7c38: PC: 8013250c: NOP
Count 171f7c39: PC: 80132ae8: MTC1 at -> FP06
Count 171f7c3a: PC: 80132aec: NOP
Count 171f7c3b: PC: 80132af0: SWC1 FP06 -> 0x0018(a0)
Count 171f7c3c: PC: 80132af4: LBU v0 <- 0x4ad1(v0)
Count 171f7c3d: PC: 80132af8: ADDIU at = r0 + 0x0008
Count 171f7c3e: PC: 80132afc: BEQ v0 == at --> 0x80132b24
Count 171f7c3f: PC: 80132b00: ADDIU at = r0 + 0x0009



I've highlighted the instruction at which the synchroniser detected the PCs were out of sync. In the good trace (top) the PC is 0x80131fb0, but in the bad trace it's 0x80132af0. If you have particularly sharp eyes, you'll notice something else - two instructions before the code goes out of sync, the good trace executes a jump instruction to 0x80131fb0, but the bad trace is performing a MTC1 op (Move To Coprocessor 1)

This provides a particularly good example of one of the main weaknesses with the synchroniser - it's only as good as the synch points you set up. Because I was just synching on the program counter, it didn't detect the fact that the emulator executed an entirely different opcode two instructions previously. In this particular case I was fortunate in that the real source of the problem was very close to the location identified by the synchroniser, but sometimes the cause and effect can be separated by many thousands of instructions.

Fortunately it's easy enough to add new synch points in the code to detect issues like this, but adding too many synch points causes the emulator to slow to a crawl and makes debugging impractical. I've found the best approach is to start off with as few synch points defined as possible (ideally just the program counter) and slowly introduce more synchpoints as required. This is all very easy to do using the DAED_SYNC_MASK flag discussed above.

Getting back to SSB, it looked like I had found the root cause of the problem - somehow the rom was replacing the instructions in memory, essentially a form of self-modifying code (it's more likely it was just loading a new section of code into RAM from ROM, but it's still essentially self-modifying). The dynarec system was oblivious to these changes and so it ended up trying to execute stale instructions that it had cached when creating the fragment, potentially many thousands of cycles ago.

Dealing with self modifying code in dynamic code generators is generally very tricky. In Daedalus I've been relying on the fact that most roms are well-behaved and flush the instruction cache when they modify memory containing executable code. When I detect a instruction cache invalidate (through the MIPS CACHE opcode) I simply dump the entire contents of the fragment cache and start from scratch. This might sound a little heavy handed, but the way that I link fragments together makes it very hard to unlink small sections of code that has been invalided. Flushing the cache is very quick, safe and has a few advantages such as purging cold traces that are no longer being executed any more.

Ironically, the reason the dynarec was failing to cope with SSB wasn't due to a bug in Daedalus - it was due to a bug in SSB that just never happened to be a problem on a real N64. After updating memory with the new instructions SSB should have been invalidating the instruction cache to ensure that it didn't contain stale code, but for whatever reason it failed to do this. The only reason the rom runs correctly on a real N64 is that by the time it comes to execute the modified instructions, the instruction cache has been refilled a number of times and so the stale instructions are no longer cached.

Even though this isn't Daedalus's bug, it still needs to work around the problem. I'll leave this discussion for a future post though - this one is long enough as it is :)

-StrmnNrmn
dice algo asi como que el dynarec no fallaba con el SSB por un bug en el daedalus, sino por un bug que tenia el juego y que nunca se habia manifestado. Eso he entendido yo
A ver para cuando saca la nueva release, me encanta el smash bros, a este tio habria que hacerle un hueco, al lao del dark-alex, parece quedar poco para tener un emulador casi funcional.
Joer, qué pesaos algunos. El tío lleva un año pegándose el mayor curre de toda la historia de la scene y no paráis de decir que a ver cuándo mejora el emulador...

Haceos a la idea de que N64 100% no vamos a tener nunca, y que si se ha conseguido ésto es porque el micro de PSP es de la misma familia que el de N64, un MIPS. Si consigue que el mario64 sea jugable al 90% ya habrá conseguido un pedazo de logro.
Zor escribió:Joer, qué pesaos algunos. El tío lleva un año pegándose el mayor curre de toda la historia de la scene y no paráis de decir que a ver cuándo mejora el emulador...

Haceos a la idea de que N64 100% no vamos a tener nunca, y que si se ha conseguido ésto es porque el micro de PSP es de la misma familia que el de N64, un MIPS. Si consigue que el mario64 sea jugable al 90% ya habrá conseguido un pedazo de logro.


Ya sabes, nos empeñamos en querer emularlo todo en la portatil, ya que se hace pesado lo de jugar con el PC [ginyo] o con la misma consola, que si te peta no hay muchos repuestos por ahí.

PD: pakeiroeol, macarra te deshaces de tu GC y GBA SP anda que avisas [risita]
el autor a escrito en su pagina que antes de final de mes va ha publicar la R12, esto es una gran noticia.
juan2797 escribió:el autor a escrito en su pagina que antes de final de mes va ha publicar la R12, esto es una gran noticia.


Entonces, antes de que se cumplan dos semanas tendremos el nuevo Daedalus R12 !!... sino hay complicaciones claro... (toco madera [qmparto])
pone que el 23 o24 y si no puede como mucho el 26 o el 27 porque luego se va de vacaciones.
a publicado algo sobre el multiplayer. Que alguien que sepa ingles lo mire y comente porque yo no tengo mucha idea
que interesante el autor a hablado sobre la posibilidad de poner juegos en red ha comentado 2 opciones ( la primera una barbaridad) sobre la segunda está muy bien yo le he animado un poco por un mensaje :D
70 respuestas
1, 2