Effiziente Strichzeichnung In Direct3D (Transformation2D?)

Hintergrund: ich bin mit dem SlimDX C# - wrapper für DirectX, und bin der Zeichnung viele 2D-sprites mithilfe der Sprite-Klasse (traditionell aus dem Direct3DX Erweiterung in der zugrunde liegenden dlls). Ich bin Zeichnung mehrere Hunderte von sprites auf dem Bildschirm auf einmal, und die performance ist genial-auf meinem quad-core, es ist mit so etwas wie 3-6% der Prozessor für meine gesamte Spiel, inklusive der Logik für mehr als 10.000 Objekte, die ki-Routinen auf einem zweiten thread, etc, etc. So klar die sprites sind zeichnen, mit voller hardware-Beschleunigung, und alles ist wie es sein sollte.

Heft: Das problem kommt, wenn ich starten Sie die Einführung Aufrufe an die Line-Klasse. Sobald ich zeichne 4 Linien (für eine drag-Auswahl-box), Prozessor-Auslastung schießt in die Höhe, um 13-19%. Dies ist mit nur vier Zeilen!

Dinge, die ich habe versucht:

  1. Dreh-line-antialiasing aus-und einschalten.
  2. Drehen GLLines aus-und einschalten.
  3. Manuell aufrufen der Linie.beginnen und Linie.Ende um meine Anrufe zu zeichnen.
  4. Weglassen, alle Anrufe zu einer Linie.beginnen und Linie.Ende.
  5. Sicherzustellen, dass meine Aufrufe zu einer Linie.ziehen, sind nicht in einem sprite.begin /sprite.end-block.
  6. Calling line.innen zeichnen Sie ein sprite.begin /sprite.end-block.
  7. Rendering 4 Zeilen, oder rendering-300.
  8. Ausschalten alle Sprites und text-rendering, und nur aus dem line-rendering für 4 Zeilen (um zu sehen, ob dies war eine Art von Modus-Wechsel-Problem).
  9. Die meisten Kombinationen der oben genannten.

Im Allgemeinen keines von diesen hatte einen signifikanten Einfluss auf die Leistung. #3 reduziert Prozessor-Auslastung von vielleicht 2%, aber selbst dann ist es immer noch 8% oder mehr höher als es sein sollte. Das seltsamste ist, dass #7 von oben hatte absolut null Auswirkungen auf die Leistung haben -- es war nur langsam mit 4 Zeilen, wie es war mit 300. Das einzige, was ich finden, ist, dass dies ausgeführt wird in der software für einige Grund, und/oder, dass es verursacht die Grafikkarte ständig hin und her wechseln zwischen irgendeine Art von Zeichnung Modi.

Matrix-Ansatz:

Ob jemand weiß eine Lösung, um das oben genannte Problem, dann würde ich es gerne hören!

Aber ich bin unter der Annahme, dass es sich dabei nur um ein Problem innerhalb von directx im Allgemeinen, so habe ich verfolgt, eine andere route-und damit meinen eigenen sprite-basierte Linie. Im wesentlichen habe ich eine 1px weiße Bild, und ich bin mit der diffusen Farbe und verwandelt zum zeichnen der Linien. Dies funktioniert, performance-wise -- Zeichnung 300 von den "Linien", wie dies versetzt mich in die 3-6% Prozessor-Auslastung, performance-Reihe, die ich Suche auf meinem quad-core.

Ich habe zwei Probleme mit meinem pixel-stretch-line-Technik, die ich bin der Hoffnung, dass jemand mehr wissen über Transformationen kann mir helfen. Hier ist meine aktuelle 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 );
    }

Dieser Werke, soweit es zeichnet Linien meist die richtige Größe zu meist die richtige Position auf dem Bildschirm. Doch, die Dinge erscheinen nach rechts verschoben, das ist seltsam. Ich bin mir nicht ganz sicher, ob meine matrix-Ansatz ist richtig: ich möchte nur zu skalieren 1x1 sprite, indem Sie einige Anzahl Pixel horizontal, und einen anderen Betrag vertikal. Dann muss ich in der Lage sein, um Sie zu positionieren -- von der center point ist in Ordnung, und ich denke, das ist, was ich werde zu tun haben, aber wenn ich könnte die position von Links oben, wäre es noch besser. Dies scheint wie ein einfaches problem, aber mein wissen von Matrizen ist ziemlich schwach.

Diese Holen würde, rein horizontal und rein-vertikale Linien, die für mich arbeiten, die meisten von der Schlacht. Könnte ich Leben, nur mit diesem, und verwenden Sie eine andere Art von Grafik in Orten, die ich bin derzeit mit eckigen Linien. Aber es wäre wirklich schön, wenn es ein Weg für mich, um Linien zu zeichnen, die abgewinkelt sind mit diesem gestreckt-pixel-Ansatz. In anderen Worten, ziehen Sie eine Linie von 1,1 bis 7,19, zum Beispiel. Mit matrix-rotation, etc, es scheint, wie das machbar ist, aber ich weiß nicht, wo zu beginnen, auch andere als zu erraten, und überprüfen, das würde ewig dauern.

Jegliche Hilfe ist sehr willkommen!

InformationsquelleAutor x4000 | 2009-03-11
Schreibe einen Kommentar