Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > Moteurs de jeux vidéo > XNA
XNA Forum d'entraide sur le développement avec XNA
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/05/2012, 00h00   #1
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
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.
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2012, 10h56   #2
MoDDiB
Membre chevronné
 
Homme
Développeur de jeux vidéo
Inscription : février 2006
Messages : 451
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 : 451
Points : 698
Points : 698
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/
MoDDiB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2012, 11h09   #3
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
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
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2012, 11h25   #4
MoDDiB
Membre chevronné
 
Homme
Développeur de jeux vidéo
Inscription : février 2006
Messages : 451
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 : 451
Points : 698
Points : 698
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/
MoDDiB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2012, 11h36   #5
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
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.
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2012, 15h45   #6
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
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.
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2012, 16h47   #7
MoDDiB
Membre chevronné
 
Homme
Développeur de jeux vidéo
Inscription : février 2006
Messages : 451
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 : 451
Points : 698
Points : 698
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/
MoDDiB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2012, 17h03   #8
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
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 :
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 :
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?
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2012, 18h57   #9
MoDDiB
Membre chevronné
 
Homme
Développeur de jeux vidéo
Inscription : février 2006
Messages : 451
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 : 451
Points : 698
Points : 698
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.

Citation:
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.

Citation:
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/
MoDDiB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2012, 19h06   #10
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
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...
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2012, 22h40   #11
MoDDiB
Membre chevronné
 
Homme
Développeur de jeux vidéo
Inscription : février 2006
Messages : 451
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 : 451
Points : 698
Points : 698
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/
MoDDiB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2012, 23h06   #12
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
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
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2012, 14h09   #13
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
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.
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2012, 15h27   #14
MoDDiB
Membre chevronné
 
Homme
Développeur de jeux vidéo
Inscription : février 2006
Messages : 451
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 : 451
Points : 698
Points : 698
Citation:
Pour recoder le spritebatch.Draw tu fais ca avec Graphics.DrawUserIndexedPrimitive?
Oui et une caméra ortho

Citation:
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.

Citation:
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

Citation:
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/
MoDDiB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2012, 16h44   #15
saturn1
Membre confirmé
 
Inscription : janvier 2008
Messages : 576
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 576
Points : 258
Points : 258
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.
saturn1 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h17.


 
 
 
 
Partenaires

Hébergement Web