Question

Arrière-plan: J'utilise l'encapsuleur SlimDX C # pour DirectX et je dessine de nombreux sprites 2D à l'aide de la classe Sprite (généralement à partir de l'extension Direct3DX dans les dll sous-jacentes). Je dessine plusieurs centaines d'images-objets à la fois, et les performances sont impressionnantes. Sur mon quad core, il utilise environ 3 à 6% du processeur pour l'ensemble de mon jeu, y compris la logique pour plus de 10 000 objets. routines sur un deuxième thread, etc., etc. Ainsi, les images-objets s’apparaissent clairement en utilisant une accélération matérielle complète, et tout est comme il se doit.

Problème: Le problème survient lorsque je commence à introduire des appels dans la classe Line. Dès que je dessine 4 lignes (pour une boîte de sélection de glisser), l'utilisation du processeur monte en flèche à 13-19%. C’est avec seulement quatre lignes!

Ce que j'ai essayé:

  1. Activer et désactiver l'anticrénelage de ligne.
  2. Activer et désactiver GLLines.
  3. Appeler manuellement line.begin et line.end autour de mes appels pour dessiner.
  4. Omettre tous les appels à line.begin et line.end.
  5. Assurez-vous que mes appels à line.draw ne figurent pas dans un bloc sprite.begin / sprite.end.
  6. Appel de line.draw dans un bloc sprite.begin / sprite.end.
  7. Rendu de 4 lignes ou de 300.
  8. Désactiver tous les rendus d'image-objet et de texte, et laisser le rendu de ligne pendant 4 lignes (pour voir s'il s'agissait d'une sorte de problème de changement de mode).
  9. La plupart des combinaisons de ce qui précède.

En général, aucun d’entre eux n’a eu d’impact significatif sur les performances. N ° 3 réduit l'utilisation de processeur de peut-être 2%, mais même dans ce cas, il reste 8% ou plus supérieur à ce qu'il devrait être. Le plus étrange, c’est que le numéro 7 d’en haut n’avait absolument aucun impact sur les performances - il était tout aussi lent avec 4 lignes que avec 300. La seule chose que je peux comprendre, c’est que cela est exécuté dans le logiciel pour une raison quelconque, et / ou que la carte graphique change continuellement de mode de dessin.

Approche matricielle:

Si quelqu'un connaît une solution au problème ci-dessus, j'aimerais bien l'entendre!

Mais je suppose que cela pourrait n'être qu'un problème au sein de directx en général, alors je me suis lancé dans une autre voie: créer ma propre ligne basée sur les sprites. En gros, j'ai une image blanche de 1 px, et j'utilise la couleur diffuse et se transforme pour tracer les lignes. Cela fonctionne, en termes de performances - dessiner 300 des "lignes". comme cela me place dans la plage de performances d'utilisation du processeur de 3 à 6% que je recherche sur mon quad core.

J'ai deux problèmes avec ma technique de pixel-stretch line, pour laquelle j'espère que quelqu'un de plus informé sur les transformations pourra m'aider. Voici mon code actuel pour une ligne horizontale:

    public void DrawLineHorizontal( int X1, int X2, int Y, float HalfHeight, Color Color )
    {
        float width = ( X2 - X1 ) / 2.0f;
        Matrix m = Matrix.Transformation2D( new Vector2( X1 + width, Y ), 0f, new Vector2( width, HalfHeight ),
            Vector2.Zero, 0, Vector2.Zero );
        sprite.Transform = m;

        sprite.Draw( this.tx, Vector3.Zero, new Vector3( X1 + width, Y, 0 ), Color );
    }

Cela fonctionne, dans la mesure où il trace des lignes de la bonne taille pour la plupart au bon endroit sur l’écran. Cependant, les choses semblent décalées vers la droite, ce qui est étrange. Je ne suis pas tout à fait sûr si mon approche matricielle est correcte: je veux simplement redimensionner un sprite 1x1 avec une quantité de pixels horizontale et une quantité différente verticalement. Ensuite, je dois être capable de les positionner - le centre est parfait, et je pense que je devrai le faire, mais si je pouvais le positionner en haut à gauche, ce serait encore mieux. Cela semble être un problème simple, mais ma connaissance des matrices est plutôt faible.

Cela donnerait des lignes purement horizontales et purement verticales, ce qui représente l'essentiel de la bataille. Je pourrais vivre avec cela, et utiliser une autre sorte de graphique dans des endroits où j'utilise actuellement des lignes inclinées. Mais ce serait vraiment bien s'il y avait un moyen pour moi de dessiner des lignes qui sont inclinées en utilisant cette approche de pixels étendus. En d’autres termes, tracez une ligne de 1,1 à 7,19, par exemple. Avec la rotation de la matrice, etc., il semble que cela soit réalisable, mais je ne sais même pas par où commencer, à part deviner et vérifier

Était-ce utile?

La solution

cela ressemble à un décrochage de pipeline. Vous passez d’un mode à l’autre entre le rendu des images-objets et les lignes de rendu, ce qui oblige la carte graphique à vider son pipeline avant de commencer par la nouvelle primitive.

Avant l'ajout des lignes, ces images-objets étaient-ils entièrement restitués ou y avait-il d'autres éléments à l'écran, utilisant déjà d'autres modes?

Autres conseils

D'accord, j'ai réussi à faire fonctionner les lignes horizontales après de nombreuses expériences. Cela fonctionne sans le décalage étrange que je voyais auparavant; le même principe fonctionnera également pour les lignes verticales. Cela a largement de meilleures performances que la classe de lignes, c'est donc ce que je vais utiliser pour les lignes horizontales et verticales. Voici le code:

    public void DrawLineHorizontal( int X1, int X2, int Y, float HalfHeight, Color Color )
    {
        float width = ( X2 - X1 );
        Matrix m = Matrix.Transformation2D( new Vector2( X1, Y - HalfHeight ), 0f, new Vector2( width, HalfHeight * 2 ),
            Vector2.Zero, 0, Vector2.Zero );
        sprite.Transform = m;

        sprite.Draw( this.tx, Vector3.Zero, new Vector3( X1, Y - HalfHeight, 0 ), Color );
    }

J'aimerais aussi avoir une version qui conviendrait aux lignes inclinées (comme mentionné ci-dessus). Des suggestions pour ça?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top