[Résolu][DB-AL] Chargement de textures, out of memory après convertion Js> C#

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Avatar de l’utilisateur
Silverglade
Messages : 264
Inscription : 04 Août 2012 17:52

[Résolu][DB-AL] Chargement de textures, out of memory après convertion Js> C#

Message par Silverglade » 02 Mars 2019 18:04

Bonjour,

Je cherche à faire en sorte que le joueur puisse personnaliser la texture d'un objet simple en temps réel, avant mon passage en C# tout fonctionnait en Js, editeur et standalone (via WWW).
En passant en C# en éditeur je n'ai jamais de problème quand on actualise les textures, mais en standalone ça se termine systématiquement en crash out of memory.
Je ne m'y connais pas du tout en allocation de mémoire et c'est ce qui apparemment pose problème ?

Le code est le suivant:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class GetTextures : MonoBehaviour
{ 
    [Header("Textures")]
    private string[] myPaths;
    public Texture[] myTextures;

    [Header("Mats à changer")]
    public List<MyInts> myInts;   

    void Awake()
    {
        myPaths = new string[]{ "texture1.jpg", "texture2.jpg", "texture3.jpg","texture4.jpg","texture5.jpg","texture6.jpg"};
        myTextures = new Texture[myPaths.Length];
        StartCoroutine(SyncMe());
    }

    IEnumerator SyncMe()
    {
        for (int i = 0;i < myPaths.Length;i++)
        {
            UnityWebRequest www = UnityWebRequestTexture.GetTexture("file://C:" + "/DossierTest/" + myPaths[i]);
            yield return www.SendWebRequest();
            myTextures[i] = DownloadHandlerTexture.GetContent(www);
        }

        foreach (MyInts myDatas in myInts)
        {
            GetComponent<Renderer>().materials[myDatas.myMatToChange].mainTexture = myTextures[myDatas.TextureID];
        }
    }

    void Update()
    {
        if (Input.GetKeyDown("space"))
        {
            StartCoroutine(SyncMe());
        }
    }

    [System.Serializable]
    public class MyInts
    {
        [Header("Material à modifier")]
        public int myMatToChange;
        [Header("Texture à assigner")]
        public int TextureID;
    }
}
Pour expliquer brièvement, "class MyInts" me permet d'ajouter des materials dans une liste dans l'éditor et d'y attribuer la texture modifiable. La 1ere boucle "SyncMe" charge les textures dans le tableau "Texture" et la seconde boucle les assigne à chaque materials de la liste.
Au lancement du projet ça fonctionne, je ne comprends pas pourquoi ça ne fonctionne plus ensuite ?
Dernière édition par Silverglade le 03 Mars 2019 13:59, édité 1 fois.

Avatar de l’utilisateur
Max
Messages : 8764
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Chargement de textures, out of memory après convertion Js> C#

Message par Max » 02 Mars 2019 18:36

Bonjour,

Sur quelle ligne tu as l'erreur, ça peut aider.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Silverglade
Messages : 264
Inscription : 04 Août 2012 17:52

Re: [DB-AL] Chargement de textures, out of memory après convertion Js> C#

Message par Silverglade » 02 Mars 2019 21:00

Aucune, ça crash juste sans message sans rien. Dans l'éditeur pas d'erreur ni de crash :/
Ou tu parles du log? (Allocation happened at: Line:211 in Memory overview)

Avatar de l’utilisateur
Silverglade
Messages : 264
Inscription : 04 Août 2012 17:52

Re: [DB-AL] Chargement de textures, out of memory après convertion Js> C#

Message par Silverglade » 02 Mars 2019 21:12

Le seul endroit ou je peux avoir des infos mais que je ne sais pas interpréter:

Code : Tout sélectionner

Initialize engine version: 2018.3.6f1 (a220877bc173)
GfxDevice: creating device client; threaded=1
Direct3D:
    Version:  Direct3D 11.0 [level 11.1]
    Renderer: NVIDIA GeForce GTX 1060 6GB (ID=0x1c03)
    Vendor:   (null)
    VRAM:     3072 MB
    Driver:   25.21.14.1771
Begin MonoManager ReloadAssembly
- Completed reload, in  0.055 seconds
<RI> Initializing input.

<RI> Input initialized.

<RI> Initialized touch support.

WARNING: Shader Unsupported: 'Standard' - Pass 'META' has no vertex shader
WARNING: Shader Unsupported: 'Standard' - Pass 'META' has no vertex shader
WARNING: Shader Unsupported: 'Legacy Shaders/Specular' - Pass 'Meta' has no vertex shader
WARNING: Shader Unsupported: 'Legacy Shaders/Bumped Specular' - Pass 'Meta' has no vertex shader
WARNING: Shader Unsupported: 'Legacy Shaders/Bumped Specular' - Pass 'Meta' has no vertex shader
WARNING: Shader Unsupported: 'Legacy Shaders/Diffuse' - Pass 'Meta' has no vertex shader
WARNING: Shader Unsupported: 'Legacy Shaders/Transparent/Cutout/Diffuse' - Pass 'Meta' has no vertex shader
WARNING: Shader Unsupported: 'Standard (Specular setup)' - Pass 'META' has no vertex shader
WARNING: Shader Unsupported: 'Standard (Specular setup)' - Pass 'META' has no vertex shader
WARNING: Shader Unsupported: 'Legacy Shaders/Self-Illumin/VertexLit' - Pass 'META' has no vertex shader
WARNING: Shader Unsupported: 'Legacy Shaders/Transparent/Specular' - Pass 'Meta' has no vertex shader
WARNING: Shader Unsupported: 'Legacy Shaders/Transparent/Cutout/Specular' - Pass 'Meta' has no vertex shader
WARNING: Shader Unsupported: 'Legacy Shaders/Self-Illumin/Diffuse' - Pass 'Meta' has no vertex shader
WARNING: Shader Unsupported: 'Legacy Shaders/Transparent/Diffuse' - Pass 'Meta' has no vertex shader
UnloadTime: 0.543700 ms
DynamicHeapAllocator allocation probe 1 failed - Could not get memory for large allocation 29012008.
DynamicHeapAllocator allocation probe 1 failed - Could not get memory for large allocation 2745603.
DynamicHeapAllocator allocation probe 1 failed - Could not get memory for large allocation 907218.
DynamicHeapAllocator allocation probe 2 failed - Could not get memory for large allocation 29012008.
DynamicHeapAllocator allocation probe 2 failed - Could not get memory for large allocation 2745603.
DynamicHeapAllocator allocation probe 2 failed - Could not get memory for large allocation 907218.
DynamicHeapAllocator allocation probe 3 failed - Could not get memory for large allocation 29012008.
DynamicHeapAllocator allocation probe 3 failed - Could not get memory for large allocation 2745603.
DynamicHeapAllocator allocation probe 3 failed - Could not get memory for large allocation 907218.
DynamicHeapAllocator allocation probe 4 failed - Could not get memory for large allocation 29012008.
DynamicHeapAllocator allocation probe 4 failed - Could not get memory for large allocation 2745603.
DynamicHeapAllocator allocation probe 4 failed - Could not get memory for large allocation 907218.
DynamicHeapAllocator out of memory - Could not get memory for large allocation 29012008!
Could not allocate memory: System out of memory!
Trying to allocate: 29012008B with 16 alignment. MemoryLabel: FMODSample
Allocation happened at: Line:211 in 
Memory overview

[ ALLOC_DEFAULT ] used: 1907236753B | peak: 0B | reserved: 1925981589B 
[ ALLOC_TEMP_JOB ] used: 0B | peak: 0B | reserved: 6291456B 
[ ALLOC_TEMP_BACKGROUND_JOB ] used: 0B | peak: 0B | reserved: 1048576B 
[ ALLOC_GFX ] used: 1430821770B | peak: 0B | reserved: 1435984690B 
[ ALLOC_CACHEOBJECTS ] used: 37757524B | peak: 0B | reserved: 48866312B 
[ ALLOC_TYPETREE ] used: 0B | peak: 0B | reserved: 0B 
[ ALLOC_TEMP_THREAD ] used: 32768B | peak: 0B | reserved: 5144576B 
Could not allocate memory: System out of memory!
Trying to allocate: 29012008B with 16 alignment. MemoryLabel: FMODSample
Allocation happened at: Line:211 in 
Memory overview

[ ALLOC_DEFAULT ] used: 1907236753B | peak: 0B | reserved: 1925981589B 
[ ALLOC_TEMP_JOB ] used: 0B | peak: 0B | reserved: 6291456B 
[ ALLOC_TEMP_BACKGROUND_JOB ] used: 0B | peak: 0B | reserved: 1048576B 
[ ALLOC_GFX ] used: 1430821770B | peak: 0B | reserved: 1435984690B 
[ ALLOC_CACHEOBJECTS ] used: 37757524B | peak: 0B | reserved: 48866312B 
[ ALLOC_TYPETREE ] used: 0B | peak: 0B | reserved: 0B 
[ ALLOC_TEMP_THREAD ] used: 32768B | peak: 0B | reserved: 5144576B 

 
(Filename:  Line: 1161)

Crash!!!
  ERROR: Error while initializing dbghelp.dll, GetLastError: 'L’opération a réussi.' (Address: 00000000)

========== OUTPUTTING STACK TRACE ==================

  ERROR: Error while initializing dbghelp.dll, GetLastError: 'L’opération a réussi.' (Address: 00000000)

========== END OF STACKTRACE ===========

A crash has been intercepted by the crash handler. For call stack and other details, see the latest crash report generated in:
 * C:/Users/USER~1/AppData/Local/Temp/MonJeu/Jeu/Crashes
DynamicHeapAllocator out of memory - Could not get memory for large allocation 907218!
Could not allocate memory: System out of memory!
Trying to allocate: 907218B with 16 alignment. MemoryLabel: WebRequest
Allocation happened at: Line:75 in 
Memory overview

[ ALLOC_DEFAULT ] used: 1907124437B | peak: 0B | reserved: 1925981589B 
[ ALLOC_TEMP_JOB ] used: 0B | peak: 0B | reserved: 6291456B 
[ ALLOC_TEMP_BACKGROUND_JOB ] used: 0B | peak: 0B | reserved: 1048576B 
[ ALLOC_GFX ] used: 1430821770B | peak: 0B | reserved: 1435984690B 
[ ALLOC_CACHEOBJECTS ] used: 37757524B | peak: 0B | reserved: 48866312B 
[ ALLOC_TYPETREE ] used: 0B | peak: 0B | reserved: 0B 
[ ALLOC_TEMP_THREAD ] used: 0B | peak: 0B | reserved: 5144576B 
Could not allocate memory: System out of memory!
Trying to allocate: 907218B with 16 alignment. MemoryLabel: WebRequest
Allocation happened at: Line:75 in 
Memory overview

[ ALLOC_DEFAULT ] used: 1907124437B | peak: 0B | reserved: 1925981589B 
[ ALLOC_TEMP_JOB ] used: 0B | peak: 0B | reserved: 6291456B 
[ ALLOC_TEMP_BACKGROUND_JOB ] used: 0B | peak: 0B | reserved: 1048576B 
[ ALLOC_GFX ] used: 1430821770B | peak: 0B | reserved: 1435984690B 
[ ALLOC_CACHEOBJECTS ] used: 37757524B | peak: 0B | reserved: 48866312B 
[ ALLOC_TYPETREE ] used: 0B | peak: 0B | reserved: 0B 
[ ALLOC_TEMP_THREAD ] used: 0B | peak: 0B | reserved: 5144576B 

 
(Filename:  Line: 1161)

DynamicHeapAllocator out of memory - Could not get memory for large allocation 2745603!
Could not allocate memory: System out of memory!
Trying to allocate: 2745603B with 16 alignment. MemoryLabel: Texture
Allocation happened at: Line:75 in 
Memory overview

[ ALLOC_DEFAULT ] used: 1907116681B | peak: 0B | reserved: 1925981589B 
[ ALLOC_TEMP_JOB ] used: 0B | peak: 0B | reserved: 6291456B 
[ ALLOC_TEMP_BACKGROUND_JOB ] used: 0B | peak: 0B | reserved: 1048576B 
[ ALLOC_GFX ] used: 1430821818B | peak: 0B | reserved: 1435984690B 
[ ALLOC_CACHEOBJECTS ] used: 37757524B | peak: 0B | reserved: 48866312B 
[ ALLOC_TYPETREE ] used: 0B | peak: 0B | reserved: 0B 
[ ALLOC_TEMP_THREAD ] used: 64B | peak: 0B | reserved: 5144576B 
Could not allocate memory: System out of memory!
Trying to allocate: 2745603B with 16 alignment. MemoryLabel: Texture
Allocation happened at: Line:75 in 
Memory overview

[ ALLOC_DEFAULT ] used: 1907116681B | peak: 0B | reserved: 1925981589B 
[ ALLOC_TEMP_JOB ] used: 0B | peak: 0B | reserved: 6291456B 
[ ALLOC_TEMP_BACKGROUND_JOB ] used: 0B | peak: 0B | reserved: 1048576B 
[ ALLOC_GFX ] used: 1430821818B | peak: 0B | reserved: 1435984690B 
[ ALLOC_CACHEOBJECTS ] used: 37757524B | peak: 0B | reserved: 48866312B 
[ ALLOC_TYPETREE ] used: 0B | peak: 0B | reserved: 0B 
[ ALLOC_TEMP_THREAD ] used: 64B | peak: 0B | reserved: 5144576B 

 
(Filename:  Line: 1161)

DynamicHeapAllocator allocation probe 1 failed - Could not get memory for large allocation 2745603.
A crash has been intercepted by the crash handler. For call stack and other details, see the latest crash report generated in:
 * C:/Users/USER~1/AppData/Local/Temp/MonJeu/Jeu/Crashes
DynamicHeapAllocator allocation probe 1 failed - Could not get memory for large allocation 907218.
DynamicHeapAllocator allocation probe 2 failed - Could not get memory for large allocation 907218.
DynamicHeapAllocator allocation probe 2 failed - Could not get memory for large allocation 2745603.
DynamicHeapAllocator allocation probe 3 failed - Could not get memory for large allocation 2745603.
DynamicHeapAllocator allocation probe 3 failed - Could not get memory for large allocation 907218.
DynamicHeapAllocator allocation probe 4 failed - Could not get memory for large allocation 2745603.
DynamicHeapAllocator allocation probe 4 failed - Could not get memory for large allocation 907218.

Avatar de l’utilisateur
Max
Messages : 8764
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Chargement de textures, out of memory après convertion Js> C#

Message par Max » 02 Mars 2019 21:37

Pas simple comme cela de donner une réponse.
Place dans ton code des Log, surtout sur les éventuels dépassements d'index sur tes multiples tableaux. Idem sur les materials de ton Renderer.
Procède aussi par étape, shunte déjà la partie foreach() dans ta coroutine par exemple pour mieux circonscrire l'origine du soucis.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Silverglade
Messages : 264
Inscription : 04 Août 2012 17:52

Re: [DB-AL] Chargement de textures, out of memory après convertion Js> C#

Message par Silverglade » 02 Mars 2019 23:01

J'ai fais un debug.log pour voir le nombre de passage dans la boucle for ça m'affiche 56 fois 11 textures... c'est déjà pas normal ??

Edit: j'ai ralenti la boucle, ca me met entre chaque ligne 56 d'un coup je comprends pas :O

Edit2: en fait grosse erreur de débutant...
Le script est censé pouvoir être mis sur plusieurs objets, ce qui est le cas, 56 apparemment, donc il charge autant de fois les textures... pas étonnant que ca surcharge!

Je pense que c'est ça!
Faut donc que je centralise le chargement sur 1 script et utilise mon outil en récupérant les données chargées sur celui ci ?
En tableaux static ce serait trop lourd non ? Ou accéder au script directement ?

Edit3: J'ai testé en séparant les scripts, ça crash beaucoup moins mais ca crash toujours de façon aléatoire au bout de 3/4 fois, la je cale...

Avatar de l’utilisateur
Silverglade
Messages : 264
Inscription : 04 Août 2012 17:52

Re: [DB-AL] Chargement de textures, out of memory après convertion Js> C#

Message par Silverglade » 03 Mars 2019 00:25

J'ai regardé le profiler, nouveau soucis. Chaque fois que je recharge la scène, donc le script, tout reste en mémoire!
Du coup ben il rajoute tout à chaque fois comme si c'était la première fois...
Image

Y'a un moyen de nettoyer la mémoire après un scene unload ? :/
J'ai lu des trucs sur System.GC.collect() mais ça donne rien du tout, d'autres trucs sur les "= new" genre "myPaths = new string[]".
Que les tableaux sont rechargés en tant que nouveaux au lieu d'être réutilisés.

Avatar de l’utilisateur
Max
Messages : 8764
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Chargement de textures, out of memory après convertion Js> C#

Message par Max » 03 Mars 2019 11:29

Hello,

Normalement, quand tu fais un LoadScene, les ressources utilisées par l'ancienne scène sont libérées.
Doc comment tu gères tes changements de scènes ? Y-a-t-il des éléments persistant ?
On voit que le nombre d'objets augmente d'une scène à l'autre (comme le nombre de materials, ce qui parait logique).
Donc que les ressources employées d'une scène à l'autre augmentent aussi parait logique.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Silverglade
Messages : 264
Inscription : 04 Août 2012 17:52

Re: [DB-AL] Chargement de textures, out of memory après convertion Js> C#

Message par Silverglade » 03 Mars 2019 12:27

Bonjour bonjour,

Oui effectivement j'ai vu qu'avec LoadScene ça résoud le problème, sauf que j'avais une scène principale sur laquelle se loadait/unloadait d'autres scènes en Additive:

Code : Tout sélectionner

 
 public void Load (int sceneName) {
	if (!SceneManager.GetSceneByBuildIndex(sceneName).isLoaded)
	{
		SceneManager.LoadScene(sceneName,LoadSceneMode.Additive);
	}
}

public void Unload(int sceneName)
{
	if (SceneManager.GetSceneByBuildIndex(sceneName).isLoaded)
	{
		SceneManager.UnloadSceneAsync(sceneName);
	}
}
Je suppose que c'était le fait que ce soit Additive?
Dans tous les cas du coup j'ai séparé ma scène principale en 2 pour pouvoir faire un LoadScene justement, le problème est indirectement résolu lol
Je devais finir par le faire de toute façon donc maintenant que c'est fait...
J'ai lu sans essayer que dans le cas d'un chargement additive il faut unload en détruisant tous les objets avant.. chelou.
Mais c'est curieux de pas pouvoir gérer la mémoire soit même, comment font les gros jeux omme gta v ?

Avatar de l’utilisateur
Max
Messages : 8764
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Chargement de textures, out of memory après convertion Js> C#

Message par Max » 03 Mars 2019 13:44

Silverglade a écrit :
03 Mars 2019 12:27
Mais c'est curieux de pas pouvoir gérer la mémoire soit même, comment font les gros jeux omme gta v ?
je crois que c'est surtout une histoire de gestion de ressources. Et c'est à toi d'affiner la chose. Par exemple, toutes ces textures que tu charges sont elles toutes utiles en permanence ? n'y-a-t-il pas de doublon aussi ? etc...
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Répondre

Revenir vers « (C#) CSharp »