Unity3d mémoire: charger et décharger des préfabriqués
J'ai vraiment besoin d'aide!
Je ne peux pas comprendre comment travailler avec préfabriqués et de déchargement.
J'ai de la prochaine situation.
Je lance mon application sur IPad à partir de Xcode.
L'unité de la version Pro 4.3.1.
Regarder la mémoire à l'aide de:
Xcode Navigateur De Débogage
Xcode Instruments
L'Unité Profiler
Je ne les prochaines étapes:
0) de l'Unité commence à partir de la scène Vide.
La mémoire utilisée XCODE Navigateur de Débogage: 11 mo Instruments: 26.4 mb Unité Profiler: utilisé total 13,2 réservés total de 13,7
1) la Charge de la préfabrication de dossier de Ressources
prefab = Resources.Load("Room1");
La mémoire utilisée XCODE Navigateur de Débogage: 30.8 mb Instruments: 49.54 mo Unité Profiler: utilisé
19.8 réservés total de 20,4
2) Instancier prefab
go = (GameObject)Instantiate(prefab);
go.name = "Room1";
XCODE Navigateur de Débogage: 31.2 mb Instruments: 50 mo Unité Profiler: utilisé total 20 réservée total de 20,7
3) de Détruire tous les objets sur la scène de la mémoire pas changé
Transform[] tr = FindObjectsOfType<Transform>();
for (int i = 0; i < tr.Length; i++)
{
GameObject goo = tr.gameObject;
if (goo.name != "Main Camera")
{
Destroy(goo);
goo = null;
}
}
XCODE Navigateur de Débogage: 31.1 mb Instruments: participation de 49,93 mo Unité Profiler: utilisé total de 19,8 réservés total de 20,4
4) Appel Resources.UnloadUnusedAssets();
- mémoire pas changé
5) Appel System.GC.Collect();
- mémoire pas changé
6) Appel UnloadAsset de prefab Resources.UnloadAsset(prefab);
- mémoire pas changé
7) Appel Resources.UnloadUnusedAssets();
- mémoire partiellement nettoyée
XCODE Navigateur de Débogage: 21.9 mb Instruments: 40.79 mo Unité Profiler: utilisé total 13,2 réservés total de 13,9
Profileur je vois, qui a supprimé toutes les textures, qui est utilisé dans la préfabrication
8) System.GC.Collect();
- mémoire pas changé
9) Charger la scène vide - mémoire pas changé
Voici un autre moment intéressant:
Lorsque l'application va à fond et j'ai démarrer une autre application, la taille de la RAM utilisé, réduit considérablement, et quand j'appelle à l'unité app - mémoire va à la première taille avec une scène vide.
J'ai des questions suivantes:
1) Pourquoi la mémoire ne sont pas nettoyés entièrement après la suppression de la préfabrication et de l'appel UnloadUnusedAssets - nous pouvons le voir dans les Instruments et Xcode mais dans le Profiler, nous voyons que la mémoire pratiquement entièrement gratuit?
2) C'est vrai pour nettoyer la mémoire de taille initiale?
3) Dois-je toutes les étapes de droite ou je fais quelque chose de mal?
Vous pouvez télécharger le projet de test ici:
http://gfile.ru/aa5on
Grand merci pour vos réponses.
OriginalL'auteur madmik | 2014-06-06
Vous devez vous connecter pour publier un commentaire.
Préambule
Il est bon que vous êtes conscient de l'utilisation de la RAM. Mais, la question est: avez-vous rencontré des problèmes avec l'utilisation de la mémoire? Si non, alors ce que vous faites est prématuré.
Quelques réflexions
Voici quelques pensées pour vous d'envisager:
Object.Destroy
ne pas détruire un objet instantanément:Resources.UnloadUnusedAssets
est asynchrone. Il n'a pas tout décharger instantanément.Resources.UnloadAsset(Object assetToUnload)
décharger ressources référencées parassetToUnload
.Explication
Je ne peux pas me considérer comme un expert dans la gestion de la mémoire (à la fois de l'Unité et Mono). Mais voici comment je comprends ce qu'il se passe:
Préfabriqué a été chargé avec toutes les ressources référencées par elle. L'utilisation de la mémoire augmente. Tout est clair maintenant.
L'utilisation de la mémoire a augmenté un peu pour tenir prefab clone.
Voici venir les choses intéressantes 🙂 en Fait, l'utilisation de la mémoire a changé en fonction de l'Unité de profiler: c'est le même qu'il était avant l'instanciation de la préfabrication. Donc il semble que l'Unité a publié quelque chose qui est directement liée à la préfabrication de l'instance. Mais, comme il est dit, mono ne sera pas de retour de la mémoire de l'OS (et c'est même pas le temps pour elle de le faire, même si c'était le cas).
Resources.UnloadUnusedAssets
ne décharger rien ici, parce qu'il n'y sont pas encore actifs inutilisés: si les objets ont été marqués pour la destruction, le réel de la collecte des ordures n'a pas eu lieu.C'est parce que c'est de la mémoire gérée par la mono.
Je crois que l'utilisation de la mémoire a chuté un peu ici (100K-200K), mais vous ne l'avez pas remarqué. Mais, comme je l'ai mentionné ci-dessus,
UnloadAsset
ne peut pas se décharger de ressources que référencé par l'objet passé en paramètre àUnloadAsset
.Sur l'étape 5, vous avez invoqué GC.Collect(), la collecte a eu lieu et maintenant, une partie de l'Unité actifs ont pas de références. Ainsi, ils peuvent être libérés enfin. C'est pourquoi la mémoire a été libérée.
Expliqué ci-dessus
Tout ce qui pouvait être libérés ont été libérés déjà. Donc pas de changement dans l'utilisation de la mémoire.
Je vois. Première chose à se concentrer sur l'ici est d'essayer de réduire la texture de l'utilisation de la mémoire. Utilisez-vous la compression de texture? Est-il possible de faire des textures plus petits, sans perdre en qualité? Ensuite, vous devez décharger autant de ressources que possible avant la pause de l'Unité joueur. Vous pouvez soit essayer d'appel de la Ressource.UnloadAsset sur toutes les ressources (principalement des textures), qui est chargé (je n'ai jamais essayé cela, mais devrait fonctionner), ou vous pouvez charger des vide "Pause" de la scène et de l'appel de Ressources.UnloadUnusedAssets.
OriginalL'auteur Sergey Krusch
Bien, peut-être que j'ai besoin de voir un problème à partir d'un autre côté propre de la mémoire lorsque l'Unité d'application est en pause? Peut-être que quelqu'un sait comment il faut faire?
Ou de le redémarrer lorsque j'essaie de démarrer en pause l'application.
OriginalL'auteur madmik