En realidad es como que no te dan varias carpetas para llevar hojas para cada materia diferente, entonces tiene todas las materias en una sola carpeta.
Una vez vi un tutorial donde en lugar de anidar objetos para organizarlos, lo que hacían era crear objetos vacíos como separadores y acomodarlos en la lista para que se pudiesen agrupar los objetos sin anidarlos dentro de otros. Creo que luego de ver esto me hace mucho más sentido el hacerlo así.
@@terminado A ver, a no ser que metan la capacidad de crear carpetas no hay mucho mas (y ni así se solucionaría mucho porque seguirian siendo hijos de. Quiero decir un gameObject dentro de otro sigue teniendo que hacer calculos extras :/
Si, crear nullos para agrupar, sobre todo en 3D Yo no sabía que era un "Truco". Cuando me lo enseñaron en la universidad era la norma, pensé que en todos lados era igual XD
cuando tu metes objetos en otros objetos, cuando cargas un objeto se cargan los demás objetos hijos, por lo tanto si no borras el espacio en memoria se vuelve mas pesado xD
Es cierto, no recuerdo que video lo vi pero se que en algún video de optimizaciones de unity lo comentaban, e investigando encontré que unity para calcular la posición de los hijos de un objeto tiene que calcular también la del padre por lo que mientras más parents de parents tenga un objeto más posiciones de parents debe chequear para conocer la posición del objeto hijo
Al tener objetos como carpetas, lo que estas haciendo es crear una lista de objetos. debido a que cada objeto en una lista es una referencia estas consumiendo N(8 + M) bits donde N es la cantidad de objetos que tienes en esa lista y M la suma del peso de cada objeto, a eso le sumas 12bits de overhead y otros 4 de longitud, por eso ocupas mas memoria que tenerlos separados.
Lógica tiene si se conoce el funcionamiento interno. Primero, se tienen todos los objetos anidados cargados en memoria constantemente ya que el objeto padre está cargado en memoria, por lo que tenemos mucha memoria ocupada sin necesitarlo, y segundo los objetos dentro de objetos son dos referencias lo cual duplica el tiempo de búsqueda de la posición de memoria en bytes, ya que hay que hacer una para el objeto padre y otra para los internos
Puede ser Alva Majo el gamedev que menos sabe de informática que he visto? Yo no entiendo cómo aún así es tan jodidamente puto amo ese nivel de apañado está potente
Se supone que como pertenecen a un solo grupo, están conectados simultáneamente y trabajan como si estuviera cargando un mismo grupo aunque no sea necesario que todos los assets estén trabajando en una carga compartida qué sé vuelve grande. Pero cuando se sacan, obtienen "independencia" y su carga trabaja de manera más independiente con consumos diferentes y separados qué no necesariamente estén siendo cargados todos al mismo tiempo y que no necesariamente estarán funcionando continuamente y en conjunto qué un solo grupo grande. Por eso hay juegos qué pueden limitar las distancias de renderizado para optimizar las cargas de cada uno de los assets, pero si metes todos ellos en un solo grupo. Es como si el sistema tuviera la instrucción de cargar hasta lo que no debería.
Es que tienen doble función, meter el objeto dentro de otro y organizar, quizá necesitamos dividir esas tareas, como un segundo modo de vista de la jerarquía, uno normal de toda la vida y otro modo donde los objetos funcionen como carpetas para poner unas cosas dentro de otras solo con fines de organización
No sé si leerás esto pero prueba a marcar los objetos que no se vayan a mover como Static, en la parte de arriba del inspector. Debería notarse la diferencia en cuanto al performance. Otra cosa que puedes hacer es usar el Profiler u otras herramientas similares para ver dónde se está trabando cada frame.
El problema de marcalos como static es que aumenta el peso del juego. Para juegos en pc no pasa nada, pero en caso de juegos para android, podes duplicarlo. Me paso de pasar de 50mb a 120mb xD
El problema es el cálculo de posiciones, por cada anidación el cálculo se vuelve más pesado (recursividad). Por lo tanto un solo nivel de anidación en múltiples objetos puede ocasionar problemas de optimización.
Eso pasa por el enrutamiento que hace Unity con sus paquetes, tienes muchísimos objetos lo que son muchísimas referencias por segundo, si a cada una de estas referencias le restas esa parte de la ruta, el ordenador tiene que realizar menos peticiones de acceso a carpetas y el juego tiene nombres de ficheros más cortos, lo cual, para nombres concatenados muy largos puede hasta necesitar más memoria de la predicha en un principio. Empiezas a sumar todas estas cositas y si, afecta un montón al rendimiento. Un saludito✌🏻
Simple , estas ejecutando un objeto y adentro de este hay varios objetos , en vez de usar solo el objeto necesario vas a usar varios al mismo tiempo o vas a hacer que se busque el objeto requerido (tardando más por el arduo proceso de búsqueda)
Es muy sencillo lo que pasa, si metes todo dentro de un solo objeto el juego verá estas mil cosas como si fueran 1 sola, entonces las cargará a la vez, si están separadas, no lo hará, y cargará las que están en pantalla, es raro, pero tiene sentido
Pues ya se porque mi tfg plagado de arboles y vegetación dentro de otros objetos vacíos iba justísimo de FPS, cuando tenga un rato pruebo a sacarlos, a ver si mejora el rendimiento. Nunca hubiera pensado que podría llegar a ser por eso, el caso es que no pude encontrar nunca otro motivo de la bajada de los fps.
Un objeto se almacena completo en memoria. Dicho esto para acceder a cualquier de los objetos que estan dentro de otro, debes meter en memoria todos los objetos juntos (aunque solo uses uno) y no puedes quitarlos de la memoria hasta que el último de ellos se deje de utilizar.
Hay un asset que te permite crear carpetas en la jerarquía y por lo tanto no tener estos problemas. Tiene sentido que disminuya la performance porque los objetos tienen que estar comprobando cambios en el padre y viceversa
¿Sabes cual es? Entiendo que el problema de él ocurre por querer agrupar todo dentro de un objeto padre, pero si fuera una carpeta, como dices, no debería ocurrir.
Imagina hacer un Shooter y poner las armas , cámara , brazo, skin, skin de cuerpo entero y recién enterarme de esto, es para cortarme los esféricos con un corta césped
mi hipótesis es que al estar todo como hijo de un objeto o carpeta, simplemente comprueba y redimensiona las texturas de todos los objetos de la escena en lugar de solo hacerlo en los objetos cercanos.
Creo que es porque cuando cambias la posicion global de un objeto hijo, unity debe calcularlo para cada padre, ya que los transforms trabajan localmente. La idea es evitar abusar de updates, fixedupdate y lateupdate
Por lo que he oído es tema de la forma en que reparte Unity la carga de los objetos entre los núcleos de la CPU. Dependiendo de la jerarquía, Unity no paraleliza bien los procesos.
Una vez dispuestos en la posiciones deseadas y definitivas ¿no se pueden fusionar todos los objetos en unos pocos para optimizar? De última, te guardas los objetos en sus versiones separadas pero no implementados en el juego en caso de querer hacer alguna modificación.
Explicación: basicamente cada objeto funciona como un arbol, el arbol tiene ramas y cada rama es un objeto hijo de el objeto, entonces cada vez que tengas que buscar X objeto en la escena tendras que ir dentro de el árbol y bajar entre las ramas para encontrar el objeto, y mientras más tenga que bajar para encontrarlo más se demorará. En lenguajes de programación interpretado esto también es un problema, por eso lo que se hace normalmente es "compilarlos" a Bytecode ( osea como codigo de maquina para una "cpu" inventada por ti ) y luego eso lo pasas a tu VM ( la "cpu" ) para que lo emule, y como no vas "caminando el arbol" ( ese es el nombre, ni yo se porqué ), si no que simplemente vamos en linea recta en un array ejecutando cada instrucción es más rapido, entonces básicamente al sacar cosas de objetos hace que "pase" de caminar un arbol a simplemente buscar en una lista, lo cual es más rápido como ya dije :v
Voy a dar mi opinion al respecto de lo que puede estar pasando (no he usado unity en mi vida), creo que podria tener que ver con el culling, es decir al meter todos los objetos (personitas, arboles, montañas etc..) dentro de un mismo objeto los trata a todos como si fuesen uno solo (calcula la bounding box de todos los objetos en conjunto para utilizarla a la hora de hacer el culling) y a la hora de cuando se renderiza la escena en vez de no dibujar aquellos objetos que no se estan viendo en la pantalla como todos forman un objeto "grande" en conjunto entonces mientras se vea aunque sea solo una personita esta renderizando el resto de objetos aunque no se vean, en cambio cuando los sacas de este objeto "padre" entonces el culling funciona por separado (en este caso para realizar el culling calcula la bounding box de cada objeto por separado) para cada uno de ellos en vez de conjuntamente como he dicho antes. Tambien te digo, no estoy muy seguro pero tiene bastante sentido, puedo equivocarme. Otra opcion seria que al hacer un objeto hijo, la matriz transform(posicion rotacion y escala) se multiplica con la del padre para "situarlo en la escena" pero dudo muchisimo que sea eso ya que una multiplicacion de matrices para la gpu es pan comido, por cierto hay mucha gente en los comentarios que no tiene ni puta idea de lo que hablan (no se que de memoria y no se que de que tiene que cargar objetos) vais doblados, eso es lo que pasa cuando usais un motor grafico sin tener ni puta idea de como funciona un pc, como funciona el procesador como funciona la memoria, asumo que tampoco habeis programado usando una api de graficos low level como opengl/vulkan/directx, asi que primero aprended y luego hablais que macho dais un poco de vergüenza.
Lo mismo y el comentario iba un poco más de tirar mierda con una explicación más o menos convincente al principio para disimular. "Expertos" que no quieren que principiantes o fans opinen.
@@lissewan1739 precisamente los principiantes o fans no deberian "opinar" sobre temas de los cuales desconocen, una cosa es que des tu opinion aunque no sepas, en plan "pues yo creo que puede pasar esto ... pero no estoy seguro", lo cual aunque estes en lo incorrecto pues no lo has dicho afirmando que eso esta pasando, porque si ves los comentarios hay mucha gente que directamente dice "pues pasa esto" y se quedan tan anchos cuando lo que han escrito es una puta barbaridad e indica que no sabe absolutamente nada de lo que esta hablando, por ejemplo un comentario que me llamo mucho la atencion que voy a poner literal aqui "cuando tu metes objetos en otros objetos, cuando cargas un objeto se cargan los demás objetos hijos, por lo tanto si no borras el espacio en memoria se vuelve mas pesado xD" el que ha escrito esto no tiene ni puta idea de lo que esta diciendo, por eso digamos que me cabreo con esta gente, porque lo unico que hacen es desinformar y perjudicar a precisamente esos principiantes que estan aprendiendo, cuando viene alguien que sabe mas que yo, me callo, escucho y aprendo, aqui pasa lo contrario los que no saben, hablan demasiado.
@@DavidGispert estos juegos que se ven sencillos son un dolor de cabeza de crear, ahora se que tengo que empezar por algo simple, y que no me consuma la vida... algunos hablan afirmando lo que solo suponen, como si les hubiese pasado por experiencia, no esta mal un: yo creo o pienzo que, de vez en cuando. Veo a mucha gente enrredada pasando mucho tiempo tratando de resolver un problema que se les complica cada dia
Dato curioso que no le importa a nadie: Se me hace parecido cuando en los servers de Minecraft si pones muchos carteles se recarga el texto cada tanto tiempo y aunque esté sin escribir también pasa. Así que ya sabeis si juegas un server con amigos en aternos o cualquier server gratis de Minecraft usen otra cosa para hacer sus granjas de mobs como trampillas o algo así XD.
Alva descubriendo y aprendiendo a programar sin videos de RUclips y sin haber estudiado, además programando mejor que otros expertos con carrera universitaria, simplemente un grande alva el majo
siento que el problema esta en cuando el programa quiere acceder al objeto anidado, donde se dice: quiero el objeto x que esta asi a/b/c/d/e/////x y cada vez que lo hace se debe leer toda la direccion, en lugar de tener todo en un mismo lugar a/x
hola alba, mira te explico. haces eso cuando vas a publicar el juego, pero siempre quedate con tu respaldo, bien organizado, y cuando lo vayas a publicar, pues ya sabes
Creo que se podría crear los objetos vacíos (por organizacion) y crear un script que cuando generes el ejecutable haga ese tipo de optimizaciones (no soy desarrollador de juegos, solo desarrollador)
He visto gente organizando sus GameObjects como: 🔳 --- Game managers --- 🔳 .... (Acá van los managers) 🔳 --- UI --- 🔳 .... (Acá van las UI) Y así. Sin ponerlos como hijos y esos GameObjects con --- guiones --- en sus nombres son usados como separadores También hay algunos devs que van cargando y descargando escenas de manera dinámica y tienen sus GameObjects seccionados por escenas, y las van instanciando cuando se necesitan aunque parece algo más complicado
Pueden usar un asset que se llama hierarchy 2 que te da la opción de crear "carpetas" en el hierarchy y cuando le das a play saca todos los objetos hijo de la carpeta y los pone por separado. Como lo hizo alva pero automático
no soy de comentar .. pero esto lo vale.... muchas gracias eso si yo no sabía 😁 tengo un .. castillo ... y tiene mucho objeto yo por hacerme el ordenado ..
Yo lo llegué a pensar, Alva me lo acaba de confirmar. Es que tiene sentido si son montonazo de calculos por objeto en cada posición XYZ y si encima son modelos con muchos childs es peor.
Ahora que me he metido en untiy, si Unity sabe que esto pasa, que lo sabe; porque no crea un nuevo tipo de gameObject que sea simplemente "carpeta" y que no tenga ninguna función en la jerarquia salvo organizar los objetos? Es decir, que no afecte a ningún atributo de ninguna forma y no tenga que calcular nada, y solo sea una forma de mostrarlo en la jerarquia
@@carlogustavovalenzuelazepe5774 No necesariamente, pero la gente que es autodidacta, o que estudió la carrera de videojuegos, a veces peca de tener menos conocimientos de algunos aspectos teóricos de la programación, como eficiencias, memorias, etc… (Que siéndote 100% honesto no es de vida o muerte que te sepas los bits exactos que ocupas en una estructura)
por si a alguien le sirve yo divido el juego en 3 carpetas "_Scene", "_Enviorment" (solo estaticos), "_Gameplay" (solo dinamicos). eso soluciona el problema de este hombre.
Claro que consume, Unity usa una logica de compactacion de entidades, cada que tienes objetos dentro de objetos... para explicarme mejor usaré una analogía: no es 1 a 1 evidentemente pero imagina que cada objeto en unity es un ZIP... si tu estas comprimiendo cosas y las metes dentro de otras cosas comprimidas, cada que quieras usar algun objeto tienes que "descomprmir" el doble para acceder a el objeto que esté mas "enterrado en el arbol de objetos"... no es tan bestia evidentemente como usar ZIPs y tecnicamente lo que hace no es descomprimir... pero el motor esta hecho de esta manera, "arreglar esto" involucraría rehacer una buena parte del motor, y no es viable para la empresa supongo. pero si, entre menos niveles uses en tu arbol de GameObjects mejor irá el juego. No es que desempaquete cosas como tal, pero recuerda que cada anidado tiene propiedades de transformación, posicion, rotacion, escala, y otras cosas que no estan a simple vista y recursivamente tiene sumarlas al padre, y tiene que hacer todos estos calculos para cada gameobject anidado, evidentemente si tienes 1000 arboles con 40 hojas cada uno, pues ahi te encargo... y si encima esos arboles los tienes en otro gameobject que es como la isla o asi, pues bien lo llevas ahi xD. aunque te diré que esto no es un "error" exclusivo de unity, godot y muchos otros tambien sufre este problema, es que es sencillamente inherente de como funcionan las relaciones padre hijo cuando tienen datos que tienen que acumularse. que se podria solucionar usando pivotes globales y cosas asi? si.. pero nadie lo hara por que es inviable programarlo
Buenas , quiero automatizar tareas en unity , por ejemplo cada vez que agrego un sprite , tengo que hacer: Ir al inspector seleccionar Multiple, point , apply . como puedo automatizar esa tarea que es repetitiva? gRACIAS DE aNTEMANO!!
No se exactamente que es eso en unity. Pero si tu lo haces así parece ser un array de objetos, entonces para cada uno de esos objetos se cargarán todos en memoria. Entiendo que si unity tiene un garbage collector y quiere liberar memoria se lo estás impidiendo ya que si no va a utilizar uno de esos assets de la pila no puede eliminar la referencia si alguna de sus partes se está usando.
Mi amigo, te molesto con una consulta... en el propio Unity no se ve el boton Play, Stop... están pero en negro... y en ocasionen, cuando en un script pongo un bool publico, a veces se ve como tildar y en otras ocasionen no... como que esta pero no se ve... o sea... se ve el nombre pero no el recuadro para tildar... en todo lo que te comento hablo del entorno Unity... el play para compilar, el stop/pause... el check bool publico que uno pone en C# y que despues uno lo puede usar en el entorno de unity para habilitar o deshabilitar cocosas... sera que mi maquina es poco potente y hay errores por ese motivo? Formatie e instale distintos sistemas operativos (windows 11, 7 y 10) y al instalar Unity pasa exactamente lo mismo... que podria ser?
Es verdad: Las Físicas de COLLIDERS y Rigidbodies de Unity3D disparan unos picos de procesamiento de CPU cada vez que tienes objetos 2D o 3D con otros objetos anidados. Razón: Unity recalcula las Transforms de todo objeto hermano y ancestro en la jerarquía, incluso cuando es innecesario (para evitar Bugs).
Resumen: Alva está llevando todos sus libros de colegio aunque solo le toque llevar el de matemáticas.
En realidad es como que no te dan varias carpetas para llevar hojas para cada materia diferente, entonces tiene todas las materias en una sola carpeta.
Lo que no se es porque hace objetos vacíos en plan carpetas cuando puedes crear carpetas
@@juanbp97Porque no puedes crear carpetas para los objetos XD
Y por que no puede crear carpetas xd?
XD@@enriclop3044
Una vez vi un tutorial donde en lugar de anidar objetos para organizarlos, lo que hacían era crear objetos vacíos como separadores y acomodarlos en la lista para que se pudiesen agrupar los objetos sin anidarlos dentro de otros. Creo que luego de ver esto me hace mucho más sentido el hacerlo así.
En serio 😅 pensaba que estaría un poco mejor hecho ya con tantos años de desarrollo en Unity.
Esa esta buena, asi lo tienes organizado sin afectar.
yo uso eso
@@terminado A ver, a no ser que metan la capacidad de crear carpetas no hay mucho mas (y ni así se solucionaría mucho porque seguirian siendo hijos de. Quiero decir un gameObject dentro de otro sigue teniendo que hacer calculos extras :/
Si, crear nullos para agrupar, sobre todo en 3D
Yo no sabía que era un "Truco". Cuando me lo enseñaron en la universidad era la norma, pensé que en todos lados era igual XD
cuando tu metes objetos en otros objetos, cuando cargas un objeto se cargan los demás objetos hijos, por lo tanto si no borras el espacio en memoria se vuelve mas pesado xD
Buen dato, de verdadxd
Ostras, en serio? Rollo metes todos los árboles en una carpeta árboles, y el garbage colector no diferencia?
@@alvarorodriguez1592 depende el lenguaje en el que bases tu proyecto, xD
@@alvarorodriguez1592 pero Alva no los metio en una carpeta, lo metio en un objeto, al inicializar cualquiera se inicializarian todos
🤯
Es cierto, no recuerdo que video lo vi pero se que en algún video de optimizaciones de unity lo comentaban, e investigando encontré que unity para calcular la posición de los hijos de un objeto tiene que calcular también la del padre por lo que mientras más parents de parents tenga un objeto más posiciones de parents debe chequear para conocer la posición del objeto hijo
ya, si yo comenté algo similar, es como que duplica los objetos.
En resumen, calcula todos los archivos de una carpeta para identificar donde está el archivo que necesitamos en ese momento
Multiplicación de Matrices es lo que hace en cada uno de esos pasos, para objeto está en el centro de su propia matriz.
Al tener objetos como carpetas, lo que estas haciendo es crear una lista de objetos. debido a que cada objeto en una lista es una referencia estas consumiendo N(8 + M) bits donde N es la cantidad de objetos que tienes en esa lista y M la suma del peso de cada objeto, a eso le sumas 12bits de overhead y otros 4 de longitud, por eso ocupas mas memoria que tenerlos separados.
Pobre e ingenuo de ti, creyendo que el grandiosísimo Alva usaría matemáticas para comprender el correcto uso de objetos anidados.
@@renatoprincich3953 En resumen, cargas al objeto raiz y a todas sus ramas al mismo tiempo aún cuando no se necesiten, por eso consume más.
Genio. Me ayudaste una banda 🗣
Lógica de Unity:
Lógica tiene si se conoce el funcionamiento interno. Primero, se tienen todos los objetos anidados cargados en memoria constantemente ya que el objeto padre está cargado en memoria, por lo que tenemos mucha memoria ocupada sin necesitarlo, y segundo los objetos dentro de objetos son dos referencias lo cual duplica el tiempo de búsqueda de la posición de memoria en bytes, ya que hay que hacer una para el objeto padre y otra para los internos
Se nota que nunca lo usaste ni entiendes de lógica xd
En nigun momento dije que no tiene logica
@@zeusconde7 zzz
@@massiete zzzzzzz
Puede ser Alva Majo el gamedev que menos sabe de informática que he visto? Yo no entiendo cómo aún así es tan jodidamente puto amo ese nivel de apañado está potente
jaja, es simple, el odia las matematicas
Se supone que como pertenecen a un solo grupo, están conectados simultáneamente y trabajan como si estuviera cargando un mismo grupo aunque no sea necesario que todos los assets estén trabajando en una carga compartida qué sé vuelve grande. Pero cuando se sacan, obtienen "independencia" y su carga trabaja de manera más independiente con consumos diferentes y separados qué no necesariamente estén siendo cargados todos al mismo tiempo y que no necesariamente estarán funcionando continuamente y en conjunto qué un solo grupo grande. Por eso hay juegos qué pueden limitar las distancias de renderizado para optimizar las cargas de cada uno de los assets, pero si metes todos ellos en un solo grupo. Es como si el sistema tuviera la instrucción de cargar hasta lo que no debería.
Es que tienen doble función, meter el objeto dentro de otro y organizar, quizá necesitamos dividir esas tareas, como un segundo modo de vista de la jerarquía, uno normal de toda la vida y otro modo donde los objetos funcionen como carpetas para poner unas cosas dentro de otras solo con fines de organización
No sé si leerás esto pero prueba a marcar los objetos que no se vayan a mover como Static, en la parte de arriba del inspector. Debería notarse la diferencia en cuanto al performance.
Otra cosa que puedes hacer es usar el Profiler u otras herramientas similares para ver dónde se está trabando cada frame.
El problema de marcalos como static es que aumenta el peso del juego. Para juegos en pc no pasa nada, pero en caso de juegos para android, podes duplicarlo. Me paso de pasar de 50mb a 120mb xD
El problema es el cálculo de posiciones, por cada anidación el cálculo se vuelve más pesado (recursividad). Por lo tanto un solo nivel de anidación en múltiples objetos puede ocasionar problemas de optimización.
No parece, lo de las posiciones se solucionan con punteros y offsets
Eso pasa por el enrutamiento que hace Unity con sus paquetes, tienes muchísimos objetos lo que son muchísimas referencias por segundo, si a cada una de estas referencias le restas esa parte de la ruta, el ordenador tiene que realizar menos peticiones de acceso a carpetas y el juego tiene nombres de ficheros más cortos, lo cual, para nombres concatenados muy largos puede hasta necesitar más memoria de la predicha en un principio. Empiezas a sumar todas estas cositas y si, afecta un montón al rendimiento. Un saludito✌🏻
Ahora toca optimizar la tarifa de unity
Probablemente como lo considera un objeto trata de cargar todo al mismo tiempo y no uno por uno
Simple , estas ejecutando un objeto y adentro de este hay varios objetos , en vez de usar solo el objeto necesario vas a usar varios al mismo tiempo o vas a hacer que se busque el objeto requerido (tardando más por el arduo proceso de búsqueda)
Vídeos que envejecieron maal
pq
Jaja que buen video ibrahimovic
Teniendo eso en cuenta, usa un codigo en el nombre de los archivos cosa que se te organicen solos aún estando todos en una misma carpeta.
Es muy sencillo lo que pasa, si metes todo dentro de un solo objeto el juego verá estas mil cosas como si fueran 1 sola, entonces las cargará a la vez, si están separadas, no lo hará, y cargará las que están en pantalla, es raro, pero tiene sentido
si tienes un objeto en child al actualizar el movimiento de uno se actualiza todo , en physich desactiva sync transform y no te afectaria
Pues ya se porque mi tfg plagado de arboles y vegetación dentro de otros objetos vacíos iba justísimo de FPS, cuando tenga un rato pruebo a sacarlos, a ver si mejora el rendimiento.
Nunca hubiera pensado que podría llegar a ser por eso, el caso es que no pude encontrar nunca otro motivo de la bajada de los fps.
La respuesta esta en el tema de Arboles de Estructura de Datos
Un objeto se almacena completo en memoria.
Dicho esto para acceder a cualquier de los objetos que estan dentro de otro, debes meter en memoria todos los objetos juntos (aunque solo uses uno) y no puedes quitarlos de la memoria hasta que el último de ellos se deje de utilizar.
Cuando todas tus materias las metes en un unico cuaderno y cargas con todos los libros en la mochila
Metio una biblioteca en un cuaderno😅
Hay un asset que te permite crear carpetas en la jerarquía y por lo tanto no tener estos problemas. Tiene sentido que disminuya la performance porque los objetos tienen que estar comprobando cambios en el padre y viceversa
¿Sabes cual es? Entiendo que el problema de él ocurre por querer agrupar todo dentro de un objeto padre, pero si fuera una carpeta, como dices, no debería ocurrir.
Esto es épico esto no sebe de pasar por desapercibido
joder gracias ❤
Imagina hacer un Shooter y poner las armas , cámara , brazo, skin, skin de cuerpo entero y recién enterarme de esto, es para cortarme los esféricos con un corta césped
Eres un grande
mi hipótesis es que al estar todo como hijo de un objeto o carpeta, simplemente comprueba y redimensiona las texturas de todos los objetos de la escena en lugar de solo hacerlo en los objetos cercanos.
Creo que es porque cuando cambias la posicion global de un objeto hijo, unity debe calcularlo para cada padre, ya que los transforms trabajan localmente. La idea es evitar abusar de updates, fixedupdate y lateupdate
Por lo que he oído es tema de la forma en que reparte Unity la carga de los objetos entre los núcleos de la CPU. Dependiendo de la jerarquía, Unity no paraleliza bien los procesos.
Y si esa mejora de fps es debido al como funciona el editor? Porque al final en el build son solo matrices multiplicando otras matrices
Es muy probable ahora que lo decis
en blender es al revés. si creas collection y metes los objetos te reduce el espacio en memoria y te va mejor los renders
Una vez dispuestos en la posiciones deseadas y definitivas ¿no se pueden fusionar todos los objetos en unos pocos para optimizar?
De última, te guardas los objetos en sus versiones separadas pero no implementados en el juego en caso de querer hacer alguna modificación.
Gracias por el dato we
Woow no sabía eso 😮
Devalen: lo dice el que puso arbustos como nubes
Explicación: basicamente cada objeto funciona como un arbol, el arbol tiene ramas y cada rama es un objeto hijo de el objeto, entonces cada vez que tengas que buscar X objeto en la escena tendras que ir dentro de el árbol y bajar entre las ramas para encontrar el objeto, y mientras más tenga que bajar para encontrarlo más se demorará. En lenguajes de programación interpretado esto también es un problema, por eso lo que se hace normalmente es "compilarlos" a Bytecode ( osea como codigo de maquina para una "cpu" inventada por ti ) y luego eso lo pasas a tu VM ( la "cpu" ) para que lo emule, y como no vas "caminando el arbol" ( ese es el nombre, ni yo se porqué ), si no que simplemente vamos en linea recta en un array ejecutando cada instrucción es más rapido, entonces básicamente al sacar cosas de objetos hace que "pase" de caminar un arbol a simplemente buscar en una lista, lo cual es más rápido como ya dije :v
Eso es una abstracción del patrón flyweight
Voy a dar mi opinion al respecto de lo que puede estar pasando (no he usado unity en mi vida), creo que podria tener que ver con el culling, es decir al meter todos los objetos (personitas, arboles, montañas etc..) dentro de un mismo objeto los trata a todos como si fuesen uno solo (calcula la bounding box de todos los objetos en conjunto para utilizarla a la hora de hacer el culling) y a la hora de cuando se renderiza la escena en vez de no dibujar aquellos objetos que no se estan viendo en la pantalla como todos forman un objeto "grande" en conjunto entonces mientras se vea aunque sea solo una personita esta renderizando el resto de objetos aunque no se vean, en cambio cuando los sacas de este objeto "padre" entonces el culling funciona por separado (en este caso para realizar el culling calcula la bounding box de cada objeto por separado) para cada uno de ellos en vez de conjuntamente como he dicho antes.
Tambien te digo, no estoy muy seguro pero tiene bastante sentido, puedo equivocarme. Otra opcion seria que al hacer un objeto hijo, la matriz transform(posicion rotacion y escala) se multiplica con la del padre para "situarlo en la escena" pero dudo muchisimo que sea eso ya que una multiplicacion de matrices para la gpu es pan comido, por cierto hay mucha gente en los comentarios que no tiene ni puta idea de lo que hablan (no se que de memoria y no se que de que tiene que cargar objetos) vais doblados, eso es lo que pasa cuando usais un motor grafico sin tener ni puta idea de como funciona un pc, como funciona el procesador como funciona la memoria, asumo que tampoco habeis programado usando una api de graficos low level como opengl/vulkan/directx, asi que primero aprended y luego hablais que macho dais un poco de vergüenza.
Tiene que ser la transformación si o si. El culling no debería tratar los objetos así, no estaría optimizando nada.
Lo mismo y el comentario iba un poco más de tirar mierda con una explicación más o menos convincente al principio para disimular. "Expertos" que no quieren que principiantes o fans opinen.
@@lissewan1739 precisamente los principiantes o fans no deberian "opinar" sobre temas de los cuales desconocen, una cosa es que des tu opinion aunque no sepas, en plan "pues yo creo que puede pasar esto ... pero no estoy seguro", lo cual aunque estes en lo incorrecto pues no lo has dicho afirmando que eso esta pasando, porque si ves los comentarios hay mucha gente que directamente dice "pues pasa esto" y se quedan tan anchos cuando lo que han escrito es una puta barbaridad e indica que no sabe absolutamente nada de lo que esta hablando, por ejemplo un comentario que me llamo mucho la atencion que voy a poner literal aqui "cuando tu metes objetos en otros objetos, cuando cargas un objeto se cargan los demás objetos hijos, por lo tanto si no borras el espacio en memoria se vuelve mas pesado xD" el que ha escrito esto no tiene ni puta idea de lo que esta diciendo, por eso digamos que me cabreo con esta gente, porque lo unico que hacen es desinformar y perjudicar a precisamente esos principiantes que estan aprendiendo, cuando viene alguien que sabe mas que yo, me callo, escucho y aprendo, aqui pasa lo contrario los que no saben, hablan demasiado.
Mucho meter mierda a la gente pero el que más va doblao con el tema eres tú XD. No tiene ningún tipo de sentido lo que has dicho.
@@DavidGispert estos juegos que se ven sencillos son un dolor de cabeza de crear, ahora se que tengo que empezar por algo simple, y que no me consuma la vida...
algunos hablan afirmando lo que solo suponen, como si les hubiese pasado por experiencia, no esta mal un: yo creo o pienzo que, de vez en cuando.
Veo a mucha gente enrredada pasando mucho tiempo tratando de resolver un problema que se les complica cada dia
Creo que es por la modularidad solo llama lo que va usar y cuando esta todo en el mismo archivo cargara todo.. creo.. 🤔
Dato curioso que no le importa a nadie: Se me hace parecido cuando en los servers de Minecraft si pones muchos carteles se recarga el texto cada tanto tiempo y aunque esté sin escribir también pasa.
Así que ya sabeis si juegas un server con amigos en aternos o cualquier server gratis de Minecraft usen otra cosa para hacer sus granjas de mobs como trampillas o algo así XD.
Realmente es muy guapo
Matemáticas hijos . Te puedes equivocar pero los números no mienten
Te apodo el Quijote gaming
Bueno, es que aunque no estes usando los objétos que tienes dentro, cuando pones el que está afuera, se cargan los de adentro
Alva descubriendo y aprendiendo a programar sin videos de RUclips y sin haber estudiado, además programando mejor que otros expertos con carrera universitaria, simplemente un grande alva el majo
siento que el problema esta en cuando el programa quiere acceder al objeto anidado, donde se dice:
quiero el objeto x que esta asi a/b/c/d/e/////x
y cada vez que lo hace se debe leer toda la direccion, en lugar de tener todo en un mismo lugar a/x
hola alba, mira te explico. haces eso cuando vas a publicar el juego, pero siempre quedate con tu respaldo, bien organizado, y cuando lo vayas a publicar, pues ya sabes
Yo con todo mi proyecto en un objeto: ª
Tal cual, no sé por qué necesita ents
Creo que se podría crear los objetos vacíos (por organizacion) y crear un script que cuando generes el ejecutable haga ese tipo de optimizaciones (no soy desarrollador de juegos, solo desarrollador)
Supongo que la dirección de los objetos es mas larga cuando están dentro de otros
He visto gente organizando sus GameObjects como:
🔳 --- Game managers ---
🔳 .... (Acá van los managers)
🔳 --- UI ---
🔳 .... (Acá van las UI)
Y así. Sin ponerlos como hijos y esos GameObjects con --- guiones --- en sus nombres son usados como separadores
También hay algunos devs que van cargando y descargando escenas de manera dinámica y tienen sus GameObjects seccionados por escenas, y las van instanciando cuando se necesitan aunque parece algo más complicado
Eso pasa ya que no tiene que buscar tanto en las carpetas las texturas es más rápido por lo tanto es más fps
cuando se cree un objeto grande, crea todos los objetivos chiquitos
Sera por que no los tienes marcado como static? son arboles, no tienen por que ser dinamicos
Que locochon ❤😂🎉
¿Puede ser porque aplica herencia, cosa que es costosa en tiempo de ejecución por la gestión de tipos (rtti)?
Pueden usar un asset que se llama hierarchy 2 que te da la opción de crear "carpetas" en el hierarchy y cuando le das a play saca todos los objetos hijo de la carpeta y los pone por separado. Como lo hizo alva pero automático
Unity tiene alguna opcion para unir varios assets en uno solo? En Unreal por ejemplo se puede hacer eso para optimizar mejor al ser menos objetos
Sacaste 15fps mas en una build o en el editor? porque hay una gran diferencia ahi...
Obvio
no soy de comentar .. pero esto lo vale.... muchas gracias eso si yo no sabía 😁
tengo un .. castillo ... y tiene mucho objeto yo por hacerme el ordenado ..
Felicidades 👍. Saludos desde Cuba 🎉 versión para Android?
Porque en programación iterar un bucle dentro de otro bucle siemyes mas costoso en cuanto a rendimiento.
me imagino que es por la indexación
Y aquí, señoras y señores, tenemos a un genio
Yo lo llegué a pensar, Alva me lo acaba de confirmar. Es que tiene sentido si son montonazo de calculos por objeto en cada posición XYZ y si encima son modelos con muchos childs es peor.
Como te decimos....
Esto sucede por que reduces el número de rutas de accesos de datos.
Ahora que me he metido en untiy, si Unity sabe que esto pasa, que lo sabe; porque no crea un nuevo tipo de gameObject que sea simplemente "carpeta" y que no tenga ninguna función en la jerarquia salvo organizar los objetos? Es decir, que no afecte a ningún atributo de ninguna forma y no tenga que calcular nada, y solo sea una forma de mostrarlo en la jerarquia
Claro, porque carga cada agrupación por grupo, entonces le cuesta menos si carga 1x1 en lugar de todo del tiron
Pero tu juego tiene polimorfismo?
JSJSJJSJSJSJS
es alva, no lo tiene xdd
@@Distoupia es mal programador el alva?
@@carlogustavovalenzuelazepe5774 No necesariamente, pero la gente que es autodidacta, o que estudió la carrera de videojuegos, a veces peca de tener menos conocimientos de algunos aspectos teóricos de la programación, como eficiencias, memorias, etc… (Que siéndote 100% honesto no es de vida o muerte que te sepas los bits exactos que ocupas
en una estructura)
@@pablocontreras3826 pues yo soy programador y no sabía nada de ésto.
Serà por que cada instancia a esos objetos carga en memoria los recursos en lugar de solo cuando es necesario o una para todos?
Entonces ¿si hago un mapa me conviene más hacerlo en partes y suelto que mantenerlo todo dentro del objeto mapa?
Si es real XD
Tengo una escena todo organizado y otra que nunca organice y tiene mucho mas objetos y va mas fluida que la organizada.
Normal, la herencia consume
Alva Majo = genio
Con razon que mi juego desordenado internamente corre epico
por si a alguien le sirve yo divido el juego en 3 carpetas "_Scene", "_Enviorment" (solo estaticos), "_Gameplay" (solo dinamicos). eso soluciona el problema de este hombre.
en _Scene estan las luces camaras timelines etc
A ver, tiene todo el sentido del mundo.
Claro que consume, Unity usa una logica de compactacion de entidades, cada que tienes objetos dentro de objetos... para explicarme mejor usaré una analogía: no es 1 a 1 evidentemente pero imagina que cada objeto en unity es un ZIP... si tu estas comprimiendo cosas y las metes dentro de otras cosas comprimidas, cada que quieras usar algun objeto tienes que "descomprmir" el doble para acceder a el objeto que esté mas "enterrado en el arbol de objetos"... no es tan bestia evidentemente como usar ZIPs y tecnicamente lo que hace no es descomprimir... pero el motor esta hecho de esta manera, "arreglar esto" involucraría rehacer una buena parte del motor, y no es viable para la empresa supongo. pero si, entre menos niveles uses en tu arbol de GameObjects mejor irá el juego. No es que desempaquete cosas como tal, pero recuerda que cada anidado tiene propiedades de transformación, posicion, rotacion, escala, y otras cosas que no estan a simple vista y recursivamente tiene sumarlas al padre, y tiene que hacer todos estos calculos para cada gameobject anidado, evidentemente si tienes 1000 arboles con 40 hojas cada uno, pues ahi te encargo... y si encima esos arboles los tienes en otro gameobject que es como la isla o asi, pues bien lo llevas ahi xD. aunque te diré que esto no es un "error" exclusivo de unity, godot y muchos otros tambien sufre este problema, es que es sencillamente inherente de como funcionan las relaciones padre hijo cuando tienen datos que tienen que acumularse. que se podria solucionar usando pivotes globales y cosas asi? si.. pero nadie lo hara por que es inviable programarlo
Tal vez en tiempo de compilacion para produccion se realizan estas optimizaciones de accesos a recursos perezosos?
Buenas , quiero automatizar tareas en unity , por ejemplo cada vez que agrego un sprite , tengo que hacer: Ir al inspector seleccionar Multiple, point , apply . como puedo automatizar esa tarea que es repetitiva? gRACIAS DE aNTEMANO!!
Y porque no unir todos los modelos estáticos para formar uno solo?, si no se va a mover, no necesita estar en partes, no?
Alva Majo hace juegos terribles pero le apasiona el tema, deberia ser maestro
Tengo entendido que en Unity cuándo mueves un objeto se mueven todos los objetos que están adentro ¿Quizás eso provoque el lag?
La verdad no uso Unity así que no me tomen en serio si estoy mal.
No es porque al meter todo en island assets una vez que se cargue uno de los objetos se carguen todos juntos?
Alga mallo contandonos sus problemas
No se exactamente que es eso en unity.
Pero si tu lo haces así parece ser un array de objetos, entonces para cada uno de esos objetos se cargarán todos en memoria. Entiendo que si unity tiene un garbage collector y quiere liberar memoria se lo estás impidiendo ya que si no va a utilizar uno de esos assets de la pila no puede eliminar la referencia si alguna de sus partes se está usando.
Mi amigo, te molesto con una consulta... en el propio Unity no se ve el boton Play, Stop... están pero en negro... y en ocasionen, cuando en un script pongo un bool publico, a veces se ve como tildar y en otras ocasionen no... como que esta pero no se ve... o sea... se ve el nombre pero no el recuadro para tildar... en todo lo que te comento hablo del entorno Unity... el play para compilar, el stop/pause... el check bool publico que uno pone en C# y que despues uno lo puede usar en el entorno de unity para habilitar o deshabilitar cocosas... sera que mi maquina es poco potente y hay errores por ese motivo? Formatie e instale distintos sistemas operativos (windows 11, 7 y 10) y al instalar Unity pasa exactamente lo mismo... que podria ser?
Al final era una tonteria... w10 de mi notebook estaba en ahorrar energia... lo cambie para que priorice el maximo rendimiento y no se me apagó mas
Es verdad: Las Físicas de COLLIDERS y Rigidbodies de Unity3D disparan unos picos de procesamiento de CPU cada vez que tienes objetos 2D o 3D con otros objetos anidados.
Razón: Unity recalcula las Transforms de todo objeto hermano y ancestro en la jerarquía, incluso cuando es innecesario (para evitar Bugs).
Mi papá también consume
Osea que en vez de llevar mis cuadernos en mi bolso los llevo todos en mis brazos para poder ahorrar energía 🙀
Creo que lo que pasa es que se tarda en abrir una carpeta mas.
X2 😢
yeey
Si pero quien usara unity hoy en dia y correr el riesgo de volverse un juego popular?