Je développe une application avec Unity et Google Tango, et une partie de mon code enregistre un fichier de description de zone (ADF) dans un thread séparé (de sorte que mon interface utilisateur reste sensible):AreaDescription.SaveCurrent() bloque la boucle de mise à jour d'Unity malgré le nouveau thread
Debug.Log("create thread");
m_saveThread = new Thread(() =>
{
// Start saving process in another thread.
Debug.Log("Starting work in thread");
currentAreaDescription = AreaDescription.SaveCurrent();
Debug.Log("SaveCurrent completed");
AreaDescription.Metadata metadata = currentAreaDescription.GetMetadata();
metadata.m_name = name;
currentAreaDescription.SaveMetadata(metadata);
});
Debug.Log("Start thread");
m_saveThread.Start();
Debug.Log("thread started");
Mon problème est que même quand je lance le code d'économie dans un nouveau thread, l'interface utilisateur est toujours gelé jusqu'à ce que AreaDescription.SaveCurrent()
finalise. Pour confirmer cela, je l'ai ajouté l'appel d'impression suivant à mon Update()
:
public void Update()
{
Debug.Log("Update!");
//...
}
Et c'est un extrait de adb logcat -s Unity
au moment où je sauve:
08-23 15:11:43.746 18474 18518 I Unity : Update!
08-23 15:11:43.747 18474 18518 I Unity : Save confirmed!
08-23 15:11:43.747 18474 18518 I Unity : overlay
08-23 15:11:43.747 18474 18518 I Unity : create thread
08-23 15:11:43.748 18474 18518 I Unity : Start thread
08-23 15:11:43.753 18474 18518 I Unity : thread started
08-23 15:11:43.754 18474 18836 I Unity : Starting work in thread
08-23 15:11:44.960 18474 18518 I Unity : Update!
08-23 15:11:44.961 18474 18518 I Unity : Currently saving!
08-23 15:11:44.964 18474 18836 I Unity : SaveCurrent completed
08-23 15:11:44.977 18474 18518 I Unity : Update!
(plusieurs lignes non pertinentes enlevées)
Comme le montrent les horodatages, pour l'ensemble ~ 200ms que SaveCurrent()
s'exécute, Update()
n'est pas appelé.
Pourquoi le thread principal est-il gelé malgré le fait que cette fonction lourde soit exécutée dans un nouveau thread? Et que puis-je faire pour le faire en cours en arrière-plan? Par ailleurs, ce code est presque directement adapté de Google's own sample repo et j'ai créé an issue à ce sujet, actuellement sans réponse.