• Jueves 28 de Marzo de 2024, 18:28

Autor Tema:  Resultado Inesperado En Doble Buffering  (Leído 2652 veces)

Vaporeto

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Resultado Inesperado En Doble Buffering
« en: Viernes 27 de Agosto de 2004, 02:04 »
0
Weno esta es la segunda vez ke escribo este mensaje pq "algo extraño" ocurrio cuando ya casi lo tenia escrito por primera vez :whistling:  

En primer lugar como hace tiempo ke no intervenia en el foro, keria saludar a todos y agradecer las respuestas ke me dieron en su dia  :rolleyes: Ahi va mi duda:

Pues resulta que estaba experimentando formas de volcado a pantalla con un ejemplo que habia encontrado por ahi que funcionaba a las mil maravillas. La parte que interesa del codigo es esta:

Código: Text
  1.  
  2.     dblbuffer = create_bitmap(SCREEN_W, SCREEN_H);
  3.     if(dblbuffer)
  4.     {
  5.        clear(dblbuffer);
  6.        circlefill(dblbuffer, 0, 100, 50, 15);
  7.  
  8.        vsync();
  9.        blit(dblbuffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
  10.  
  11.        for (x = 1; x < 320; x++) {
  12.              rest(10);    
  13.              circlefill(dblbuffer, x - 1, 100, 50, 0);  
  14.              circlefill(dblbuffer, x, 100, 50, 15);  
  15.              textout_centre(dblbuffer, font, "Con doble buffer", SCREEN_W/2, 3, 15);
  16.  
  17.              vsync();
  18.                blit(dblbuffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
  19.  
  20.        }
  21.  
  22.        // Ahora, recuerde que debe liverar la memoria previamente reservada.
  23.        destroy_bitmap(dblbuffer);
  24.        return 0;
  25.     }
  26.  
  27.  

El problema llego cuando sustitui el create_bitmap por create_video_bitmap, que teoricamente deberia ser mas eficiente al ser la copia de vram a vram, pero el efecto resultante fue un horrible parpadeo de la figura similar al que se produce cuando se copia directamente a vram sin esperar el retrazo. Esto me parece bastante paradojico, dado que si no se producia con un bitmap de memoria convencional, como puede producirse con un bitmap de vram?

Mencionar que probe a quitar el vsync() para comprobar si al ser la copia de vram a vram hecha por hard pudiera existir un vsync() implicito ke interfiriera con la llamada explicita, pero el asunto no mejoraba en absoluto.

Otra duda que me atormenta  :D  es saber que opcion consideran mejor para el volcado (en rendimiento o en ventajas practicas) hacer un doble buffer o un page flipping?

Un saludo a todos y gracias de antemano.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Resultado Inesperado En Doble Buffering
« Respuesta #1 en: Sábado 28 de Agosto de 2004, 16:28 »
0
Citar
Esto me parece bastante paradojico, dado que si no se producia con un bitmap de memoria convencional, como puede producirse con un bitmap de vram?

Se supone que sio es mas rapido con el video_buffer pero esto solo escierto si tu tarjeta de video tiene implemantada la funcion de blit de video a video por hardware... es decir allegro detecta esto en la tarjeta al iniciarce y si la tarjeta tiene esta capacidad el blit se ejecuta de un segmento de memoria de video de la tarjeta a otro y es muy rapido, pero sino lo tiene entonces es mucho mas demorado que hacerlo de memoria normal a memoria de video, puesto que se hace asi (teoricamente, es decir esto es lo que tengo entendido, puede que no sea tan asi...):

copia de memoria a memoria de video
1- se lee el bloque de memoria
2- se envia a travez del DMA
3- se recibe en un buffer de recibo de la tarjeta de video
4- se mueve a la seccion de memoria especificada

copia de video a video cuando la tarjeta lo soporta
1- se lee del buffer
2- se copia en el buffer

copia de video a video cuando la tarjeta NO lo soporta
1- se lee de la seccin de memoria de video
2- se coloca en un buffer temporal de envio
3- se envia al DMA
4- Se direcciona a un bloque de memoria
5- se lee el bloque de memoria
6- se envia a travez del DMA
7- se recibe en un buffer de recibo de la tarjeta de video
8- se mueve a la seccion de memoria especificada
-----------------------------------------------------------------
Citar
Otra duda que me atormenta  es saber que opcion consideran mejor para el volcado (en rendimiento o en ventajas practicas) hacer un doble buffer o un page flipping?
el page flipping es mas rapido... mucho mas rapido, pero trae muchas otras dificultades tecnicas.
el double buffer es mas sencillo de manejar y es lo mas usado en la mayoria de los casos.

Existe otra tecnica que no manejo muy bien que es llamada triple buffering pero depende de algunas cualidades de la tarjeta de video.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Vaporeto

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Resultado Inesperado En Doble Buffering
« Respuesta #2 en: Sábado 28 de Agosto de 2004, 16:42 »
0
Hola de nuevo, muchas gracias por la respuesta Juank. El caso es que si tengo activada la aceleracion por hard del blit... por eso me parecia tan curioso que se ralentizara tanto el tema, en fin, no se que puede ser, puesto que cuando uso el page flipping va de miedo.

Un saludo.

Vaporeto

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Resultado Inesperado En Doble Buffering
« Respuesta #3 en: Sábado 28 de Agosto de 2004, 17:36 »
0
Estoy dandole vueltas a lo de que el page flipping tiene otros problemas que lo hacen complicado de usar, puedes decirme mas o menos cuales son si no te ocupa mucho tiempo (es que yo solo le veo ventajas :) ).

Muchas gracias de nuevo.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Resultado Inesperado En Doble Buffering
« Respuesta #4 en: Lunes 30 de Agosto de 2004, 06:49 »
0
No puedes manejar video dentro de ventanas, solo pantalla completa.
El page flipping implica solo usar memoria de video, es decir no dispones de la memoria del sistema para ejecutar operaciones... lo cual conlleva a que en algunos casos realizar operaciones sea muy lento... salvo eso si que la tajeta tenga implementadas varias funcionalidades.
hasta donde tengo entendido hay problemas con la sincronizacion de los eventos, ya que el tiempo del flipping puede ser variable en multiples circunstancias.
Se pueden presenter overlapeds entre los mapas de bits sino se es cuidados con el uso de los recursos de memoria de la tarjeta.
En tarjetas On-Board es posible que no se presente mejora alguna entre usar double buffer o usar page flipping ya que utilizan el mismo tipo de recurso.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Vaporeto

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Resultado Inesperado En Doble Buffering
« Respuesta #5 en: Lunes 30 de Agosto de 2004, 21:23 »
0
Muchisimas gracias por la info JuanK :)

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: Resultado Inesperado En Doble Buffering
« Respuesta #6 en: Lunes 30 de Agosto de 2004, 22:50 »
0
Sólo agregar un detalle:

Dudo que alguna aceleradora de video algún dia implemente un "circlefill", así que esa operación sólo se puede realizar moviendo la superficie a RAM y luego volver a moverla a video.

Si realizarás cualquier operación de filtrado en alguna superficie, esta tiene que estar en memoria del sistema y no en tarjeta de video, o tendrás el mismo lío que en el caso:

"copia de video a video cuando la tarjeta NO lo soporta"
(Ver el mensaje de Juank.)

Ya que para procesar la superficie, esta tendrá que ser copiada a memoria de sistema y luego de terminado el filtrado debe ser copiada a memoria de video. Aunque no creas esa "simple copia" entre memoria de sistema y de video puede ser realmente LEEEEENTA. (Eso muestra la gran importancia de tener tanta memoria como sea posible en la tarjeta de video, o aceleradora si prefieren y que esta tarjeta se encargue de todo el trabajo de filtrado para evitar a toda costa el trámite de pasar de memoria de video a Sistema y viceversa)

Sólo cuando tu superficie esté totalmente terminada de "filtrar" la pasarás a video.

P.D.

Tal vez el problema más molesto del page flipping es cuando ocurre un error en tu programa, tu pantalla NO vuelve al estado normal: Todo negro y  tienes que reiniciar.  :(

Vaporeto

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Resultado Inesperado En Doble Buffering
« Respuesta #7 en: Lunes 30 de Agosto de 2004, 23:33 »
0
Hola Amilius, gracias por tu respuesta, pero hay algo que no he entendido:

Citar
Si realizarás cualquier operación de filtrado en alguna superficie, esta tiene que estar en memoria del sistema y no en tarjeta de video, o tendrás el mismo lío que en el caso:

"copia de video a video cuando la tarjeta NO lo soporta"
(Ver el mensaje de Juank.)

Hasta ahi pillado, para que no haya problema el filtrado en memoria de sistema

Citar
...
(Eso muestra la gran importancia de tener tanta memoria como sea posible en la tarjeta de video, o aceleradora si prefieren y que esta tarjeta se encargue de todo el trabajo de filtrado para evitar a toda costa el trámite de pasar de memoria de video a Sistema y viceversa)

Pero, entonces si tengo mucha memoria de video si puedo hacer el filtrado en VRAM?