Noticias

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

Duda con los Co-Rutinas

Iniciado por Raúl, Julio 03, 2018, 12:03:12 PM

Tema anterior - Siguiente tema
Buenos días!
 
Estoy desarrollando una aplicación que descarga de un servidor modelos 3D para luego cargarlos en la escena. Para la parte de la descarga he conseguido hacerlo de manera "asincrona".
 
Sin embargo, a la hora de cargar los objetos pese a meter toda la ejecución de la carga de objetos dentro de una co-rutina tanto en el editor como en el dispositivo, la ejecución del programa se "detiene" 3 o 4 segundos hasta que la carga finaliza. Hay alguna forma de evitar esos 3,4 segundos?
 

private void addModel(string path, StepContent model)
    {
            StartCoroutine(LoadObjets(path, model));
}
IEnumerator LoadObjets(string path, StepContent model)
    {
   // Aqui va todo el codigo de la carga.
        yield return null;
    }

 
 
 
Un saludo y Gracias!

Buenas.
 
Antes que nada,no soy programador como tal, mas bien un pica-codigo,asi que no puedo darte una definicion tecnica de las coroutinas,pero un par de apuntes.
 
Las coroutinas no se ejecutan en un hilo a parte, se ejecutan en el mismo main thread,a menos que tu las lances desde otro thread,por lo tanto si una coroutina tiene que calcular mucho bloqueara el main thread como cualquier otro metodo/funcion.
 
Las coroutinas dijamos que son metodos/funciones que permiten hacer saltos de frame, si tu pones un
 
yield return null;
 
lo que hace es que a partir de ese punto,saltara/esperara hasta el siguiente frame y continuara con su ejecucion.
 
Luego tienes otras variantes como waitforsecons,waituntil... que hacen lo mismo,esperar al siguiente frame, en estos casos por tiempo o a que se cumpla una condicion,para que se siga ejecutando como un metodo/funcion cualquiera.
 
Quiero decir no son asinchronas por que si,es como si pudieras poner puntos de espera dentro del metodo/funcion.
 
Bueno como ves no es una explicacion muyy tecnica XD seguramente incorrecta incluso XD
 
Lo que tendrias que hacer es hacer la carga del modelo en un thread diferente,o en un job si estas con las ultimas versiones de unity.
 

StartCorutine(LoadObject);
LoadObject{
  EnableLoadWindow()
  LoadObjectThread()
  yield return waitUntil objectLoaded
  DisableLoadWindow()  
}

 
Espero se entienda este pseudo-pseudo-pseudo-codigo XD,seguro alguien nos da una explicacion mas tecnica y mejor), pero la idea es asi,tendras que buscar como se crea un thread/job en unity porque asi "a pelo" no recuerdo bien las palabras exactas para hacerlo. :P pero no era complicado
 
Un Saludo!

hola
 
que cargas? objetos y texturas? cor resources load?
 
deverias controlar como cargas lo que cargas....
 
aqui un ejemplo de carga "asincrona"
 
 
 

IEnumerator LoadObjets(string path, StepContent model)
{ // Aqui va todo el codigo de la carga.
ResourceRequest resourceRequest = Resources.LoadAsync<Texture2D> ("Resources/Textures/myTexture");
    while (!resourceRequest.isDone) {
          yield return 0;
    }
    material.mainTexture = resourceRequest.asset as Texture2D;
}

 
 

Lo primero, gracias a los dos por las respuestas
 
Lo que cargo en la escena son objetos3d (.fbx) que descargo y posteriormente cargo en la escena en tiempo de ejecución, utilizo una librería de la assetStore llamada Trilib para ayudarme con este proceso ya que solo no conseguí hacerlo ( Trabajo con HoloLens esto hace que la mayoria de metodos "tradicionales" no me funcionen).
 
Al hacerlo en tiempo de ejecución no conseguí que el Resources.Load me funcionara.. asi que no se que mas probar..
 
He probado a crear un thread para la ejecucion
 

Thread saveThread = new Thread(o =>
        {
//Aquí puse la llamada a la libreria que se encarga de cargar los objetos
        });
        saveThread.Start();

 
Sin embargo me dice que esa llamada debe estar en el Thread principal.

Mmmhh con un plugin thirdParty por medio la cosa se oscurece ya que no sabes bien bien que esta haciendo y hay cosas que no sepueden hacer fuera del main thread.
 
Pero me extrañaria que la api del plugin no trajera un metodo para hacer una carga Async,como lo que ha puesto Igor de unity para assets pero propia de la api para los modelos.
 
Lo normal seria que la api tenga algun metodo LoadAsync/ImportAsync y algun callback onLoaded,onFinish,onFailed que te lance un metodo subscrito cuando acabe.
 
Mira en la doc de la api si hay algo parecido, o dejanos el link de la doc haber si lo vemos.
 
:)

Cita de: hammer date=1530623804Mmmhh con un plugin thirdParty por medio la cosa se oscurece ya que no sabes bien bien que esta haciendo y hay cosas que no sepueden hacer fuera del main thread.
   
   
      Pero me extrañaria que la api del plugin no trajera un metodo para hacer una carga Async,como lo que ha puesto Igor de unity para assets pero propia de la api para los modelos.
   
   
      Lo normal seria que la api tenga algun metodo LoadAsync/ImportAsync y algun callback onLoaded,onFinish,onFailed que te lance un metodo subscrito cuando acabe.
   
   
      Mira en la doc de la api si hay algo parecido, o dejanos el link de la doc haber si lo vemos.
   
   
      :)
   


Haberla la hay el problema es que no funciona en HoloLens, en el editor de unity va perfecto pero cuando lo  meto en el dispositivo no funciona  :/
 
dejo enlace de la doc por si alguno ve algo que yo me he pasado https://ricardoreis.net/trilib/manual/html/index.html

Pues hechandole un ojo no llego a entenderlo, es decir.Veo que basicamente tiene dos formas de importar,AssetDownloader y AssetLoader.Y las dos tienen pinta de hacerse de manera asincrona,no pone nada pero al tener los tipicos onAssetLoader y demas pues es de suponer que si.Tambien supongo que la manera que no funciona en Holo es AssetDownloader,no veo porque no deberia,tampoco entiendo que en el editor una manera te vaya fina y la otra te provoque 4 segundos de paron.Por que a parte de la descarga de datos,el importar el modelo deberia ser igual asi que si en una se atasca en la otra tambien deberia.
 
Creo que lo mejor sera que envies un email al desarrollador haber que te dice,si hay manera de hacer que la manera fina funcione en Holo,que te asegure que la otra manera se hace de manera asincrona,podria entender que bajara el rendimiento del Holo, tienen poca potencia y importar Fbx puede ser caro,pero en el editor no se deberia atascar durante 4 segundos y si lo hace tendria que hacerlo de las dos maneras.Has probado con otro formato ,.obj es mucho mas barato p.ej,y con un objeto sencillo,un plano o un cubo,a ver si se atasca tambien.
 
En el peor de los casos si el proyecto te lo permite podrias considerar AssetBundles,te da mas posibilidades,aunque te restringe al tener que crearlos en el editor.
 
No se, no se puede decir mucho al ser un plugin.Haber si hay suerte y el desarrollador puede ayudarte.
 
 

ya le puse un mail, a ver que me dice

Etiquetas: