Frage

Hintergrund: Ich bin mit dem SlimDX C # Wrapper für DirectX und ziehe viel 2D-Sprites der Sprite-Klasse (traditionell aus der Direct3DX Erweiterung in dem zugrunde liegenden dlls). Ich zeichne auf einmal mehrere Hunderte von Sprites auf den Bildschirm, und die Leistung ist super - auf meinem Quad-Core, es so etwas wie 3-6% des Prozessors für mein gesamtes Spiel ist verwenden, einschließlich Logik für 10.000+ Objekte, ai Routinen auf einem zweiten Thread, etc, etc. so klar das Sprites mit voller Hardwarebeschleunigung zeichnen werden, und alles ist wie es sein sollte.

Ausgabe: Das Problem kommt, wenn ich anfangen, Anrufe an die Line-Klasse einzuführen. Sobald I 4 Linien zeichnen (für eine Auswahlbox drag), Prozessornutzung skyrockets zu 13-19%. Dies ist mit nur vier Zeilen!

Dinge, die ich versucht habe:

  1. Dreh Linie Anti-Aliasing aus- und einschalten.
  2. Drehen GLLines aus- und einschalten.
  3. Manuelles Aufrufen der line.begin und line.end um meine Anrufe zu ziehen.
  4. ruft alle Weglassen line.begin und line.end.
  5. Sicherstellen, dass meine Anrufe innerhalb eines sprite.begin / sprite.end Block line.draw nicht.
  6. Beim line.draw innerhalb eines sprite.begin / sprite.end Block.
  7. Rendering 4 Zeilen oder 300 zu machen.
  8. alle Sprite und Text-Rendering ausschalten und nur die Zeile für 4 Zeilen Rendering verlassen (um zu sehen, ob dies eine Art Modusänderung Problem ist).
  9. Die meisten Kombinationen der oben genannten.

In der Regel keines dieser hatte einen signifikanten Einfluss auf die Leistung. # 3 reduziert die Prozessorauslastung von vielleicht 2%, aber selbst dann ist es noch 8% oder mehr höher als es sein sollte. Das seltsamste ist, dass # 7 von oben absolut Null Auswirkungen auf die Leistung hatte - mit 4 Zeilen genauso langsam war, wie es mit 300. Das einzige, was war, was ich herausfinden kann, dass dies aus irgendeinem Grund in Software ausgeführt wird, und / oder dass es die Grafikkarte verursacht ständig hin und her wechselt zwischen einer Art Zeichenmodi.

Matrix Ansatz:

Wenn jemand einer Lösung für das oben genannte Problem weiß, dann würde ich gerne hören!

Aber ich bin unter der Annahme, dass dies nur ein Problem innerhalb von directx im Allgemeinen sein könnte, also hat mich eine anderen Weg verfolgt - meine eigene Sprit-basierte Linie zu machen. Im Grunde habe ich ein 1px weißes Bild bekam, und ich bin die diffuse Farbe, und transformiert die Linien zu zeichnen. Dies funktioniert, Performance-weise -. 300 der „Linien“ wie diese Zeichnung bringt mich in dem 3-6% Prozessorauslastung Leistungsbereich, die mir für meine Quad-Core-Suche

Ich habe zwei Probleme mit meiner Pixel-stretch-Übertragungstechnik, die ich hoffe, dass jemand mehr Wissen über Transformationen mit mir helfen kann. Hier ist mein aktueller Code für eine horizontale Linie:

    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 );
    }

Das funktioniert, soweit es Linien meist die richtige Größe zieht an meist die richtige Position auf dem Bildschirm. Allerdings scheinen die Dinge nach rechts verschoben, was seltsam ist. Ich bin nicht ganz sicher, ob meine Matrix Ansatz richtig gar ist: Ich möchte nur horizontal um einen Betrag von Pixeln ein 1x1-Sprite skalieren, und einen anderen Betrag in vertikaler Richtung. Dann muss ich in der Lage, sie zu positionieren - durch den Mittelpunkt ist in Ordnung, und ich denke, das ist, was ich zu tun haben, aber wenn ich es von oben links positionieren könnte, die noch besser sein würde. Dies scheint ein einfaches Problem, aber mein Wissen von Matrizen ist ziemlich schwach.

Dies würde sich rein horizontalen und rein vertikalen Linien für mich zu arbeiten, die den größten Teil der Schlacht ist. Ich könnte damit leben nur, und eine andere Art von Grafik an Orten, die ich zur Zeit gewinkelten Linien mit bin. Aber es wäre wirklich schön, wenn es eine Möglichkeit für mich ist, Linien zu zeichnen, die diesen gestreckte Pixel Ansatz angewinkelt verwenden. Mit anderen Worten, eine Linie von 1,1 bis 7,19, zum Beispiel ziehen. Mit Matrix Rotation, etc, so scheint es so möglich ist, aber ich weiß nicht, wo man auch andere beginnt als zu raten undÜberprüfung, die für immer dauern würde.

Jede und alle Hilfe ist sehr willkommen!

War es hilfreich?

Lösung

es klingt wie ein Pipeline-Stall. Sie Umschalten einig Modus zwischen Sprites Rendering und Rendering-Linien, dass zwingt die Grafikkarte ihre Pipeline zu leeren, bevor mit dem neuen primitiven beginnen.

Bevor Sie die Zeilen hinzugefügt wurden diese Sprites alles, was Sie gemacht, oder gab es auch andere Elemente auf dem Bildschirm, die bereits andere Modi?

Andere Tipps

Okay, ich habe es geschafft, nach vielen Experimenten horizontale Linien zum Laufen zu bringen. Dies funktioniert ohne den seltsamen Aufrechnungs ich vorher sah; Das gleiche Prinzip wird auch für vertikale Linien arbeiten. Dies hat in beträchtlichem Ausmaß eine bessere Leistung als die Linienklasse, so ist dies, was werde ich für horizontale und vertikale Linien werden. Hier ist der 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 );
    }

Ich mag eine Version davon haben, die für die Linien in einem Winkel funktionieren würden, auch (wie oben erwähnt). Irgendwelche Vorschläge für das?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top