locked
Batching ¿Que es? ¿Tiene otro nombre? ¿En que consiste? RRS feed

  • Pregunta

  • Buenas. He puesto en buscar "batching" y no he encontrado nada así que me animo a crear una nueva pregunta.

    He hecho varias search en google y la verdad es que no he obtenido muy buenos resultados, por lo que sospecho que esta técnica tiene otro nombre.

    Por otro lado, se que SpriteBatcher "automáticamente" intenta hacer batching segun sprites por textura, pero me gustaría ver algun Draw de ejemplo con y sin batching para entenderlo un poco mejor.

    Tras investigar el ejemplo de APP HUB de hardware instancing, las veces que he leido algo sobre batching, siempre me hacen pensar en este ejemplo de app hub, pero en ese ejemplo no se habla nada de materiales, solo de meshes, y cada vez que leo algo de batching, se habla de materiales :P.

    Alguien aporta un poco de luz al asunto?

    Algún enlace concreto y específico?

    Se agradecen explicaciones genéricas sobre implementación, pseudocodigo y tal, no hace falta pegar una clase de 300 lineas xD.

    Ya según me respondáis plantearé nuevas dudas

    jueves, 2 de junio de 2011 11:27

Respuestas

  • Lo que hace el batching es agrupar operaciones de forma que se ejecutan eficientemente.

    Para el caso de los sprites 2D, en la GPU, pasar de pintar una textura a pintar otra o cambiar el estado de la GPU tiene una penalizacion.

    El SpriteBatch lo tenemos para ayudarnos a evitar estas penalizaciones.

    El uso del Begin y el End agrupa por estados del dispositivo: BlendState, RasterizerState, ...,  una vez que se hace un begin no se puede cambiar este estado.

    Uno de los parametros del begin define tambien el modo de operacion respecto a las texturas, con el SpriteSortMode.Texture, las llamadas a Draw se ordenan por textura para conseguir un mayor rendimiento, debido a que se evitan penalizaciones si se usa una textura varias veces. (SpriteSheet)

    En definitiva, es aconsejable hacer pocas llamadas al Begin que incorporen muchas llamadas a Draw con pocas texturas diferentes.

     

    Para el caso de meshes en 3D viene a ser lo mismo, se intenta pintar agrupados todos los meshes que compartan la misma textura, vertices,  animacion esqueletal de bones,...

     

    Espero que te haya aclarado algo.


    Tambien conocido como Blau www.youtube.com/malditis www.charcostudios.com
    jueves, 2 de junio de 2011 14:16

Todas las respuestas

  • Lo que hace el batching es agrupar operaciones de forma que se ejecutan eficientemente.

    Para el caso de los sprites 2D, en la GPU, pasar de pintar una textura a pintar otra o cambiar el estado de la GPU tiene una penalizacion.

    El SpriteBatch lo tenemos para ayudarnos a evitar estas penalizaciones.

    El uso del Begin y el End agrupa por estados del dispositivo: BlendState, RasterizerState, ...,  una vez que se hace un begin no se puede cambiar este estado.

    Uno de los parametros del begin define tambien el modo de operacion respecto a las texturas, con el SpriteSortMode.Texture, las llamadas a Draw se ordenan por textura para conseguir un mayor rendimiento, debido a que se evitan penalizaciones si se usa una textura varias veces. (SpriteSheet)

    En definitiva, es aconsejable hacer pocas llamadas al Begin que incorporen muchas llamadas a Draw con pocas texturas diferentes.

     

    Para el caso de meshes en 3D viene a ser lo mismo, se intenta pintar agrupados todos los meshes que compartan la misma textura, vertices,  animacion esqueletal de bones,...

     

    Espero que te haya aclarado algo.


    Tambien conocido como Blau www.youtube.com/malditis www.charcostudios.com
    jueves, 2 de junio de 2011 14:16
  • Osea que la cosa es meter:

    Effect.Apply()

    Objeto1.Draw()

    Objeto2.Draw()

    Objeto3.Draw()

    Dibujo 3 objetos con el mismo efecto. Eso ya me queda mas claro :D, el lio venia de no haberlo visto por ningun lado así.

    Además si los modelos son los mismos, puedo usar hardware instancing y dibujar todos los modelos de un tiron.

    Creo que me he enterado, muchas gracias ;)


    Adrián Mesa Pachón, futuro creador de mundos.
    jueves, 2 de junio de 2011 14:37
  • Esa es la idea :)

     

    Aunque no te obsesiones tampoco mucho... hay veces que es peor el remedio que la enfermedad, en general, el propio framework te marca la pauta para ir haciendolo bien...

     

    Desarrolla primero y si luego si ves que tienes que optimizar pues vas agrupando y mejorando donde haga falta.

     

    Un saludo


    Tambien conocido como Blau www.youtube.com/malditis www.charcostudios.com
    jueves, 2 de junio de 2011 15:13
  • Gracias por el consejo ;), pero en ese sentido ya vengo de vuelta. Estuve casi 1 año prototipando a saco, y ahora estoy empezando bien. Me interesa dibujar muchos elementos en pantalla, para crear ordas (se escribe asi ? O_o) de naves pequeñas.
    Adrián Mesa Pachón, futuro creador de mundos.
    jueves, 2 de junio de 2011 15:18
  • Oohh...noooo.... Otro shooter? :)

    a ver si vas enseñando algo, que hace falta animar esto... ;)

     

    hoy me he quedado flipado con un shooter de naves flipante hecho por indies 

    http://www.youtube.com/watch?v=jLiqX_rIzuI

     

    y creo que mas bien es horda

    http://es.wikipedia.org/wiki/Horda

    http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=horda&origen=RAE

     

     


    Tambien conocido como Blau www.youtube.com/malditis www.charcostudios.com
    jueves, 2 de junio de 2011 16:25
  • Shh que no hay suficientes shooters comerciales xD. Si es un shooter pro bastante distinto a lo que ya hay. 

    Lo unico que puedo enseñar ahora es : http://www.parallel-planets.com/ todo super oficial :P.

    Estoy engorilao con el engine, espero tener nuevos videos con gameplay para despues del verano. Que lo que hay es muy antiguo y chusquero y solo sera enseñado cuando haya algo de calidad que enseñar xD


    Adrián Mesa Pachón, futuro creador de mundos.
    jueves, 2 de junio de 2011 16:33
  • Pues sois una tropa... no se puede ver mucho, pero me gusta el logo... por cierto no tendra nada que ver con "stargate"?.... :) me encanta esa serie... de hecho tengo un diseño de los 3 o 4 primeros niveles de un shooter/plataformas "alternativo" que se inspira algo en esa serie... algun dia... cuando funde mi estudio.. y me disponga a conquistar el mundo... ;)
    Tambien conocido como Blau www.youtube.com/malditis www.charcostudios.com
    jueves, 2 de junio de 2011 18:54
  • No tiene nada que ver. Y si, somos una tropa pero no siempre toda la tropa esta trabajando a full :P.
    Adrián Mesa Pachón, futuro creador de mundos.
    viernes, 3 de junio de 2011 7:24
  • Pues sera coincidencia, pero el prometheus era una de las naves de la serie http://stargate.wikia.com/wiki/Prometheus

    Y la "O" del logo es un stargate... en toda regla...

    :)

     

     

     


    Tambien conocido como Blau www.youtube.com/malditis www.charcostudios.com
    sábado, 4 de junio de 2011 12:04
  • MM Cuando le pasos los vertices e indices a la grafica?

    Si tengo 8 objetos, y cada objeto tiene un VertexBuffer e IndexBuffer, no puedo batchear, ¿cierto? Tendria que meter los 8 en el mismo buffer y entonces podría.


    Adrián Mesa Pachón, futuro creador de mundos.
    lunes, 6 de junio de 2011 9:19
  • Yo de lo poco que he hecho en 3D lo unico que he tenido en cuenta es agrupar por material y por transformación, pero luego cada objeto tenia su vertex buffer e index buffer, y la verdad es que no me ha ido mal. 

    Si los objetos son estaticos veo bien meterlo todo en grandes vertex buffer, aunque te limitaria el poder hacer frustum culling. Tendrias que probar si te merece la pena o no.

    Si los objetos se mueven, es mejor que los tengas en buffers distintos para aplicarles la transformacion de vertices de forma independiente a cada objeto.

    Si los objetos se mueven y son indenticos podrias hacer hardware instancing, pasandole un array con las matrices de transformacion al shader y usando un unico vertex e index buffer. Aunque a veces si no es para muchos objeto no merece la pena.

    Ya te digo que quizás no soy el más indicado para responderte esto, pero es lo que me dicta mi poca experiencia.

    A ver si alguien aporta mas luz.

    lunes, 6 de junio de 2011 10:20
  • Uso hardware instancing, pero quiero tener un dibujado optimo para cuando tenga pocos elementos ya que como tu dices, es una técnica que funciona en circunstancias especiales (muchos modelos de pocos poligonos).

     

    Lo que quiero saber es si puedo/debo hacer:

     

    foreach (effect in effectsBatch.Effects)
    
    {
    
        Effect.Apply()
    
    	foreach (model in models)
    
    	{
    
    		device.SetVertexBuffer(vb);
    
    
    	    device.DrawIndexedPrimitives(...);
    	}
    
    }
    
    
    Por alguna razón, pasar el vertexBuffer e indexBuffer a la grafica siempre se hace antes del Effect.Apply(). Lo probare cuando llegue a casa pero ahora que estoy en el curro :P


    Adrián Mesa Pachón, futuro creador de mundos.
    lunes, 6 de junio de 2011 10:53
  • Eso se puede hacer perfectamente, el único problema que puedes tener es cuando el shader recibe algún parámetro en función del modelo a dibujar, y estoy pensando en la matriz World, en ese caso creo que deberias hacer un nuevo Effect.CurrentTechnique.Pass[0].Apply() para volver pasar los parametros a la GPU. Antes habia un metodo llamado CommitChanges dentro del effect pero ahora creo que no existe.
    Tambien conocido como Blau www.youtube.com/malditis www.charcostudios.com
    lunes, 6 de junio de 2011 15:02