Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Optimizar Direct3d Para 2d

Iniciado por KACHORRO, 25 de Octubre de 2005, 07:32:55 PM

« anterior - próximo »

Ray

 Creo que podría ser correcto pero no se si con la suficiente precisión. Supongamos que el juego corre a 100pfs, cada pasada tardará 10 milésimas aprox.

unframe = 10.0 / 1000 = 0.01;
fps = 1.0 / unframe = 100;

o lo que es lo mismo  1000.0 / 10 = 100 fps;

hasta aquí bien, el problema es que seguramente cada vez te va a dar un resultado diferente en milésimas, 8, 9, 10, 11, 12.., de manera que si el valor es por ejemplo 8 aumenta en 25 los fps:

fps = 1000.0 / 8 = 125;

Todas estas variaciones vistas en pantalla serán un baile de cifras a una velocidad imposible de leer y que no te va a ser muy útil. Lo mejor es llevar un contador de frames,y visualizarlo cada vez que transcurre un segundo, te pongo un ejemplo sencillo aunque existen formas de hacerlo mejor.


void fps()
{
static DWORD OldTime=timeGetTime();
static DWORD FrameCount=0;
static DWORD fps=75;

DWORD NewTime = timeGetTime();

if (NewTime - OldTime >= 1000) {

  fps = FrameCount;

  FrameCount=0;

  OldTime = NewTime;
  }

FrameCount++;

// Visualizar fps
}


pekul

 Por qué se programa 2d utilizando 3d? d3d sigue teniendo las herramientas 2d de directdraw no? que ventaja tiene utilizar 3d para simular 2d?  

[EX3]

 
Cita de: "pekul"Por qué se programa 2d utilizando 3d?
Buena pregunta. Para aprovechar la aceleracion por hardware y asi lograr potencia en operaciones que son costosas si se hicieran a nivel de software, entre ellas el alphablending por ejemplo. En resumen, se trata de quitarle todo el trabajo posible a la CPU repartiendo el trabajo entre la CPU, que haria de todo un poco, y entre la GPU (procesador de la tarjeta grafica) que seria la que se llevaria el trabajo de todas las operaciones graficas.

Cita de: "pekul"d3d sigue teniendo las herramientas 2d de directdraw no?
No. La mecanica dista mucho de ser la de DirectDraw. En DirectDraw bliteas mapas de bits en superficies. En D3D montas texturas sobre poligonos en un plano ortogonal y que renderizas en pantalla. Seria una especie de "bliteo" pero un poco mas complejo.

Cita de: "pekul"que ventaja tiene utilizar 3d para simular 2d?
Ventajas como dije antes las que te brinda aprovechar la aceleracion por hardware de la tarjeta grafica, ventajas para realizar operaciones como:
  • AlphaBlending, no tienes que estar calculando el valor resultante de la mezcla entre el color del pixel de destino con el del pixel del sprite. La tarjeta los calcula por ti y mucho mas rapido y optimo que si lo hicieras por codigo, y sin tener que calcular pixel a pixel.
  • Rotacion de graficos. Resulta menos costoso rotar las coordenadas del poligono que contiene la textura que calcular la rotacion pixel a pixel como se haria a nivel de software.
  • Transofrmaciones. Al estar trabajando con poligonos puedes hacer cosas similares a esta:


    Todo esto modificando la posicion de unos pocos vertices. Hacer eso en modo software pixel a pixel requeriria mas trabajo.

  • Efectos de iluminacion mediante transparencias aditivas y o a nivel de pixel...
  • Aceleracion en operaciones con colores, mezclas o tintados en imagenes, degradados...
    Y muchas mas cosas, las posibilidades y las ventajas son mas de las que te puedes imaginar.

    Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

KACHORRO

 EX3 ha expuesto muy bien los motivos...

aunque yo voy a dar uno mas... DirectDraw dejó de soportarse en DirectX 7.0 y aunque su funcionamiento era y sigue siendo muy bueno, nunca se sabe si mañana Microsoft decide dejar de soportarlo en los próximos directx
y obviamente las tarjetas graficas nuevas ni se molestarán mucho en darle apoyo hardware especifico. asi que renovarse o morir, aunque sea para simular 2d en un entorno 3d... (y en mi caso es peor, porque simulo 3d sobre 2d simulado en 3d
:P )

TheAzazel

 @kachorro, y lo de pasarlo todo a opengl... es sencillo tal y como lo has creado? que luego eso da muchos quebraderos de melon....

KACHORRO

 Si ya lo tengo pasado , a Direct3D, pero de la misma forma lo pasé a OpenGL

simplemente hay que cambiar la capa gráfica del motor isométrico. Qué no es gran cosa, con un putsprite y poco más se hacen grandes cosas.


Ray

 Si usas opengl hay una forma eficiente de guardar y renderizar posteriormente la informacíon de los estados, primitivas, etc.  Con listas de presentación.

Así es su uso.


GLuint Arbol;
glNewList( Arbol=glGenLists(1), GL_COMPILE);

/*
aqui establecemos la textura, mezclas, primitivas, y cualquier tipo de operación necesaria para dibujar el sprite, objeto 3d, o combinaciones de estos, sin importar el número de cálculos o funciones propias que usemos para ello. Nos despreocupamos.
*/

glEndList();

En la lista queda guardada solo la información necesaria y optimizada para ser enviada a la tarjeta gráfica cuando queramos dibujar.  Lógicamente cuantos menos hayan más rápido irá, por lo que siempre es mejor hacer grupos que usen la misma textura.

Con glTranslate le decimos donde queremos situarlo antes de llamar a la lista.


glTranslatef(200.0, 20.0, 0.0);
glCallList(Arbol);

glTranslatef(100.0, 50.0, 0.0);
glCallList(Arbol);
...


Me gusta OpenGL  B)  






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.