Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Satangel13 en Noviembre 08, 2017, 10:32:57 AM

Título: Optimización
Publicado por: Satangel13 en Noviembre 08, 2017, 10:32:57 AM
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,
 
 
Título: Optimización
Publicado por: lightbug en Noviembre 08, 2017, 11:06:04 AM
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
Título: Optimización
Publicado por: Satangel13 en Noviembre 08, 2017, 11:35:36 AM
ES exactamente lo que buscaba, muchísimas gracias es una pasada ahora solo hace falta poner a aprender Unity 3D.
Título: Optimización
Publicado por: lightbug en Noviembre 08, 2017, 03:09:14 PM
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:
 

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
Título: Optimización
Publicado por: Satangel13 en Noviembre 09, 2017, 02:42:29 PM
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,
Título: Optimización
Publicado por: lightbug en Noviembre 09, 2017, 05:57:07 PM
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
Título: Optimización
Publicado por: Satangel13 en Noviembre 16, 2017, 12:13:08 PM
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,
 
 
Título: Optimización
Publicado por: Igor en Noviembre 16, 2017, 02:47:17 PM
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