Emulador CPC [Offtopic]

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Responder
Avatar de Usuario
antoniovillena
Nonamed
Mensajes: 1162
Registrado: Dom Ene 09, 2011 8:55 am

Emulador CPC [Offtopic]

Mensaje por antoniovillena » Mié Abr 20, 2011 10:59 pm

Hola

Perdón por el offtopic (espero que no haya mucho odio en los cpceros), acabo de publicar un nuevo emulador, Roland, http://roland.antoniovillena.es, que prácticamente es un jbacteria modificado.

Ha sido muy instructivo para mí, no conocía la máquina, nunca he tenido una, y sin embargo no ha sido muy difícil buscar la información por internet.

Como notas curiosas, estas son las diferencias con respecto a un spectrum:
-El 464 es el equivalente a ZX 48K, con 16K de Ram adicionales. Todas las escrituras van a la RAM, y las lecturas se pueden conmutar entre RAM/ROM. Las ROMs están en la parte baja, principal (0000-3FFF) y alta, BASIC (C000-FFFF).
-El 664 no tiene equivalente spectrum, es básicamente un 464 con unidad de disco (y 16K de Rom adicionales para manejarla).
-El 6128 es como el +3, tiene 128K de Ram y usa los mismos discos de 3", con un formato muy parecido.
-Los archivos de cinta .CDT son exactamente el mismo formato que .TZX, pero usando un subconjunto de características.
-Los archivos .DSK son idénticos.
-También existen archivos .SNA son muy parecidos, aunque han tenido la brillante idea de usar 256 bytes de cabecera (donde se guardan los registros). De esta forma al usar un editor hexadecimal solo hay que restar 0100 para calcular la dirección RAM.
-Los archivos .TAP no existen. Es una pena, he tenido que hacer una herramienta para convertir a este formato (que permite una carga más rápida). El problema es que el CPC te obligaba a partir los bloques en 2 o más partes si el tamaño era superior a 2K, con lo que un juego sencillo que use carga estandar, con pantalla de presentación, usa un mínimo de 8 bloques (4 de cabeceras y 4 de datos), lo que hace la carga lenta. Por eso los desarrolladores usaron cargadores propios.
-Usa un chip gráfico configurable. Se pueden programar infinidad de resoluciones/modos, aunque los estandares eran modo 0: 160x200 16col, modo 1:320x200 4col y modo 2:640x200 2col.
-Todos los modos usan una paleta de 16 colores+borde. Como nota curiosa se pueden elegir 3 niveles por componente (R,G,B), lo que nos da a elegir entre 27 colores. Es curioso porque no es potencia de 2, creo que es la única máquina que hace esto. Hubiera sido más lógico usar 4 niveles y 64 colores.
-El locomotive BASIC es, creo, el basic más potente en máquinas de 8 bits. Tiene comandos para controlar cualquier aspecto de la máquina, y es razonablemente rápido, incluso permite introducir valores hexadecimales.
-Tiene una cpu Z80 a 4Mhz, aunque es efectiva a 3.3Mhz (por colisiones con el gate array, equivalente a ULA en spectrum).
-Las interrupciones se generan de la misma forma que en el spectrum, solo que a 300Hz (6 por cada frame). No usa NMI aunque es accesible por el bus de expansión (= que en spectrum).
-Usa el mismo chip de sonido que el spectrum, el AY-8912 y el mismo chip para controlar disquettes FDC 765.

En resumen, no creo que fuese muy complicado portar juegos de spectrum a CPC (no al revés). Solo hay que configurar el chip gráfico a 256x192 4 col, y cambiar las rutinas de escritura en pantalla. El resto es trivial, como cambiar la forma de acceder a rutinas del teclado, o cambiar las direcciones de los puertos. De hecho me ha sorprendido ver que un juego como Abu Simbel en su versión CPC usa el exactamente el mismo código de la carga mismo estandar en spectrum.
Imagen

curioso1100
Herbert
Mensajes: 60
Registrado: Mar May 08, 2007 8:41 am

Re: Emulador CPC [Offtopic]

Mensaje por curioso1100 » Jue Abr 21, 2011 5:04 pm

antoniovillena escribió:-El 464 es el equivalente a ZX 48K, con 16K de Ram adicionales.

hombre, creo que el término "equivalente" debería llevar al menos un par de comillas... equivalente me parece demasiado, aunque creo entender a que te refieres :-)

Por otra parte, he probado tu emulador y parece muy interesante, pero al menos con mi máquina -un "triste" portátil ACER 5715z- va muuuuuy lento- (lo he probado con firefox4, no con Chrome como tu aconsejas, pero es que no quiero instalar más navegadores y no sé hasta que punto eso lo haría más rápido). También he probado el otro emulador que indicas y aunque en ese caso si va bastante más ligero, aun no es lo suficientemente rápido como para jugar con soltura... a ver cuando me compro -o me regalan- una máquina decente :wink:

En cualquier caso, muchas gracias por crear el emulador. Ánimo y a ver si consigues que corra algo más -imagino que como yo aún habrá gente con máquinas antiguas-.

Un saludo.

Avatar de Usuario
antoniovillena
Nonamed
Mensajes: 1162
Registrado: Dom Ene 09, 2011 8:55 am

Re: Emulador CPC [Offtopic]

Mensaje por antoniovillena » Jue Abr 21, 2011 10:03 pm

Hola curioso

Bueno con lo de equivalente me he pasado, ha sido más parecido de lo que me esperaba en un principio, lo que me ha sorprendido y lo he exagerado un poco.

En cuanto al rendimiento, con tu máquina es suficiente. Te irá mejor usando otro navegador más que el Firefox. Firefox es rápido en otros aspectos, pero en cuanto a javascript y canvas deja mucho que desear. Con cualquiera de estos tres (Chrome, Safari y Ópera) te irá mejor, aunque recomiendo Chrome.

La parte Z80 la tengo muy optimizada y poco puedo mejorar en este sentido. A no ser que alguien saque un core Z80 más rápido que el que yo uso, no hay nada que hacer. Por otro lado la parte gráfica es mejorable, tengo pensado usar una rutina (como en jbacteria) que actualiza a la vez varios grupos de pixels. Esto mejoraría el rendimiento en un 10% o un 20%. Podría sacar una versión limitando el tamaño del canvas a 1x o 2x, lo que técnicamente daría una emulación en tiempo real en máquinas medianamente antiguas, eso sí con más de 1GHz y usando Chrome. Pero me pareció mejor idea que el usuario elija el tamaño que quiera. Si ves que un juego te va muy lento prueba a cambiar el tamaño de la ventana, verás como va más fluído.

Gracias por los ánimos. Espero mejorar el emulador en cuanto a compatibilidad, nuevas máquinas (664 y 6128) y soporte de disquettes. En rendimiento haré lo que pueda pero no te puedo asegurar nada, básicamente porque no se me ocurre nada, aunque acepto sugerencias.
Imagen

curioso1100
Herbert
Mensajes: 60
Registrado: Mar May 08, 2007 8:41 am

Re: Emulador CPC [Offtopic]

Mensaje por curioso1100 » Vie Abr 22, 2011 10:44 am

antoniovillena escribió:En cuanto al rendimiento, con tu máquina es suficiente.

No hombre, no, eso nunca se dice... ¿y si alguien se anima y me regala una mejor??

Ahora en serio. No veo tan claro lo del cambio de navegador. Como te dije, he probado el otro emulador que aconsejas y he cargado tanto en el tuyo como en ese el mismo juego (concretamente Bomb Jack). En el otro me marca 22 fps lo que aunque no es mucho como para que parezca real, si que puede permitir jugar un rato. Ese mismo juego en el tuyo es mucho más lento... me explico, se puede ver incluso como se dibuja poco a poco la pantalla y aunque no se muestren los fps (¿tal vez eso podría ser una primera mejora? :D ) yo diría que va sobre los 12 fps (ojo, en ambos casos a igualdad de tamaño del navegador -firefox4 en este caso-).

También he probado a hacer la pantalla del tuyo más pequeña (si, yo también creo que dejar que sea redimensionable es muy buena idea), pero no creas que eso hace que vaya mucho más rápido... es más, a mitad de tamaño desde luego no aumenta la velocidad al doble (de nuevo un contador de fps sería estupendo para tener datos más precisos).

Por otra parte, no te tomes esto como un reproche ni mucho menos. Ya me imagino no sólo el trabajo de hacer el emulador si no de montar la web, subir los juegos y demás zarandajas que no se ven a simple vista y que a buen seguro te cuestan tiempo y trabajo.

Finalmente, no sé si aquí es el sitio más adecuado para hablar de esto. Si quieres lo podemos seguir en otra parte y si algún moderador lo ve inadecuado que cierre el hilo sin más -yo desde luego no me enfadaré-.

Gracias de nuevo por tu trabajo.

Un saludo.

Avatar de Usuario
antoniovillena
Nonamed
Mensajes: 1162
Registrado: Dom Ene 09, 2011 8:55 am

Re: Emulador CPC [Offtopic]

Mensaje por antoniovillena » Vie Abr 22, 2011 11:39 pm

Hola curioso

No me enfado, toda sugerencia es buena. Además me viene bien que se prueben en otros navegadores para ver que tal funcionan. La recomendación de Chrome es solo por cuestiones de jugabilidad. Si llegas a 50fps en Firefox no tiene sentido cambiarte.

El caso es que con tu máquina deberías verlo a 50fps. Pongo un porcentaje en lugar de fps porque no todo el mundo sabe lo que es frame por segundo, aunque solo tienes que dividir entre 2 para pasar de porcentaje a fps.

He probado el Bomb Jack y en mi máquina me da unos tristes 6fps en cpcemu. Luego lo he probado en con roland y me sale una media del 50%, unos 25fps. La cifra que da roland es menos estable porque no siempre se pinta el frame entero, y dependiendo de las partes de la pantalla que se redibujen va más rápido o más lento. Incluso aunque se tenga que redibujar toda la pantalla la velocidad seguiría siendo mayor en roland. Puede que tengas una versión antigua del emulador en caché (donde la rutina de redibujado tenía un bug), así que si cargas desde aquí:

http://roland.antoniovillena.es/464?bombjack.tap

Y refrescas la caché, creo que es Ctrl+F5 en Firefox, obtienes la nueva versión. El cambio lo hice ayer y la caducidad que le he puesto es de 24h, por lo que igual no hace ni falta que refresques.

Tienes razón, lo lógico sería continuar esta conversación en otro foro, tengo un hilo abierto en un foro de amstrad, aunque puedes proponerme otro.

http://amstradcpc.mforos.com/305097/10297473-roland-un-nuevo-emulador-javascript/
Imagen

curioso1100
Herbert
Mensajes: 60
Registrado: Mar May 08, 2007 8:41 am

Re: Emulador CPC [Offtopic]

Mensaje por curioso1100 » Sab Abr 23, 2011 10:25 am

antoniovillena escribió:Pongo un porcentaje en lugar de fps porque no todo el mundo sabe lo que es frame por segundo, aunque solo tienes que dividir entre 2 para pasar de porcentaje a fps

pues perdona mi torpeza pero NO veo donde se marca ese porcentaje (¿o es que hay que arrancar de alguna forma concreta el juego para verlo?).

antoniovillena escribió:Puede que tengas una versión antigua del emulador en caché

efectivamente, tienes toda la razón del mundo, SI que tenía la versión antigua -aunque no hice nada especial, sólo me conecté a tu web y el navegador debió cargarla por error-. El caso es que la diferencia es ABISMAL entre esta y la otra, ahora puedo jugar perfectamente a Bomb Jack... no sabría decirte a cuantos fps, pero yo diría que a más que lo que consigue el otro emulador y a un tamaño de pantalla bastante grande -de nuevo más incluso que en el otro emulador-.

Por mi parte desde luego ya está todo resuelto. Es cierto que puedes mejorar la compatibilidad o que soporte más modelos de CPC, pero para echar un buen rato yo no necesito más :D

Si quieres que pruebe algo no tienes más que dicírmelo. Por otra parte, te contesto aquí porque no he conseguido "conectar" con el otro foro. He enviado un mensaje al administrador y en cuanto me conteste seguiré por allí (aunque lo que allí estás tratado no tiene mucho que ver con esto, ¿no?).

Muchísimas gracias por tu trabajo.

Un saludo.

Avatar de Usuario
antoniovillena
Nonamed
Mensajes: 1162
Registrado: Dom Ene 09, 2011 8:55 am

Re: Emulador CPC [Offtopic]

Mensaje por antoniovillena » Sab Abr 23, 2011 11:53 am

Hola Curioso

Me alegro de que ya te funcione bien. El porcentaje está en la barra de título, el emulador automáticamente detecta que está dentro de un frame y modifica el título del frame. Si no lo hace, prueba a sacarlo en una pestaña aparte (Ctrl+Click).

He puesto como principal la versión con los frames completos. Suele ser un poco más lento en fps pero da una velocidad más constante, por lo que mejora la jugabilidad (a no ser que tengas un ordenador muy lento).

Si quieres ayudarme prueba las dos versiones y dime cómo te van (en porcentaje) y estabilidad de este.
http://roland.antoniovillena.es/464?bombjack.tap
http://roland.antoniovillena.es/464s?bombjack.tap

Y gracias a tí por el feedback. No esperes muchos adelantos porque ahora toca hacer el betatesting. Tengo que sacar 2 emuladores más (664 y 6128) y es preferible pulir los fallos de éste antes que propagarlos.
Imagen

curioso1100
Herbert
Mensajes: 60
Registrado: Mar May 08, 2007 8:41 am

Re: Emulador CPC [Offtopic]

Mensaje por curioso1100 » Sab Abr 23, 2011 4:36 pm

antoniovillena escribió:El porcentaje está en la barra de título, el emulador automáticamente detecta que está dentro de un frame y modifica el título del frame. Si no lo hace, prueba a sacarlo en una pestaña aparte (Ctrl+Click).

Pues sigo sin ver ese porcentaje. En este enlace http://www.megaupload.com/?d=P6LNDQLA he hecho una captura de pantalla para que te hagas una idea de cómo lo veo yo... Tampoco lo de "Ctrl+Click" parece funcionar (o no sé exactamente como hacerlo, de nuevo te ruego disculpes lo torpe que soy para esto).

Por lo demás, he probado ambas versiones y funcionan correctamente. No sabría decirte si una es más rápida que la otra pues ambas creo que van casi igual -al menos a falta de un indicador más fiable que mi propia apreciación-.

Por supuesto estoy dispuesto a probar lo que necesites, con ese o con otro juego si lo crees necesario, y en cuanto me aclare con el tema de los "fps" te envío los datos para que puedas sacar tus conclusiones.

Muchas gracias de nuevo.

Un saludo.

Avatar de Usuario
antoniovillena
Nonamed
Mensajes: 1162
Registrado: Dom Ene 09, 2011 8:55 am

Re: Emulador CPC [Offtopic]

Mensaje por antoniovillena » Sab Abr 23, 2011 7:14 pm

Gracias curioso

No me había dado cuenta que en Firefox no se mostraba el porcentaje en el título. Lo he arreglado, por lo visto si no tienes nada definido en html->head->title, luego Firefox no te deja modificarlo con document.title= 'ejemplo'.

Si quieres pruébalo con la rom original. En este caso deberías notar la mayor diferencia de rendimiento entre ambas versiones:
http://roland.antoniovillena.es/464
http://roland.antoniovillena.es/464s

Saludos

Edito: Lo de control+click es para abrir enlaces en otra pestaña, también puedes usar el botón derecho (y elegir abrir en nueva pestaña) o el botón central del mouse. Ya no hace falta porque he dado con el error. Si prefieres ver los juegos siempre en otra pestaña sin tener que hacer esto, puse una opción NO FRAMES arriba del todo.
Imagen

curioso1100
Herbert
Mensajes: 60
Registrado: Mar May 08, 2007 8:41 am

Re: Emulador CPC [Offtopic]

Mensaje por curioso1100 » Dom Abr 24, 2011 9:55 am

antoniovillena escribió:si no tienes nada definido en html->head->title, luego Firefox no te deja modificarlo con document.title= 'ejemplo'

Pues has dado en el clavo. Ahora SI se muestra correctamente el porcentaje :D Enhorabuena, un problema menos :lol:

En cuanto a esto:
antoniovillena escribió:Si quieres pruébalo con la rom original

no sé exactamente a qué te refieres... ¿es que no era la ROM original lo que estaba usando? :shock: en fin, es sólo curiosidad... lo pruebo con el que mejor te venga, pues desde luego "externamente" parece el BombJack de toda la vida.

Respecto a las pruebas ahora SI que hay diferencias. Verás, con el primero de ellos -el que no lleva la "s"- va mucho más lento. En porcentaje oscila entre un 70% y un 75%, aunque para jugar pueda ser suficiente. El otro -el que lleva la "s"- lo creas o no va al 100% y a veces marca hasta el 103% :D

De todas formas, algo muy curioso es que con el que lleva la "s", el tamaño de la ventana del navegador NO afecta para nada a la velocidad... quiero decir, que tanto a pantalla completa como muy pequeñito va siempre al 100% -imagino que porque ya no le dejarás correr más que eso- mientras que la versión sin la "s", cuando es pequeño si consigue llegar al 100% -pero ojo, para esto tiene que ser muuuy pequeño- y cuanto más grande es la pantalla más despacio va.

No sé que optimizaciones has hecho, pero desde luego van por el buen camino... al menos en mi máquina va estupendamente (vaya, al final va a resultar que no voy a tener que comprarme otro portátil :twisted: ).

Un trabajo estupendo.

Muchísimas gracias de nuevo. Si quieres que pruebe cualquier otra cosa ya sabes donde estoy.

Avatar de Usuario
antoniovillena
Nonamed
Mensajes: 1162
Registrado: Dom Ene 09, 2011 8:55 am

Re: Emulador CPC [Offtopic]

Mensaje por antoniovillena » Dom Abr 24, 2011 7:21 pm

Hola Curioso

Gracias por hacer las pruebas. Con rom original me refería al emulador sin ningún juego (pantalla azul con el basic), perdona es que me explico fatal. Pero no importa, me imagino que aquí también la versión con "s" te irá más lenta.

Bueno estas son mis conclusiones:
-Firefox 4 tiene el javascript más lento de todos los navegadores modernos (Chrome, Safari, Opera).
-Firefox 4 soporta también aceleración por hardware.

Así que si tienes una tarjeta gráfica que soporte escalado hardware (la tuya X3100 lo tiene) Firefox la soporta, el emulador te irá más rápido que en los otros navegadores (y más rápido que la versión con "s").

No me he dado cuenta de esto porque ni en mi portátil ni en mi sobremesa funciona la aceleración del Firefox 4 (en el sobremesa tengo tarjeta gráfica dedicada). Te explico el algoritmo de la versión con "s":
1. Comparo si el byte gráfico a pintar ha cambiado desde el frame anterior.
2. Si lo ha hecho, lo pinto en el buffer de video (sin volcar a pantalla) y tengo en cuenta este pixel para calcular el mínimo/máximo.
3. Una vez procesado el frame, calculo las coordenadas mínimas/máximas a pintar, esto es, el recuadro mínimo que abarque todos los pixeles que han cambiado. Solo vuelco en pantalla (función putImageData en javascript) dicho recuadro, o no vuelco nada en caso de que ningún pixel haya cambiado.

En resumen, las optimizaciones, que están en la versión "s", no te sirven para nada. Como tu CPU no pierde tiempo escalando el canvas, puede dedicarse de lleno a la emulación Z80 y además le sobra tiempo puesto que muestra un 100% en la barra.

Por mí ya es suficiente, no necesito que hagas más pruebas, ya he llegado a mis conclusiones. Gracias de nuevo.

Saludos
Imagen

curioso1100
Herbert
Mensajes: 60
Registrado: Mar May 08, 2007 8:41 am

Re: Emulador CPC [Offtopic]

Mensaje por curioso1100 » Lun Abr 25, 2011 12:04 pm

antoniovillena escribió: las optimizaciones, que están en la versión "s", no te sirven para nada. Como tu CPU no pierde tiempo escalando el canvas, puede dedicarse de lleno a la emulación Z80

Entonces, si lo entiendo bien, las optimizaciones de la versión "s" sólo se aplican cuando NO hay aceleración por hardware. De todas formas las veo muy interesantes de cara a que el emulador funcione deprisa en cualquier máquina -con o sin aceleración-.

En cuanto a esto:
antoniovillena escribió:Una vez procesado el frame, calculo las coordenadas mínimas/máximas a pintar, esto es, el recuadro mínimo que abarque todos los pixeles que han cambiado

me ha parecido muy ingenioso, así que me he descargado de tu Web el código fuente del emulador y he intentado buscar la función putImageData en el fichero jcpc.js aunque no la veo. No pienses que puedo ayudarte, pues me temo que mis conocimientos de programación no dan para tanto, pero me ha llamado la atención y quería echarle un vistazo más que nada por curiosidad.

De todas formas, sería muy interesante saber cuanto "suele" medir el área de ese recuadro mínimo que mencionas pues está claro que cuanto menor sea más rápido será el proceso. Entiendo que según el juego y según los movimientos de los personajes ese recuadro medirá desde unos pocos pixels hasta casi la pantalla completa... probablemente el peor caso será cuando un personaje se mueva por la parte superior de la pantalla y un marcardor -que suelen estar en la zona inferior- se actualice, ¿verdad?. Tal vez sería posible tener un par de recuadros mínimos para estas situaciones, aunque imagino que los cálculos en este caso se complicarían y quizás no compense lo que se pueda ganar en velocidad por pintar menos.

No me hagas mucho caso pues ya te digo que no tengo ni la más remota idea de como hacerlo... de hecho, tampoco veo claro porqué si dices:
antoniovillena escribió: Comparo si el byte gráfico a pintar ha cambiado desde el frame anterior

me parece por tanto entender que sabes exactamente que bytes hay que pintar y cuales no, ¿porqué no pintas sólo esos? ¿es que la función putImageData te fuerza a imprimir siempre un recuadro???

En fin, ya te digo que no es más que curiosidad y comprendo que no eres un "profesor particular" para resolver cuestiones concretas... si tienes un rato pues lo haces y si no pues tan contentos. Eso si, cuando quieras probar algo no tienes más que decirlo.

Gracias de nuevo.

Un saludo.

Avatar de Usuario
antoniovillena
Nonamed
Mensajes: 1162
Registrado: Dom Ene 09, 2011 8:55 am

Re: Emulador CPC [Offtopic]

Mensaje por antoniovillena » Lun Abr 25, 2011 11:51 pm

Entonces, si lo entiendo bien, las optimizaciones de la versión "s" sólo se aplican cuando NO hay aceleración por hardware. De todas formas las veo muy interesantes de cara a que el emulador funcione deprisa en cualquier máquina -con o sin aceleración-.


Desgraciadamente no hoy forma (o no la he encontrado) de saber si existe aceleración por hardware. Podría usar el user-agent para descartar navegadores que no la usen, pero de momento prefiero dejarlo así (versiones separadas). Que yo sepa hasta ahora solo Firefox 4 la usa, y solo en ordenadores con gráficas soportadas.

me ha parecido muy ingenioso, así que me he descargado de tu Web el código fuente del emulador y he intentado buscar la función putImageData en el fichero jcpc.js aunque no la veo. No pienses que puedo ayudarte, pues me temo que mis conocimientos de programación no dan para tanto, pero me ha llamado la atención y quería echarle un vistazo más que nada por curiosidad.

De todas formas, sería muy interesante saber cuanto "suele" medir el área de ese recuadro mínimo que mencionas pues está claro que cuanto menor sea más rápido será el proceso. Entiendo que según el juego y según los movimientos de los personajes ese recuadro medirá desde unos pocos pixels hasta casi la pantalla completa... probablemente el peor caso será cuando un personaje se mueva por la parte superior de la pantalla y un marcardor -que suelen estar en la zona inferior- se actualice, ¿verdad?. Tal vez sería posible tener un par de recuadros mínimos para estas situaciones, aunque imagino que los cálculos en este caso se complicarían y quizás no compense lo que se pueda ganar en velocidad por pintar menos.


El código que hay es de la versión sin optimizaciones, te pongo aquí un fragmento (solo pinta en modo 0) de la optimizada:

Código: Seleccionar todo

  u= -1;
  mix= miy= 300;
  max= may= 0;
  if(gm==0){
    for(z= 0; z<=cr[9]; z++)
      for(y= 0, ma= cr[13]|cr[12]<<8; y<cr[6]; y++)
        for(x= 0, pos= (t= y*cr[9]+y+z)*(cr[1]<<gm+2)<<2; x<cr[1]; x++){
          by= mw[ma>>12][v=ma<<1&0x7ff|z<<11];
          if(vb[++u]!=by){
            vb[u]= by;
            if(x<mix)
              mix= x;
            else if(x>max)
              max= x;
            if(t < miy)
              miy= t;
            else if(t > may)
              may= t;
            b0= pl[lut0[by]];
            eld[pos++]= b0[0];
            eld[pos++]= b0[1];
            eld[pos++]= b0[2];
            pos++;
            b0= pl[lut1[by]];
            eld[pos++]= b0[0];
            eld[pos++]= b0[1];
            eld[pos++]= b0[2];
            pos++;
          }
          else
            pos+= 8;
          by= mw[ma++>>12][v+1];
          if(vb[++u]!=by){
            vb[u]= by;
            if(x<mix)
              mix= x;
            else if(x>max)
              max= x;
            if(t < miy)
              miy= t;
            else if(t > may)
              may= t;
            b0= pl[lut0[by]],
            eld[pos++]= b0[0],
            eld[pos++]= b0[1],
            eld[pos++]= b0[2],
            pos++,
            b0= pl[lut1[by]],
            eld[pos++]= b0[0],
            eld[pos++]= b0[1],
            eld[pos++]= b0[2],
            pos++;
          }
          else
            pos+= 8;
        }
    if(may>miy)
      ct.putImageData(elm, 0, 0, (mix<<2)-1, miy-1, (max-mix<<2)+6, may-miy+3);
  }
  else if(gm==1){
  ...


Es lo más sencillo y que mejor resultados me da. Hay juegos como Chase HQ que pintan 1 de cada 6 frames, otros solo usan una porción de la pantalla. Habrá casos (plataformas sin scroll) en los que otra optimización que dibuje más recuadros (detectaría los sprites) sea más efectiva. Pero como bien dices, mientras más cálculos tengas que hacer para encontrar los recuadros, más tiempo pierdes, aunque teniendo en cuenta lo lento que es el escalado software en los navegadores actuales esto da mucho juego. Si quieres ver una optimización más compleja échale un vistazo al fuente del jbacteria.

me parece por tanto entender que sabes exactamente que bytes hay que pintar y cuales no, ¿porqué no pintas sólo esos? ¿es que la función putImageData te fuerza a imprimir siempre un recuadro???

En fin, ya te digo que no es más que curiosidad y comprendo que no eres un "profesor particular" para resolver cuestiones concretas... si tienes un rato pues lo haces y si no pues tan contentos. Eso si, cuando quieras probar algo no tienes más que decirlo.


No me importa, además tus dudas pueden tenerlas otras personas que lean este foro, aunque también es verdad que nos estamos pasando con el offtopic.

Sé exactamente los bytes que han cambiado porque guardo en un buffer (vb) el contenido de la memoria de video del CPC del anterior frame. Evidentemente compruebo si el byte es distinto, y si no lo es, ni lo actualizo ni tengo en cuenta ese pixel/es para calcular el recuadro final.

En cuanto a putImageData, lo que hace es volcar el backbuffer en pantalla. Lo que pintas en el array (eld) no se muestra directamente, solo lo hace cuando lo invocas con este método. Y este método tiene dos formas de llamarlo, una con 3 parámetros (que pinta en canvas completo), y otra con 7, donde las 4 últimas coordenadas son del recuadro que quieres que actualice. Mientras más pequeño sea el recuadro menos trabajo le das al escalador software del navegador.

Saludos

Edito: el array lut0 es una tabla lookup para extraer los pixeles, aquí tienes el código de generación:

Código: Seleccionar todo

  for (t= 0; t < 256; t++)
    lut0[t]= t>>7&1 | t>>3&4 | t>>2&2 | t<<2&8;
Imagen

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado