Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - KACHORRO

#16
Programación gráfica / Optimizar Direct3d Para 2d
29 de Octubre de 2005, 07:55:31 AM
 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 )
#17
Programación gráfica / Optimizar Direct3d Para 2d
28 de Octubre de 2005, 06:33:52 AM
 A todo esto... entre tanta optimización... no estoy midiendo ningún resultado :P

He visto la función timeGetTime() que te devuelve el lapso de tiempo en milisegundos.

Así que he pensado lo siguiente:

tiempo_inicio=timeGetTime();
.....
render y programa
.....
tiempo_final=timeGetTime();

unframe=(tiempo_final-tiempo_inicial)/1000; //esto son los segundos que tarda un frame
fps=1/unframe; //esto me da los frames por segundo

¿es correcto?



#18
Programación gráfica / Optimizar Direct3d Para 2d
28 de Octubre de 2005, 05:31:29 AM
 Gracias. Le echaré un vistazo.
#19
 Bueno, realmente a mi no me importa mucho el rendimiento de este getpixel porque se hace en un momento muy puntual en el que el rendimiento no es critico. En cualquier caso, es bueno saber como hacerlo más eficiente.  
#20
 Yo he accedido a la textura mediante el metodo LockRect
En mi caso fué para hacer un getpixel, aunque supongo que podrás hacerlo a la inversa.

Te muestro mi codigo:

Citar
        DWORD*   ptr;
   DWORD bytesporpixel;
        RECT r;
        D3DLOCKED_RECT data;
   r.left=x;
        r.top=y;
        r.right=x+tamx;
        r.bottom=y+tamy;
   textura->LockRect(0, &data, &r, 0);
   ptr = (DWORD*)data.pBits;
   bytesporpixel = data.Pitch / sizeof(DWORD);
   textura->UnlockRect(0);

Y ya está, en ptr tienes el puntero a los datos... eso sí, no sé cuan ineficiente puede llegar a ser el método de bloquear un rect en la textura, pero para un getpixel que no es en tiempo real de juego, me va de maravilla... otra cosa es para historias mas complejas.
#21
Programación gráfica / Optimizar Direct3d Para 2d
26 de Octubre de 2005, 05:28:20 PM
 Te equivocas zupervaca, es por post como los tuyos por los que sigo usando el foro de stratos y creando nuevos hilos. Muchas gracias.

Si te fijas bien, el problema de las texturas de potencia de 2 que tú me comentabas se refería al contexto dentro del uso de la clase Id3dxsprite , la cual no conseguí echar andar (probablemente por el motivo que tú me comentaste), y que cuando leí tu post, ya era tarde, pues fruto de mi desesperación el domingo, ya habia implementado mi propia clase sprite (aunque fuera fruto de un copy y paste de GameDev :-) )

No obstante el problema de las surfaces potencia de 2 es intrínseco a direct3d y opengl, puesto que es originario en la forma de funcionar de las tarjetas 3D. Así pues, me lo volví a encontrar, pero esta vez en mi propia clase sprite (contexto de este hilo del foro).

Esta vez simplemente era como evitar dibujar toda la textura para dibujar sólamente el gráfico que me interesaba.

Y, de verdad, cuando hago alguna consulta en este u otro foro, deberías ver las veces que vuelvo a consultar los hilos para leer las respuestas, aún a sabiendas de que no voy a encontrar ninguna nueva, y suelo leerme las antiguas una y otra vez. Incluidas, aunque no lo creas, las tuyas.

Y de nuevo reitero mi agradecimiento, a ti, y a todos los que en este y otros foros, pierden una pizca de su tiempo en ayudar a gente como yo, que en muchos casos por mera ignorancia, y en otros por suprema vagueza, hacemos uso y abuso de los mismos.

Un saludo !!  (ole)  
#22
Programación gráfica / Optimizar Direct3d Para 2d
26 de Octubre de 2005, 01:39:31 PM
 Ciertamente tienes razón... a mi me interesa terminar el juego, y parte de esta intencíón estaba motivada porque ya tenia el engine en directdraw. Sin embargo el paso del tiempo ya las necesidades técnicas me obligan a migrar lo ya hecho a un motor más potente, que me proporcione algunas ventajas como las transparecias o los filtros por hard.

Dado que el engine que ya tenia hecho, al ser completamente en 2D, sólo necesitaba de un put_sprite y poco mas, su migración a otra plataforma no es demasiado dificil (yo mismo lo he hecho a opengl y a direct3d en una semana y sin tener mucha idea de ambos, como podeis comprobar por mis ineptas dudas en el foro).

Pero ya que estoy pringado, pues termino de pringarme con mi propio engine, sobre todo porque me da más libertad (y ciertamente, más quebraderos de cabeza, pero directamente proporcionales con la satisfaccion por el trabajo propio).

No obstante tomo nota sobre glDSL y CMR32Pro. Les voy a echar un serio vistazo.

Muchas gracias por todo.

En cualquier caso, ya que lo tengo en direct3d, pues me gustaria optimizarlo. Y prácticamente tb lo tengo en OpenGL, asi que no veo por que va a ser solo para Windows... pero tiempo al tiempo.

#23
Programación gráfica / Optimizar Direct3d Para 2d
26 de Octubre de 2005, 11:11:49 AM
 ¿cual es el motor de the azazel? ¿donde hay info?

aunque sinceramente, ya que estoy puesto, me gustaria programar el mio propio, salvo que el de The Azazel sea la repera y sea irresistible el cambio...
#24
Programación gráfica / Optimizar Direct3d Para 2d
26 de Octubre de 2005, 09:28:33 AM
 
:D

Gracias ... ahora lo veo claro.
Es que eso de que fuera entre 0.0 y 1.0 me tenia intrigado.
Ahora podré dibujar sólo el sprite y no la textura entera con el borde transparente. (que encima me provocaba tener que calcular el borde sobrante para ajustar el tamaño del quad al de la textura a la hora de dibujar).


#25
Programación gráfica / Optimizar Direct3d Para 2d
26 de Octubre de 2005, 07:41:31 AM
 No sé si lo he entendido bien...

quieres decir que puedo tener una textura de 64x64, con un dibujo de tamaño 50x38

¿puedo entonces hacer un quad de 50x38 y mostrar ese rectangulo de la textura?

¿qué son el parámetro u y v de los vertices exactamente?
#26
Programación gráfica / Optimizar Direct3d Para 2d
26 de Octubre de 2005, 05:20:25 AM
 Me he dado cuenta de otro problema con esto del 2D en D3D...

Resulta que las texturas tienen que ser de un tamaño potencia de 2 (32x32, 64x64, 128x128...etc).

El caso es que yo uso sprites de cualquier tamaño, y logicamente, la textura asociada a un sprite de 33x33 es forzosamente de 64x64 pixeles... esto realmente no me importa, ya que intentaría hacer los sprites lo mas ajustados posible a los tamaños.

El problema lo tengo en el dibujado, que dibujo la textura completa... y claro, supongo que dibujar el resto de la textura, aunque no se vea, consumirá tiempo de proceso.

¿Se puede dibujar un rectangulo de la textura de cualquier tamaño en un quad de ese tamaño?
#27
Programación gráfica / Optimizar Direct3d Para 2d
25 de Octubre de 2005, 07:32:55 PM
 En mi hilo anterior la gente comenzó a darme consejos para optimizar Direct3D.
Viendo la cantidad de posibilidades e ideas de todos, he pensado que sería mejor un hilo dedicado al tema.
La forma en que dibujo los sprites 2D la he cogido de GameDev.net

El codigo que define los vertices y dibuja la textura es este:

Citar
void BlitD3D (IDirect3DTexture9 *texture, RECT *rDest,  D3DCOLOR vertexColour, float rotate)
{ TLVERTEX* vertices;

  //Lock the vertex buffer
  vertexBuffer->Lock(0, 0, (void**)&vertices, NULL);

  vertices[0].colour = vertexColour;
  vertices[0].x = (float) rDest->left - 0.5f;
  vertices[0].y = (float) rDest->top - 0.5f;
  vertices[0].z = 0.0f;
  vertices[0].rhw = 1.0f;
  vertices[0].u = 0.0f;
  vertices[0].v = 0.0f;

  vertices[1].colour = vertexColour;
  vertices[1].x = (float) rDest->right - 0.5f;
  vertices[1].y = (float) rDest->top - 0.5f;
  vertices[1].z = 0.0f;
  vertices[1].rhw = 1.0f;
  vertices[1].u = 1.0f;
  vertices[1].v = 0.0f;

  vertices[2].colour = vertexColour;
  vertices[2].x = (float) rDest->right - 0.5f;
  vertices[2].y = (float) rDest->bottom - 0.5f;
  vertices[2].z = 0.0f;
  vertices[2].rhw = 1.0f;
  vertices[2].u = 1.0f;
  vertices[2].v = 1.0f;

  vertices[3].colour = vertexColour;
  vertices[3].x = (float) rDest->left - 0.5f;
  vertices[3].y = (float) rDest->bottom - 0.5f;
  vertices[3].z = 0.0f;
  vertices[3].rhw = 1.0f;
  vertices[3].u = 0.0f;
  vertices[3].v = 1.0f;
 
  //Unlock the vertex buffer
  vertexBuffer->Unlock();

  //Set texture
  DEVICE->SetTexture (0, texture);

  //Draw image
  DEVICE->DrawPrimitive (D3DPT_TRIANGLEFAN, 0, 2);
}

¿Alguna idea para optimizar esto?
#28
Programación gráfica / Me Va A Volver Loco El Id3dxsprite
25 de Octubre de 2005, 06:57:12 AM
 Joer...muchas gracias a todos

Soy novatísimo con Direct3D así que seguramente no tengo hecho nada como me comentais. Voy a implementar las optimizaciones y ya os cuento que tal ...

Muchas gracias de nuevo !!
#29
Programación gráfica / Me Va A Volver Loco El Id3dxsprite
24 de Octubre de 2005, 11:32:17 AM
 mmmm... dada mi desesperación ayer por la mañana, acabé tan harto que programé mi propia clase Sprite usando texturas sobre quads y mandé al id3dxsprite a freir espárragos.

Por cierto que el rendimiento es mucho menor que el que me daba directdraw, al menos en las mismas condiciones y con la implementación que hice:

put_sprite de 4000 sprites simultaneos repartidos  sobre el mapa en directdraw frente a 200 de direct3d

A partir de esos numeros la velocidad comienza a resentirse.

Los sprites no están todos en las coordenadas de pantalla.

(uso una geforce4 mx 440 creo)

Alguna idea para optimizar direct3d?


#30
Programación gráfica / Me Va A Volver Loco El Id3dxsprite
23 de Octubre de 2005, 03:26:55 PM
 Te puedo asegurar que no es problema de la textura.
De hecho he usado la de tu ejemplo y en la misma ruta y forma en que la cargas tú.

Creo que el problema viene de arriba, de la forma que inicializo Direct3D.

Yo lo pongo a pantalla completa (una diferencia con tu ejemplo)

y la otra es el formato que tu especificas como unknown, y yo no puedo, porque si no no me inicializa la pantalla.

   d3dpp.Windowed = TRUE;   (yo pongo FALSE)
   d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; (yo uso D3DFMT_X8R8G8B8)

Por lo demás, no veo diferencias entre mi codigo y el tuyo.

Voy a investigar la inicialización a ver si es algo de eso.

Un saludo y muchas gracias !!! Me va a ser muy util tu ejemplo.







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.