• Domingo 28 de Abril de 2024, 21:41

Autor Tema:  Problemas Con Apis Gráficas  (Leído 1611 veces)

Pitfall

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Problemas Con Apis Gráficas
« en: Jueves 25 de Mayo de 2006, 13:20 »
0
Hola a todos! Quería pedir consejo sobre qué API utilizar en el programa que me encuentro realizando, y que me corrijáis sobre las conclusiones que he sacado en las pruebas que he hecho en caso de estar equicado.

Me encuentro realizando un programa que genera gráficas basadas en unos datos que van llegando, estas gráficas (en 2D) se van desplazando hacia la izquierda y tal. Probé con GDI, ya sabéis, usando doble buffer mediante Bitmap que se copian al DC con la función BitBlt, pero se producía parpadeo al desplazar las gráficas, un parpadeo que en monitores normales CRT no se apreciaba, pero en portátiles y en general en monitores TFT sí que era de sobra apreciable.

Después probé con DirectX, que tiene un mecanismo de intercambio de superficies mediante la función flip, el problema es que mi aplicación funciona en modo ventana, y en DirectX el intercambio de superficies solo lo puedes hacer a pantalla completa, en modo ventana no tienes más remedio que usar Blt, por lo que no pude corregir el parpadeo con DirectX. Si me equivoco en algo, por favor corríjanme.

Lo último que hice fue usar OpenGL, en modo 2D. Lo cierto es que con OpenGL sí que llegué a solucionar el problema del parpadeo, ya que sí permite el intercambio de buffers mediante la función SwapBuffers en modo ventana, sin tener que recurrir a transferencias de memoria. El problema que me surgió es que OpenGL no es thread-safe, con lo que no puedo tener varios threads pintando a la vez, puesto que mi aplicación tiene que pintar varias gráficas simultáneamente y cada thread se ocupa de una, y además cada gráfica usa un contexto de dispositivo distinto, por lo que no entiendo que no pueda haber más de un thread pintando a la vez. Estos tienen que llamar a MakeCurrent cada vez que quieren pintar, por lo que pinta uno, después otro... y así sucesivamente. Esto provoca que cuando vas añadiendo nuevas gráficas se realenticen las demás. ¿Hay alguna manera de que con OpenGL se puedan tener varios threads pintando a la vez? ¿Existe alguna extensión de OpenGL que permita que varios threads pinten al mismo tiempo?

Bueno, ya conocen mi problema, ¿qué me recomiendan? ¿Quizás alguna otra API gráfica? ¿O hay alguna solución con alguna de las que he usado?

Gracias, un saludo!!!

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Problemas Con Apis Gráficas
« Respuesta #1 en: Jueves 25 de Mayo de 2006, 14:06 »
0
Con DirectX  o con GDI lo puedes hacer , pero para evitar el parpadeo debes controlar el barrido del dibujo de la pantalla, es decir esperas a que pase el barrido para dibujar.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

Pitfall

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Problemas Con Apis Gráficas
« Respuesta #2 en: Viernes 26 de Mayo de 2006, 09:35 »
0
Para esperar lo del barrido sé que en DirecX había una función WaitForVerticalBlank que lo hacía, aunque me ralentizaba las gráficas, pero vamos, que tampoco es problema, le pongo menos tiempo al Sleep del thread y ya está. Existe una función parecida en GDI?

Esa función la probé en DirecX, y aunque iba mejor no terminaba de solucionar el problema, ten en cuenta que el problema lo tengo en monitores TFT, que es donde se aprecia el parpadeo, y el barrido de pantalla en estos monitores no es como en los CRT de toda la vida.