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

Java Discussion :

Problème de chargement de données


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  
    Inscrit en
    Mai 2012
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 78
    Par défaut Problème de chargement de données
    Bonjour, je suis en train de coder un petit moteur de jeu de type voxel, à un moment je dois charger des données, et ça me prend entre 20 et 100 ms, sauf que dès fois pour un même jeu de données j'ai un temps de 100ms ou + 1000ms le problème ne vient pas de mon algo car c'est les mêmes données, est-ce un problème de swap, je charge dans ma mémoire environ +1Go au départ et ce nombre n'augmente normalement plus il est capé on va dire

  2. #2
    Membre Expert
    Avatar de olivier.pitton
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2012
    Messages : 355
    Par défaut
    La première fois que tu fais le chargement depuis le disque, les données (les blocs disque) ne sont pas en mémoire (pas plus que les i_nodes etc...) donc cela prend plus de temps que les fois d'après. Cela peut expliquer la différence de temps. De même si tu fais tourner plus de processus, alors ta machine ira moins vite, ne serait-ce qu'à cause des commutations de contexte etc...

  3. #3
    Inactif  
    Inscrit en
    Mai 2012
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 78
    Par défaut
    en fait mes données je les ai avec un bruit de perlin j'ai chargé au début de mon programme ces données et là j'ai 100 ms ensuite au cours de mon programme pour le même jeu de données le temps de chargement peu être plus long ça dès fois il le fais en 100 ms et autrement en + de 1000 ms ...

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Beaucoup de chose interviennent dans ton cas, surtout si tu ne fait le chargement qu'une fois par lancement de l'application:

    1) le données peuvent ou non être déjà dans le cache du système d'exploitation, ce qui implique plus ou moins d'accès disque
    2) Il peux y avoir trop peu de mémoire libre, obligeant le système d'exploitation à préalablement swapper d'autres données
    3) lors du démarrage de ton application, le compilateur jit de java entre en jeu. Il identifie par heurisitiques les parties de ton code java les plus solicitée et fait une compilation native de ces parties pour qu'elles aillent plus vite. D'une run à l'autre, à cause de légère variations dans le contexte, il peux choisir d'autres voies d'optimisation, et donc parfois se planter, ce qui implique aucun gain de perfs
    4) les vitesse du disque dur:

    d'après tom's hardware, tests de 2012,
    * un Western Digital VelociRaptor WD1000DHTZ (1 TB, 10,000 rpm, SATA 6 Gbit/s) a une vitesse de lecture moyenne de 164MB/s.
    * un SSD Samsung 840 Pro 512 GB, MDX monte à 390MB/s


    Pour charger 1G, il te faudrait, en l'absence de cache du système d'exploitation, entre 2 et 8 secondes donc!


    EDIT: si les données sont aléatoire (pas lues depuis un fichier) et que tu fais plusieurs run dans la même jvm, alors la différence est à chercher dans le garbage collector. Les données dont tu n'a plus besoin doivent être virée, le GC a besoin de travailler. Comme le GC c'est une grosse fadasse, il empile dans une coin les trucs à jeter et, c'est quand il est coincé avec plus de place nulle part qu'il se décide à sortir ses poubelle, d'où le ralentissement ^^.

    Tu peux atteindre plus de stabilité dans les performance, si ce n'est pas déjà le cas, en forcant ta jvm à travailler en mode "server". Elle est pas plus performante sur le long terme, mais elle tente d'éviter les gros "gel" du au GC afin de garantir une certaine réactivité (au prix d'autres sacrifices)

  5. #5
    Inactif  
    Inscrit en
    Mai 2012
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 78
    Par défaut
    bon j’exécute en mode serveur bon j'ai réduit de moitié mon problème j'étais à + de 1700 ms maintenant je suis à environ 900 ms c'est toujours trop ...

    Je code un moteur de jeu basé sur les voxels et là en fait je m'occupe du chargement des chunks quand le joueur se déplace, un toutes les frames et 0.9s c'est assez long dans un jeu vidéo je ne connais pas trop le gc bon je sais à quoi il sert comment il fonctionne un minimum, on peut le paramétrer




    edit ::::

    Bon j'ai lancé jconsole et j'ai regardé du côté de la mémoire, les baisses de mon fps correspondent au déchargement de la mémoire du coup y a t'il un moyen de dire au gc de la décharger dès que possible et non atteindre un seuil et se mettre au boulot ?

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Non, de toutes facons ca ne résoudrais pas ton problème., a lieu d'avoir 0.9s de temps en temps t'aurais une perte de temps constante. Pour le gc, travailler pour libérer 5 objets ou 50.000 objet, le temps de travail est similaire. Ton problème ici c'est que tu passe ton temps à allouer, désallouer. Normalement, je suppose, tu garde une quantité constante de données à afficher, donc il vaudrait mieux jouer sur la réutilisation des chunks, plutot que de les dropper et d'en créer de nouveau. Je suppose qu'un "chunk", c'est un byte[] ou un truc du genre?

    Tu pourrais aussi nous montrer comment tu gère ta structure de donnée qu'on vois ce qui pose problème

  7. #7
    Inactif  
    Inscrit en
    Mai 2012
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 78
    Par défaut
    ben en fait j'ai presque résolu mon problème j'ai utilisé CMS collector, en clair c'est comme le gc normal mais avec des threads ... et du coup j'ai des petits lags mais pas trop gênant

    Alors sinon un Chunk ben c'est un Objet il a plusieurs attributs :

    private Block[][][] blocks; // de taille CHUNK_SIZEY*CHUNK_SIZEXZ*CHUNK_SIZEXZ

    public static int CHUNK_SIZEY;
    public static int CHUNK_SIZEXZ;

    private int []vboId; // pour l'utilisation des VBO (c'est de l'opengl bref) taille 16

    private int x,z; // la position du chunk dans le monde

    private ArrayList<ArrayList<float[]>> ls; // le maillage du chunk

    private int [] nb_polygons; // .... taille 16

    constructeur, get et set + 8 méthodes


    Donc pour Block :

    private boolean active;
    private BlockType type;

    constructeur, get et set

    BlockType une enumération ...


    la taille max d'un Chunk c'est 16*16*(256) Block, c'est pour ça Block faut pas qu'il soit trop grand sinon ça va pas être terrible niveau mémoire .
    Ensuite je génère 21*21 Chunk (c'est là les +1Go) je peux pas en afficher une infinité ... , le joueur est sur le Chunk 11,11 au début et j'affiche ce qu'il faut afficher ... je tourne à 150-200 fps environ.
    Après les 21*21 c'est complètement arbitraire si j'ai 16 Go de ram je veux bien partir sur du 100*100 ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/01/2012, 18h39
  2. Réponses: 2
    Dernier message: 21/10/2011, 12h31
  3. Problème de chargement des données !
    Par otyv84 dans le forum Silverlight
    Réponses: 6
    Dernier message: 20/01/2011, 09h55
  4. Problème de chargement de données avec mon dataTable
    Par sobjp2025 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 30/04/2009, 21h43
  5. [DOM] Chargement de données dans fichier XML ?
    Par titoc dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 01/06/2008, 12h31

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