Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Optimización

Iniciado por Satangel13, Noviembre 08, 2017, 10:32:57 AM

Tema anterior - Siguiente tema
Buenos días una pregunta es posible en Unity realizar "campos de visión"? Por ejemplo cuando uno se encuentra dentro de la caja de la izquierda no ve la caja de la derecha ("Esta no existe") hasta que llega a otro campo donde si aparece el objeto y el personaje lo ve. (lo del medio es una pared)
 
Existe algún script o algo similar para hacerlo a distintos niveles, como por ejemplo le doy un nivel 1 y este no puede ver el "a1".
 
Gracias,
 
 

Noviembre 08, 2017, 11:06:04 AM #1 Ultima modificación: Noviembre 08, 2017, 11:13:35 AM por lightbug
Hola, eso que decís se realiza generalmente con triggers, aunque podés hacerlo de la forma que quieras, siempre que verifiques que la camara entró a un collider o está cerca de un punto. En base al punto o trigger activás o desactivas los objetos que quieras.
 
Otra forma de verlo es usando culling, pensalo como que si la camara no lo ve no existe, eso es el culling. Tenés dos tipos frustrum culling: solo se renderiza lo que esté entre near y far plane... y tenés occlusion culling: solo se renderiza lo que sea visible a la camara (lo que está detras de la pared no ve renderiza). La trampa es que los elementos que entran en el occlusion culling son elementos estáticos, y antes debés hacer un bake:
 
Mira este vid de lo Nuevo de Unity 3:
 


   
eature=oembed" width="480">

 
PD: mirando el vid también se puede hacer con dinámicos... no tenía ni idea

ES exactamente lo que buscaba, muchísimas gracias es una pasada ahora solo hace falta poner a aprender Unity 3D.

De nada Satan, ya que mencionas "optimización" vas a tener que ver que es exactamente lo que te da problemas, se podría llegar a dar que tengas otras cosas relacionadas o no al rendering que te estén dando problemas y enfocarse a lo que está en al "otro lado del cuarto" no te mejore para nada tu performance. Lo menciono porque quizás por esto lo preguntás. También tené en cuenta que si la escena "deja mucho a la vista" el occlusion culling poco te va a ayudar, además de que para ciertos lugares te va a dar una caida importante vs otros (ej campo abierto vs pasillos).
 
En mi opinión algunos puntos importantes a tener en cuenta si querés optimizar desde el rendering es:
 


  •    Tener un número objetivo de triangulos por modelo y separar cuales son los modelos de interes y cuales no, para darle algo más de detalle a unos que a otros si quisieras (bueno vos lo sabés muy bien por que sos modelador)


  •    Tener LODs para esos modelos, esto para mantener un numero aproximadamente constante de triangulos en pantalla (idealmente), podés hasta hacer distance Culling con el LODGroup de Unity, mientras tenés un farPlane bien grande (tipico RPG openWorld, el terreno se ve pero los objetos van desapareciendo)


  •    Elegir un buen shader (quizas no necesites un Physically based shader como el standard  ) y utilizar al máximo sus propiedades (ej smooth shading, normales, ambient occlusion map,  etc), siempre pensando en ratonear triangulos cuando se pueda.


  •    Poner lo estático en "static".


  •    Determinar la menor distancia de renderizado posible (el far plane), para ayudar al frustrum culling.


  •    Determinar las condiciones de iluminación (si querés bake o no, sombras, calidad, distancias, etc), esto por lo general te determina gran parte de la performance.


  •    Por ultimo sí, pones el occlusion culling te va a ayudar un poco más, dependiendo de las condiciones de arriba y de tu mismo escenario, mientras más modular sea mejor, ya que podés tener partes basicas del mismo super detalladas (si lo quisieras), pero a la hora del rendering si no son visibles serán "culleadas" ()


Si revisás las escenas test que puse en Recursos, para la primera escena el poner y sacar occlusion culling no te da ni 2 fps ya que la "posta" la tienen las sombras y existe una point light cada 5 m proyectando sombras a modelos semi-complejos (para mi GPU complejos), por lo que occlusion culling no hace casi nada en este caso y por lo tanto no te recomendaría basar toda tu "optimización" en este solo recurso.
 
Saludos

Me surgió otra pregunta para que esto funcionara bien hay que separar los objetos por trozos ya que enseña el objeto en su conjunto. Por ejemplo si hago la casa entera y la pongo como un único objeto si este entra en el campo de visión se mostrar entero y con todos sus detalles pero si lo separo en trozos este solo mostrará el trozo que entra en el campo de visión?
 
Por lógica tendría que cortar los objetos y hacerlos separados para tener más eficacia a la hora de usar este sistema.
 
 
 
Gracias,

Cita de: Satangel13 date=1510234949Me surgió otra pregunta para que esto funcionara bien hay que separar los objetos por trozos ya que enseña el objeto en su conjunto. Por ejemplo si hago la casa entera y la pongo como un único objeto si este entra en el campo de visión se mostrar entero y con todos sus detalles pero si lo separo en trozos este solo mostrará el trozo que entra en el campo de visión?
   


Exacto, eso en principio lo tenés gratis usando modularidad y es una linda ventaja frente al "No modular". Si tenés una casa entera, mejor dicho una mesh entera se renderizará todo el objeto si es que una parte ingresó en el campo de vision, fijate el video en el segundo 0:31 aprox como la capilla del fondo se renderiza entera, cuando la cámara ve ni apenas la torre.
 
Pero te repito, vale la pena hacer todo de vuelta ("separar por trozos"), cuando es posible que no te influya en nada (o casi nada) a la hora de obtener performance? dependerá un poco del escenario y del detalle que querés lograr, si tu casa tiene 5000 triangulos (por inventar un numero) no te va afectar en nada si la separas o no (ni para mi GPU), ahora si querés separarla y usar más triangulos para dar detalle (socalos, junturas, piso, ladrillos, etc), irse a lo modular puede ser opción correcta.
 
Igual la idea de lo modular es que debería ser divertido armar escenarios, terminas ugasndo a los legos con las partes, esto debería ser tu pilar, que hacer escenarios sea rápido y entretenido, ni hablar que a la hora de iterar te da grandes beneficios Ej: mi personaje salta y llega muy facil, quiero que llegue con doble salto no con uno simple, entonces agarro la parte del piso (donde cae del salto) y la remuevo, listo... todo dentro de Unity y sin tocar vertices, caras o UVs ... querés modificar tal piso? lo cambías por otro, querés modificar toda la plantilla del escenario? (con trabajito de fondo ..), seteas un scriptableObject (base de datos con todos los prefabs de las distintan partes) y de pronto tu escenario en la jungla (con partes específicas del lugar) pasa a ser una villa de iraq (ponele, si fuera el típico COD) ... todo gracias a la modularidad :)
 
Salu2

Una pregunta más aún que parezco un poco pesado sobre el tema, seria posible hacer lo mismo con un objeto animado?
 
Ejemplo tengo un tanque o vehículo de 22000 tris se podría reducir esto a la mitad o más con este sistema, lo que no se, es si existe una herramienta para tal cosa.
 
 
 
Gracias,
 
 

muy bueno el video del oclusionCulling, no conocia esa funcion, jeje, esta bien saberlo... y tambien muy bien que funcione con objetos no "estaticos" 
 
 
 
...para un tanque vehiculo o edificio lo suyo es hacer LOD.... diferente nivel de detalle(triangulos) dependiendo de la distancia...
 
aunque tambien puedes hacerlos por caras, ya que minimo tres de las "caras" del objeto no sera necesario "dibujaralas"... las caras que den(esten orientadas hacia) detras del objeto (que dependeran del angulo en el que lo miras)
 
no se si lo he explicado bien....
 
(de un "cubo", maximo puedes ver tres caras a la vez)
 
...pero entonces el script del tanque/edificio o lo que sea, deveria tener un "trozo" de codigo donde se "maneje" eso (mostrar/ocultar "lados")(y tendrias que tener el "mesh" partido en "trozos")
 
...y optimizar asi muchos objetos podria ocasionar mas carga de procesos para la cpu....
 
aunque siempre tienes la posibilidad de comprobar solo unos pocos objetos cada "frame"... con una especie de contador o algo asi... 
 
en mi proyecto "spaceship project" (en seccion proyectos) hago algo similar... (muestro/oculto objetos y los recoloco para re_aprobecharlos(en vez de destruir/instanciar objetos nuevos...) si porejemplo tengo 3000 objetos para comprobar, compruebo 100 cada frame... el siguiente frame los 100 siguientes... y asi... (en 30 frames comprueba todos... y luego vuelve a empezar...) esta tecnica de "fraccionar" el trabajo vale para muchas cosas... ...es algo similar al "yield return null" de una corrutina...
 
 
 
tambien puedes borrar caras que no se vallan a ver nunca.... en tanques/vehiculos las caras que dan(estan orientadas hacia) al suelo no los vas a ver nunca...(a no ser que el vehiculo pueda saltar/separarse del suelo... o la camara te deje mirar desde tan abajo como para verlo por debajo...)
 
este truco de "borrar" caras lo usan muchos shooters en primera persona porejemplo en el arma que lleva el player.... las caras de ese arma que den(esten orientadas hacia) adelante o abajo  o a la derecha..... no son necesarias(no se van a ver nunca.... a no ser que la animacion de recarga (o alguna otra animacion) muestre el arma desde ese lado...
 
o porejemplo si hay "barriles" o "cajas", pero estos objetos siempre van a estar "de pie".... entonces puedes borrar tambien las caras de abajo de esos objetos....
 
...o porejemplo si estas dentro de un edificio puedes ocultar las paredes exteriores de ese edificio.... etc...
 
 
 
puedes hacerlo con el oclusion culling ese... yo no se como, jeje... aunque voy a "toquitearlo" un poco para ver.... jeje
 
soy mas de hacer todo a la vieja usanza... sin usar characterControler, ni rigidBody, animator, navmesh, o cualquier añadido de unity... me gusta hacerlo todo via codigo por mi mismo.... pero estoy viendo que realmente hay cosas que te simplifican la vida.... jeje
 
 
 
gracias @lightbug por el aporte

Etiquetas: