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

XNA/Monogame Discussion :

Loading thread et SpriteBatch.Draw


Sujet :

XNA/Monogame

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut Loading thread et SpriteBatch.Draw
    Bonjour, j'utilise un thread pour charger le content de la scene.

    Le soucis c'est que une fois sur 50 SpriteBatch.End() plante avec une invalid operation exception.
    Mais ce qui m'enerve le plus c'est que le thread qui load le content est dans un etat de sleep a ce moment (car il y a un content manager locked)

    En gros j'ai le main thread qui draw et qui plante sur le sb.end() et le loading thread qui est dans un etat de sleep...

    Avez vous deja eu a faire a ce genre de probleme.
    Quelle est la bonne maniere pour debugger cela.

    Merci.

  2. #2
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Cette technique a toujours fonctionné pour moi :
    http://blogs.msdn.com/b/shawnhar/arc...nimations.aspx
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut re
    Salut, en faite tu draw l'animation de loading dans le thread de loading ensuite tu appelles Present pour display?

    Car moi je draw le loading depuis le main thread.

    Merci

  4. #4
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Disons qu'en fait le loading se passe dans le thread principale et l'affichage dans un autre thread.
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut
    merci je vais tester cela meme si je crois que ca ne va pas changer grand chose...
    j'essaie de vous tenir au courant lorsque je patche.

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut
    effectivement passer le chargement sur le thread principal c'est bien plus rapide.

    Sur pc je passe de 4 secondes a environ 0.75 seconde.
    (Bon sur pc, la xbox ca reste long...)

    Sinon question perf:
    - pour le draw call, on a un systeme de layer avec chaque layer un scroll speed different. Mais pour chaque layer on a un Sb.begin()/End() different.
    Du coup avec 9 layer je suppose qu'on perd beaucoup en perf?(si vous avez des retours d'experiences sur ce point.)

    Merci.

  7. #7
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Citation Envoyé par saturn1 Voir le message
    effectivement passer le chargement sur le thread principal c'est bien plus rapide.

    Sur pc je passe de 4 secondes a environ 0.75 seconde.
    (Bon sur pc, la xbox ca reste long...)

    Sinon question perf:
    - pour le draw call, on a un systeme de layer avec chaque layer un scroll speed different. Mais pour chaque layer on a un Sb.begin()/End() different.
    Du coup avec 9 layer je suppose qu'on perd beaucoup en perf?(si vous avez des retours d'experiences sur ce point.)

    Merci.
    Oui tu as une perte de perf mais je ne pense pas que celle ci soit significative : si ton jeu tourne à 60 FPS pas de soucis.
    Si par contre tu recherches des performances maximales la première chose à faire est malheureusement de recoder son propre spritebach
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut
    Erf...
    Cette bobox commence vraiment a m'enerver.
    Par exemple je thread l'ia j'ai exactement les meme perf que sans thread.
    Pourtant je fais bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #if XBOX
                Thread.CurrentThread.SetProcessorAffinity( new int[ ] { 3 } );
    #endif
    et j'update le thread de l'ia sur deux fois moins que le thread principale.

    De plus j'ai deux methodes de chargement, une avec des fichiers binaires serializer et une autre avec des fichiers xml mais je met sensiblement le meme temps. Ce qui m'etonne fortement car

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    br.ReadString();
    //devrait etre plus rapide que 
    this.ShaderTechnique = node.FindAttributeValue("ShaderTechnique") != null ? node.FindAttributeValue("ShaderTechnique") : "TexturedNoShading";
    Quand je vois des gros jeux qui tourne sur la xbox en 3d+particules + lights il tourne a 60 ou 30 fps?
    Meme si je pense qu'ils ne sont pas code en c#...

    EDIT: quelle est la methode de profiling la plus indicative, CPU ou temps?

  9. #9
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    La vraie question c'est pourquoi travailles tu avec des threads ?
    Mis à part si tu refais le Cry Engine c'est très rare d'en avoir réellement besoin et le temps gagné à ne pas les utiliser permet de passer du temps sur des vrais optimisations souvent plus utiles.

    Concernant ton chargement il faut profiler plus en détails.

    Quand je vois des gros jeux qui tourne sur la xbox en 3d+particules + lights il tourne a 60 ou 30 fps?
    Meme si je pense qu'ils ne sont pas code en c#...
    Souvent 30 et des fois 60.
    Le problème ne vient pas du C# car sur PC les performances sont bonnes mais surtout du micro framework .net absolument pas adapté à la xbox.

    EDIT: quelle est la methode de profiling la plus indicative, CPU ou temps?
    Personnellement j'affiche le temps, j'ai quasiment un facteur 10 sur le calcul pur entre le temps sur PC et le temps sur Xbox.
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut
    Pour les optis la j'ai fait une passe pour supprimer toutes les string en dur.
    Surtout sur les shader, les Effect.Technique et Effect.Parameters j'ai repasse tout ca en int. ca gagne quelques fps (cool )

    Pour le loading je n'ai quasiment aucune spritesheet que des sprite unique du coup si je passe tout ca en spritesheet je pense pouvoir gagner du temps de chargement...

  11. #11
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Citation Envoyé par saturn1 Voir le message
    Pour le loading je n'ai quasiment aucune spritesheet que des sprite unique du coup si je passe tout ca en spritesheet je pense pouvoir gagner du temps de chargement...
    Moi c'est ça qui m'a sauvé la vie pour les temps de chargement :
    http://easypak.codeplex.com/
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut
    Oai, j'ai pris le packer de xna creator club.

    Merci

    EDIT: on est limite a une taille de 4096 .. dommage, j'aurais foutu tout le content dans une spritesheet

  13. #13
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut
    Pour recoder le spritebatch.Draw tu fais ca avec Graphics.DrawUserIndexedPrimitive?

    Pour la rotation l'origin et l'orgin tu fais ca direct dans le pixelshader avec un peu de math?

    Pour le rectangle source et le scale il faut faire ca au niveau du binding de la texture je suppose.

    Si tu sais dire a la louche cb de % c'est plus performant, meme si je sais que c'est dur d'estimer.

    Merci.

  14. #14
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Pour recoder le spritebatch.Draw tu fais ca avec Graphics.DrawUserIndexedPrimitive?
    Oui et une caméra ortho

    Pour la rotation l'origin et l'orgin tu fais ca direct dans le pixelshader avec un peu de math?
    Il est possible d'envoyer la matrice World avec toutes les informations nécessaires.

    Pour le rectangle source et le scale il faut faire ca au niveau du binding de la texture je suppose.
    Une des possibilités est d'envoyer les uv au vertexshader

    Si tu sais dire a la louche cb de % c'est plus performant, meme si je sais que c'est dur d'estimer.
    Peut être 10-15%, certainement moins ; ça dépends de beaucoup de chose et ça n'a d'intérêt que si tu dessines un nombre extrêmement important d'éléments tout en étant spécifique à tes besoins ( afficher tous les éléments avec la même texture à la suite par exemple si tu te fiches de l'ordre d'affichage sur un même layer )
    Ca permet aussi et surtout une plus grande flexibilité sur des besoins spécifiques.
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  15. #15
    Membre confirmé

    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    786
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 786
    Points : 602
    Points
    602
    Par défaut
    Ok merci,
    moi je n'ai q'environ 40 SpriteBatch.draw par frame, l'espace est partitionne. Donc ce n'est pas enorme.

    Mais bon il faut que je vois si j'ai le temps de recoder, mais bon c'est sur qu'avec un sort.textured on doit gagner encore en perf.

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/05/2014, 23h41
  2. [XNA] SpriteBatch.Draw comment ça marche
    Par DotNET74 dans le forum Windows Phone
    Réponses: 2
    Dernier message: 20/10/2011, 10h47
  3. Multi-thread et lazy loading
    Par mick8569 dans le forum JPA
    Réponses: 1
    Dernier message: 15/02/2010, 18h16
  4. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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