Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





[directx] Vertex Buffers

Iniciado por deadLock++, 27 de Julio de 2003, 06:53:47 PM

« anterior - próximo »

deadLock++

 En un motor de juegos ¿qué es mas conveniente?

1. Que cada objeto dibujable posea su vertex buffer.
2. Que exista un vertex buffer único y muy grande reutilizado para todos los objetos.


Sinceramente creía que la opción 1 era la lógica, pero recientemente leí en un libro de programación de juegos que utilizaban la opción 2, y decían que era lo mejor. ¿Ustedes que piensan?

Muchas gracias.

_Grey

 Sin duda alguna la 2 opcion, aunque tampoco es raro que existan 2 o 3 vertexbuffers,  por ejemplo uno con el decorado "static", y otro "dinamic" el que podrias rellenar con los personajes y demas objetos o/y particulas despues de hacer las trasformaciones manualmente si fuese necesario...(Usando VertexShaders bien podria ser "static").

Pero la primera no es NADA recomendable, es mas, puede asegurarte que si se trata de MUCHOS objetos es mas rapido rellenar un vertexbuffer "dinamic" (cogiendo los datos originales de los objetos de un array, nada de vertex buffers, asi ahorras tiempo y lock's y UnLock's) y pintarlo, que no dar un vertex buffer(y un index buffer si fuese necesario) a cada objeto y pintar uno detras de otro.

Es mas quitate la primera opcion de la cabeza como mucho 2 o 3 y gracias, y si usan el mismo tipo de vertex mejor aun, pero quizas ya soy demasiado quisquilloso.

Saludos.  :ph34r:  

MChiz

 Esto es algo que no entiendo... porque dicen que con Direct3D es muy costoso hacer cambios de Vertex Buffer y luego con GL y sus Vertex Buffer Object no existe esta penalizacion? Todo esto me parece un poco raro... y cabron : (

DraKKaR

 flame->init();

Porque OpenGL mola mas ;P

flame->destroy();

No he podido resitirme, ignoradme XD

Haddd

 Nunca se deben hacer cambios en los Vertex Buffers. ¿En qué caso necesitas hacer eso?

deadLock++

 En la opción 1 (crear un vertex buffer por objeto) los cambios me parece son menores, ya que toda la geometría estática nunca tiene necesidad de hacer un lock, memcpy, unlock de los vertex buffers y simplemente se trabaja con la matriz de mundo para escalar, rotar y trasladar.

Si entendí bien, se recomienda tener sólo un vertex buffer (o unos pocos) y en cada frame se debe realizar un lock, memcpy, unlock para por cada objeto poder copiarle los vértices del mismo. (esta sería la opción 2)

En ninguna de los dos casos se crean Vertex Buffers "on the fly", ambas posturas crean sus vertex buffer sólo al comienzo.

Lo que no me quedó claro es ¿existe alguna limitación en la cantidad de vertex buffers? O sea ¿es mejor tener un vb de 4000 vértices que 100 de 40 vértices? ¿Por que la opción 1 es tan mala si finalmente sólo se deberían actualizar los vb de objetos animados (que cambian la posición de sus vértices) y no todos en cada frame como la 2?

¿Qué política sigues tu, Haddd? ¿Nunca modificas el contenido de un vertex buffer?

Haddd

 Yo nunca modifico el contenido..a no ser que lo necesite. Todo depende del multiproceso. Imagíntae que tienes 2 VB. Uno con 60.000 vértices y otro con 10. Ahora veamos estos casos:

a) Primero renderizas el del 60.000 y luego bloqueas el de 10 y lo modificas.Entonces la tarjeta tiene que esperar en el Lock a que se terminen de dibujar esos ??? polígonos. En este tiempo el procesador está a la espera de un Lock haciendo el tonto.

B) Primero bloques el de 10(esto es rápido) y renderizas el de 10 y el de 60.000. Aquí la pérdida es mínima porque la tarjeta no estaba haciendo nada y el Lock que te devuelve es instantáneo.

En un juego es muy difícil controlar esto. Pero yo te recomiendo que si haces locks los hagas al principio y así nunca estás a la espera de un Lock.

Otra cosa a tener en cuenta que creo que pocos lo hacen, es el POOL que utilices. Si usas MANAGED, significa que TODO lo que haces se copia además a un buffer en RAM, por lo que se tarda el doble. Debes usar DEFAULT, pero si usas DEFAULT al hacer un Reset del device, tendrás que volver a generar el VB.

Otro ENORME error es este:

Lock(0,0,&dest,0)

Modificas una pequeña parte de los VB

Unlock()

Porque entonces el ordenador , si usas el POOL_MANAGED, tiene que copiar TODO el VB a memoria de vídeo, aunque tu sólo modifiques los primeros 10 vértices de, pongamos, 3.000 vértices que conforman el VB.







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.