Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Opiniones sobre mi estructuracion de Vertex Buffers

Iniciado por DraKKaR, 18 de Octubre de 2002, 09:57:15 PM

« anterior - próximo »

DraKKaR

                                Holas. Quiero cambiar la forma en que uso los vertex buffers en mi engine. Y es que no puede ser que en Direct3D vaya a 120 fps donde en OpenGL va a 500 XDD. Como lo hago ahora estoy creando una burrada de vertex buffers y no paro de cambiar entre ellos cada vez que voy a renderizar. Y.. al parecer eso es malo XD.
Ahora, despues de leer articulos sobre el tema me he decidido a hacerlo de la siguiente forma. A ver que os parece:

Solo se usarán 2 vertex buffers:
- Un VB estatico con todos los vertices del mapa, junto con un index buffer dinamico para indexar la geometria.
- Un VB dinamico con capacidad para 4000 vertices para el resto de geometria (lo que no es el mapa), es decir, naves, objetos, y cualquier otra malla. Este lo ire lockeando y rellenando antes de pintar cada objeto (ke no sea el mapa).

los FVF para cada VB serian:
// Para el VB del mapa:
struct D3DCUSTOMVERTEX_map
{
 float x,y,z;
 float u,v;
 float s,t;
};
// sin normales y con 2 pares de coordenadas de textura para los lightmaps

// Para  el VB dinamico de los objetos
struct D3DCUSTOMVERTEX_obj
{
 float x,y,z;   
 float nx,ny,nz;
 float u,v;
};


De esta manera solo tendre ke cambiar de VB y de FVF 2 veces por frame (una al pintar el mapa y otra al pintar los objetos).

Que os parece esta estructuracion?                                

NeLo

                                Si las naves no modifican su malla, también pueden ser VB estáticos.

Por lo demás, no lo veo mal.

Saludos.                                
Drowning deep in my sea of loathing

DraKKaR

                                Umm... creo que no me he expresado bien. Me referia a UN UNICO VB DINAMICO para TODAS las mallas, objetos, etc... por eso tiene que ser dinamico, para ir metiendo poco a poco segun vaya cabiendo, todo lo que vaya a renderizar en ESE vb.

¿Como lo estructurais vosotros?                                

Mars Attacks

                                Venga, va, olvidémonos del Blast y hagamos un comecocos en condiciones XDDDDDDDD                                

Haddd

                                Me parece que vas a tener muuuchos problemas. El primero es que...¿Cómo controlas el cambio de textura si lo metes TODO en un VB? El segundo es ¿Te bastará el tamaño de los índices de 65k? No lo digo porque vayas a tener que mandar 65k triángulos de una tacada, sino que tendrás que montarte los índices del mapa con valores fijos relativos a los vértices.

Mira, si quieres ir rápido..¡no hagas locks!
Si quieres tener un mundo dinámico, modifica sólo el IB a ser posible.
Si quieres modificar vértices, porque no te queda más remedio, debes hacer locks, pero debes hacer la rutina lo más rápido posible.

Yo ya mandé hace tiempo un test en el que se probaba la técnica de meterlo todo en un buffer y lanzarlo;y por otro lado ir mandando objeto a objeto. Sin una T&L los dos daban el mismo valor, pero con una T&L era MUCHISIMO más rápido ir mandando los objetos de uno en uno. Pero ojo, esto NO significa que debas hacer Locks, significa que tienes que evitarlo lo máximo posible.                                

DraKKaR

                                Mars Attack, maldito! XDDD el Blast se acabará como yo me llamo como me llamo.

Haddd: arj ke lio, cuantas contradicciones!! En los articulos que he leido (escritos por gente de NVidia) se dice que cuantos menos cambios de VB mejor, que es mejor hacer Locks a un VB dinamico e ir rellenandolo para renderizar. En cambio, tu dices que es mejor tener muchos VB y evitar locks a toda costa. Es cierto que hacer un lock es lento, pero en esos papers dicen que si creas y lockeas el VB con los flags adecuados se puede hacer viable.

Que tecnica usais el resto de la gente, programadores de Direct3D?                                

NeLo

                                Para la geometría estática, pues buffers estáticos; para la dinámica, dinámicos. Cada objeto tiene sus buffers, pero si tengo 15 objetos con la misma malla, lógicamente comparten los búffers.

Saludos.                                
Drowning deep in my sea of loathing

CordayUK

                                no me parece una buena idea, los locks hara que te vaya muuucho mas lento!                                

_Grey

                                Pues a mi me parece bastante correcto simplemente hace lock con el D3DLOCK_DISCARD y ya esta, lo que no se es si recomendarte hacer el lock con D3DLOCK_DISCARD cada vez que le pases un objeto, o abrirlo todo y no cerrarlo hasta que esten metidos todos los objetos.....

igual si pasa BeRSeRKer nos dice algo si a probado ambos sistemas.... :loco:

respecto a lo que dice [ Haddd ], creo que se a confundido un poco, por que no hay problema en tener un monton de objetos de distintas texturas en uso en un vertexbuffer simplemente controlas que vertices del buffer dibujara DrawIndexPrimitive() con la textura actual, luego cambias la textura y otro DrawIndexPrimitive() con datos de los otros vertices

Yo utilizo el metodo de abrir el vertexbuffer y meter todo lo que pueda en el para luego llamar al DrawIndexPrimitive() las veces que haga falta si hay que cambiar la textura, pero sin cambiar el vertexbuffer, y gane MUCHA velocidad en comparacion con las pruebas de tener objetos en vertex buffers individuales........... bamos que la Doc de Nvidia tiene razon! solo faltaba! :D lo que no te puedo asegurar por no probarlo es si es mejor tener abierto el vertexbuffer hasta meterle todos los objetos o abrirlo cada vez con el D3DLOCK_DISCARD, pero es de suponer que si sabes el tamaño a bloquear sera mas rapido abrirlo solo una vez...

Felices pruebas!

saludos.                                

Haddd

                                Vamos a ver, no es costoso cambiar de VB, por tanto puedes tener 100 VB en lugar de 1 VB muy grande. Lo que no hay que haces es utilizar Locks. Si el mundo es dinámico y debes hacer locks, lo que no deberías hacer es modificar el tamaño del VB. Es decir, no usar DYNAMIC para nada. Y si usas el POOL_DEFAULT todavía irá más rápido, porque el MANAGED te hace una copia de todoel VB en memoria de sistema cada vez que haces un cambio.                                

NeLo

                               
Citarno me parece una buena idea, los locks hara que te vaya muuucho mas lento!

¿Qué Locks? No he dicho nada de los Locks.                                
Drowning deep in my sea of loathing

CordayUK

                                Estaba respondiendo a lo que decia Drakkar!!

Citar
Un VB dinamico con capacidad para 4000 vertices para el resto de geometria (lo que no es el mapa), es decir, naves, objetos, y cualquier otra malla. Este lo ire lockeando y rellenando antes de pintar cada objeto (ke no sea el mapa).

NeLo

                                Oki doki poki toki ;)                                
Drowning deep in my sea of loathing

_Grey

                                Lo siento Haddd, pero ademas de los locks, ir cambiando de vertexbuffer (osea el SetStreamSource()) cada dos por tres tambien es costosillo.                                

DraKKaR

                                Bueno, probaré los 2 métodos y ya os comentare a ver que tal van. Hasta luego.

Muchas gracias por contestar.                                






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.