SoloCodigo

Programación Específica => Programación de Videojuegos => Mensaje iniciado por: Ruben3d en Martes 3 de Febrero de 2004, 19:24

Título: ¿qué Librería Gráfica Utilizar?
Publicado por: Ruben3d en Martes 3 de Febrero de 2004, 19:24
Hola a todos.

Me gustaría saber qué librería gráfica debería utilizar bajo Windows para poder pintar píxeles de la forma más eficiente.

Me explicaré un poco más. Me gustaría que la librería me permitiera crear un primary buffer y un backbuffer, en el que pintar. Y permitirme intercambiar los contenidos para evitar el parpadeo.

Además, me gustaría que soportara al menos 16 bits de color y un direccionamiento lineal para el backbuffer, lo que me permitiría pintar los píxeles más o menos así:

Código: Text
  1.  
  2. PintarPixel(x,y, color)
  3. {
  4.     backbuffer[x+y*anchuraPantalla] = color;   // backbuffer es un puntero al backbuffer
  5. }
  6.  
  7.  
  8.  

He estado buscando por internet y algunas de las librerías que creo que permiten esto son (corregidme si me equivoco):¿Alguien me podría decir con cuál de estas librerías se podría implementar esto de la manera más sencilla y eficiente posible?

Muchas gracias.

Ruben3d
Título: Re: ¿qué Librería Gráfica Utilizar?
Publicado por: JuanK en Martes 3 de Febrero de 2004, 20:31
todas te sirven y todas permiten backbuffer.
el ejemplo de gdi que coloque hoy en el foro de c++ usa double buffer.
directx es implicitamente gdi, ya que se monta partiendo de este,

allegro, salvo que lo uses en djgpp o en un entorno dos o linux... tambien resulta usar directx. :smartass:
Título: Re: ¿qué Librería Gráfica Utilizar?
Publicado por: Ruben3d en Martes 3 de Febrero de 2004, 21:13
Hola!

Gracias por la respuesta. Después de haberla leido me quedan algunas dudas:

- Si DirectX usa GDI, y Allegro usa DirectX, ¿la librería más eficiente es GDI?

- En el código que has puesto en el foro de C++ parace que el contexto del dispositivo (hdc) hace de PrimaryBuffer, y creas un BackBuffer que copias al Primary llamado (hdcmem) usando BitBlt(). ¿Es esto así?

- ¿Puedo pintar píxeles en hdcmem de la manera que he expuesto en el primer post?

- ¿Quedaría algo más claro el código si se usara DirectDraw, aunque esté basado en GDI?

Espero que no sean demasiadas preguntas  :(

Muchas gracias.

Ruben3d
Título: Re: ¿qué Librería Gráfica Utilizar?
Publicado por: JuanK en Martes 3 de Febrero de 2004, 22:52
1-- si en teoria, aunque allegro realmente no usa nada en gdi, se hizo una version que utiliza directx, con el fin de crear compatibilidad con la programacion para win32, en todo caso si usas muchas cosas en gdi para hacer lo que hace una funcion en directX .. el resultadio no sera mejor ya que las librerias ahn sido desarrololadas de la forma mas optimizada posible lo cual seguramente es mejor de lo que cualquirea de nosotros lograria
2-si
3- no exactamente de esa forma, pero deben haber funciones capaces de soportarlo y ademas funciones que copien de un backbuffer normal (char *) a un contexto de memoria.
4-si quedaria mas claro , pero en ese caso usa c++ y no c, es mas emjor c#.. es lo mas claro que conozco en cuanto programacion., si usas lenguaje c, mejor usa allegro.
Título: Re: ¿qué Librería Gráfica Utilizar?
Publicado por: Ruben3d en Miércoles 4 de Febrero de 2004, 10:37
Estoy usando C++, así que creo que me decantaré por DirectDraw. Me pondré a investigar sobre cómo usarlo para conseguir lo que quiero.

Muchas gracias por tus respuestas!  :gracias:

Un saludo.

Ruben3d
Título: Re: ¿qué Librería Gráfica Utilizar?
Publicado por: Amilius en Jueves 5 de Febrero de 2004, 01:55
"el resultadio no sera mejor ya que las librerias ahn sido desarrololadas de la forma mas optimizada posible lo cual seguramente es mejor de lo que cualquirea de nosotros lograria"

Hmmm... Considerando que hablamos de microsoft...

En realidad es relativo, si hablas de funciones de propósito general o específicas para cubrir un problema puntual:

Ej. "Cambiar el tamaño a una superficie", sólo perderíamos tiempo haciendo una nueva función que haga esto, ya que existe una buena de propósito general que hace lo mismo. Pero si lo que SIEMPRE haremos es "Cambiar el tamaño de una superficie al DOBLE de ancho y de alto" entoces podremos crear una función de propósito específico y por esto mismo podrá ser mucho más rápida.

Lo mismo sucede con los efectos alpha: el método genérico es útil para multitud de casos, pero si sólo necesitamos un alpha del 50% podremos crear una función específica que será mucho más rápida, claro que esto puede ser muy relativo si la tarjeta aceleradora es TAN buena que incluso su función genérica de alpha es más rápida que una función simplificada e implementada para que la ejecute el procesador, aunque seguramente la transmisión entre memoria de video, RAM y otra vez memoria de video sea el peso fundamental que termine por hacer más lento cualquier edición hecha por el procesador.

Personalmente pude comprobar el peso de tener memorias lentas: mover memoria (bitblt) toma prácticamente el mismo tiempo que aplicar un efecto de transparencia al 50%. La respuesta es que mientras el procesador espera a la lenta RAM, puede darse el lujo de hacer algunas operaciones con sus registros.

¿Alguien sabe en que quedo el "cg" de NVIDIA?

PD.

Lo mejor del direct draw es esto:

if SuperficieRender.lock (@Rectangulo_Origen,lpDDSurfaceDesc,DDLOCK_WAIT,0)=DD_OK then
begin
   .....
    membase:=lpDDSurfaceDesc.lpSurface;
    ...

    SuperficieRender.unlock(@Rectangulo_Origen);
end

Te da una referencia al sector de memoria donde está la "superficie" gráfica, además de otras variables para navegar por ese bloque contiguo de memoria (ancho, alto, ancho con alineación a n bytes, etc).

"membase" y "posicionActual" son referencias a memoria,

luego tu

" backbuffer[x+y*anchuraPantalla] = color "

sería:

posicionActual:=pointer (integer(membase)+x+y*anchuraPantalla);

si anchuraPantalla es potencia de 2 mejor por velocidad:
(log2anchuraPantalla es una constante)

posicionActual:=pointer (integer(membase)+x+y shl log2anchuraPantalla);

luego para escribir o leer:

miword:=word(posicionActual^ );
milongint:=longint(posicionActual^ );
mibyte:=byte(posicionActual^ );

word(posicionActual^ ):=$09FF;
longint(posicionActual^ ):=$00FFFFFF;
byte(posicionActual^ ):=$09;

PD2. Los primeros 4 "type casting" sólo son para el programador, por respeto a los tipos de datos y para evitar bugs por interpretaciones ambiguas, en realidad no generan código máquina y no se usan en C. Los 6 restantes "type casting" indican tamaños de memoria.
Título: Re: ¿qué Librería Gráfica Utilizar?
Publicado por: JuanK en Jueves 5 de Febrero de 2004, 04:38
Definitivamente amilus sabes bastabte de esto de los videojuegos!!!!

te felicito!!!.
Título: Re: ¿qué Librería Gráfica Utilizar?
Publicado por: Ruben3d en Viernes 6 de Febrero de 2004, 13:27
Muchas gracias por toda la información.

Un saludo.

Ruben3d
Título: Re: ¿qué Librería Gráfica Utilizar?
Publicado por: hetand en Lunes 29 de Marzo de 2004, 18:08
Necesito algun orientacion respecto a la libreria SDL, para realizar un juego utilizando C++...
utilizo Builder 6 C++--
Si alguien puede dar alguna informacion acerca de donde obtengo SDL y como lo "configuro" para poder trabajar con Builder..

Gracias