|
El motor ogre3d es uno de los más completos y populares de los motores 3D opensource. Tiene a muchos desarrolladores trabajando para mejorarlo y usando las distintas herramientas que exsiten actualmente. Los chicos de intel, siempre tan dispuestos a ayudarnos para que usemos multicores, han escrito un completo pdf sobre multithreading y el ogre3D. Lo chulo es que destripan de forma sencilla cómo está desarrollado el ogre3D, y las distintas capas que lo componen. Así, tenemos un completo diagrama de las distintas etapas de render (que son bastantes). El pdf comenta varias cosas que a veces hablamos en esta web. Hace una discusión de cómo modificar los datos de la escena usando multithreading. Podremos usar una cola de comandos. Esto es, un thread postea en una cola "mover objeto" y los comando se van ejecutando de forma secuencial cuando sea preciso. El problema es que a veces hay que mandar comandos con datos muy grandes, que tendríamos que copiar (modificar los vértices, por ejemplo) Otra forma es duplicar datos, tener una especie de "double buffer" para lo que se modifica constantemente. El tema es que puede que pintemos más rápido de lo que modificamos las copias. Hace unos días hablamos aquí de unas estructuras de datos en java que hacian algo parecido, pero mas al estilo transacciones, que podría mejorar esto severamente. Otra forma de meter threads es que el mismo sistema de render sea multithreading. Este es el más complejo, sobre todo porque hay que tener en cuenta un montón de dependencias entre los distintos sistemas, y puede que tengamos que esperar por ciertas partes para completarse. Aqui tambien podríamos usar una cola para renderizar sin bloqueos. Y ya a más bajo nivel, podrñiamos hacer multithreading la parte más de bajo nivel (opengl o directx). Los resultados son un poco decepcionantes, ya que las mejoras son, en el mejor de los casos, de un 30%. Eso sí, las demos de ogre son muy gpu, así que no aprovechan los multicores a tope. De todos modos, mi conclusión es que lo mejor es un thread para el ogre, y dejar a la cpu a realizar el resto de tareas. Esi sí, tendremos que esperar a que el multithreading de gpu sea una realidad (DX10 tene algo ya), para aprovechar mejor ciertas partes de render.
|