IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

thread et fichier ?


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Par défaut thread et fichier ?
    Bonjour,

    Je souhaite trouver une façon pour charger des données d'un fichier assez lourd de façon répétitive. Elles sont ensuite utilisées pour être affichées (coordonnées, normales etc... ) par openGL. Il y a plusieurs milliers de données à chaque fois.
    Là, j'utilise un appel de fonction classique, et évidemment ce n'est pas très fluide (quoique acceptable), c'est vraiment le chargement du fichier le facteur ralentissant et non l'affichage.


    J'ai deux questions :
    - Je voudrais bien utiliser un thread mais je ne sais si c'est une bonne idée car ces données vont être affichées, il va y avoir partage de tableaux à moins de faire des doublons??
    - Et aussi je ne vois pas comment attendre que les données soient complètement chargées avant de les faire afficher.

    Merci pour vos conseils

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    J'ai du mal à comprendre.
    Les données sont-elles chargées plusieurs fois ou une seule fois ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Tu voudrais commencer à charger les données, afficher les données que tu viens de charger tout en continuant de charger celles qui n'ont pas été chargées du fichier ?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Par défaut
    Rebonjour,

    Je vais essayer d'être plus clair.
    Il s'agit d'afficher un terrain de très grande taille en dynamique.

    A chaque passage, je calcule le frustrum view (valeurs limites vues par la camera) que je transcris en un rectangle, facile à afficher.
    S'il change par rapport au frame précédent et bien je recharge les données correspondantes dans mon fichier plat.
    A titre d'info, pour un terrain de 1000*1000 (petit terrain), le fichier fait déjà 23Mo.
    La taille du fichier n'influe pas sur les performances (ou si peu).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    // Calcul du frustum de la vue
    void Map :: calculateFrustrum() 
    {   			
        static bool init_frustrum = true; // Indique si c'est le premier passage
     
        // Calcul du frustrum 
        /**********************************/
     
        // Si changement de vue ou premier passage 	
     
           if (c_ext != this->extremum || init_frustrum)
          {
                      // Nouveaux extremum et chargement des données                
                       this->extremum = c_ext;  // nouveau frustrum
                       loadDataFromFile();
    	         init_frustrum = false;    // ce n'est plus le premier passage  
           }				
    }
     
     
    // Chargement des données (vertices/ normales) et calculs (couleurs etc..)
    void Map :: loadDataFromFile()
    {
        // Ouverture du fichier en lecture
        std::ifstream r_file("datamap.m3d",std::ios_base::binary);
     
        // Lectures des valeurs du fichier
        // x_min, x_max, z_min, z_max viennent du frustrum
        for (Uint32 z = z_min; z< z_max; ++z)      
        {
    	     Uint32 first_value = z*MAP_SIZE + x_min;
     
    	    // Les coordonnées d'abord     	   	    	      
                      r_file.seekg(3*sizeof(GLfloat)*first_value,std::ios_base::beg);
       	     r_file.read(reinterpret_cast<char*>(&this->vertices[3*delta_x*
                     (z-z_min)]),3*sizeof(GLfloat)*delta_x);  	 	   
     
    	    // Ensuite les normales qui sont en fin de fichier
    	    r_file.seekg(3*sizeof(GLfloat)*first_value + 3*sizeof(GLfloat)
                     *MAP_SIZE*MAP_SIZE,std::ios_base::beg);
       	     r_file.read(reinterpret_cast<char*>(&normals[3*delta_x*
                     (z-z_min)]),3*sizeof(GLfloat)*delta_x);  	 	      	
       }
     
        r_file.close();
     
     
              // Calculs de couleurs, d'indices etc...
              /******************************/
     
    }

    Les calculs ne ralentissent pas trop, ni l'affichage (j'utilise les vertex array avec indices)

    Le facteur limitant est vraiment le chargement du fichier, pourtant j'essaie d'y accéder le moins possible quitte à charger plus de points.
    C'est la boucle notamment, il peut y avoir 600 accès pour charger les coordonnées (vertices) et les normales (normals).


    J'ai essayé par thread (et de mettre les calculs dans une autre fonction) mais j'ai eu des plantages et je suis obligé de faire deux tableaux de vertices, deux tableaux de couleurs, deux tableaux de textures etc...
    (ou surtout je m'y prends comme une m****).

    L'idée est effectivement de pouvoir afficher mes anciennes données tout en chargeant les nouvelles ... En faisant attention de ne pas lancer deux chargements en même temps.

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je ne connais pas ton environnement de travail mais si c'est du Microsoft, tu pourrais essayer de mapper ton fichier d'entrée en mémoire.

    Les temps d'accès sont alors considérablerment meilleurs.

    Quelques pointeurs:
    * CreateFileMapping()
    * MapViewOfFile()
    * UnmapViewOfFile()

    Attention, c'est des fonctions de l'API Microsoft
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 10
    Par défaut
    Non, ce pas du microsoft, en fait j'aimerai bien que ça tourne sur Linux aussi . Je n'utilise que des librairies style SDL etc...

    En gros tu me conseilles d'ordonner mon fichier, un peu comme une BD ?
    C'est une idée que j'ai aussi, en fait partitionner ma grosse map en plusieurs sous parties dans mon fichier.
    Et au lieu de faire mes requêtes, je me positionnerai à l'endroit souhaité et je chargerait tout le paquet en un coup (au lieu de boucler).

    Les deux avantages sont :
    - Pas besoin de recharger à chaque frame, il suffit de dépaser les valeurs critiques.
    - Une super fluidité

    Deux gros inconvénients :
    - Ca va bouffer plus de RAM (de 20Mo à 60Mo .... ) j'ai testé avec un gros paquet de 1000*1000 pixels (lol).
    - Un fichier énorme car évidemment certaines données seront redondantes (pour gérer les bords de mes partitions). Bon, est-ce-gênant?


    Je vais tester plus en approfondi, je vais vraiment laisser tomber les threads pour ce genre d'actions (rofl).

    Merci

Discussions similaires

  1. Thread et fichiers wave
    Par olivier.a dans le forum OpenAL
    Réponses: 4
    Dernier message: 20/04/2011, 13h18
  2. Thread,suppression fichier et JFrame
    Par franckywood dans le forum Agents de placement/Fenêtres
    Réponses: 20
    Dernier message: 09/08/2007, 16h13
  3. Appli multi threading et fichiers de log
    Par lucho31 dans le forum Langage
    Réponses: 0
    Dernier message: 26/07/2007, 23h01
  4. [Thread] écriture d'un fichier de façon asynchrone
    Par Sergejack dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 08/08/2006, 02h22
  5. Fichier ecrit par un Thread et lu par un autre Thread
    Par Fladnag dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/04/2004, 14h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo