Darstellung und 2D-Beschleunigung im Fenster
Betrachtet man eine zweidimensionale Darstellung innerhalb eines Fensters, so existieren nur zwei Koordinaten: X und Y. Breite und Höhe. Was jedoch fehlt, ist eine zusätzliche Tiefeninformation. Breite und Höhe reichen zunächst völlig aus:
Das Zeichnen dieser Objekte erfolgt über das sogenannte GDI (Graphics Device Interface). Diese Schnittstelle für alle höheren Programmiersprachen enthält alle wichtigen Funktionen, die zur Darstellung zweidimensionaler Zeichenobjekte benötigt werden. Weiterentwicklungen wie GDI+ und Direct2D sollen jetzt an dieser Stelle zunächst nicht thematisiert werden, da das GDI bis heute die wichtigste Rolle für die 2D-Ausgabe der Anwendungen spielt. Die wichtigsten Zeichenfunktionen für Pixel, Linien, Kurven, Polygone, Rechtecke, Ellipsen usw. wurden anfangs ausschließlich von der CPU berechnet.
Durch eine zielgerichtete Spezialisierung der Grafikkarten konnte man später eine hardwarebasierte und damit auch schnellere Berechnung dieser zweidimensionalen Objekte erreichen. Diese ursprüngliche Form der 2D-Beschleunigung ist auch heute noch von Bedeutung, stellt aber nicht mehr das alleinige Aufgabenfeld einer 2D-Beschleunigung dar. Dazu im nächsten Kapitel mehr. Bestünde Windows nur aus einem einzigen Vollbildfenster, dann müsste man sich um die Problematik verschiedener Zeichenebenen keine Gedanken machen. Da wir jedoch auch nicht-exklusiv arbeiten möchten, reichen diese zweidimensionalen Informationen allein nicht mehr aus. Wir brauchen noch eine weitere Koordinate.
Einfache Darstellung mehrerer Fenster ohne Hardwarebeschleunigung:
Dabei ist die ursprüngliche Methode, die hinter überlappenden Fenstern steckt, eigentlich recht einfach und naheliegend. Man muss lediglich zwei Dinge wissen, nämlich welcher Bereich des Bildschirms bzw. welches Fenster sich geändert hat (und damit neu zu zeichnen ist) und welches Fenster oder welches Objekt letztendlich in welcher Reihenfolge über- oder hintereinander liegt bzw. teilweise oder ganz verdeckt ist. Diese Information nennt man auch 2.5D-Layer bzw. –Ebene. Diese Z-Koordinate, die 0 oder 1 ist, ist eine Art dritte Hilfsdimension. Deshalb spricht man auch von 2.5D. Durch die Z-Order kann die Reihenfolge bestimmt werden.
Zunächst wird der Fensterinhalt, wie bereits bekannt, mit reinen 2D-Funktionen gezeichnet. Es ist aber nicht nur die Aufgabe, vollflächige Inhalte zu erstellen, sondern man muss diese Vielzahl von Informationen auch verwalten und innerhalb der Fenster kommunizieren. Was passiert nun, wenn man Fenster verschiebt? Immer dann, wenn ein Teil eines ganz oder teilweisen verdeckten Fensters (wieder) sichtbar wird, erhält dieses Fenster das Systemereignis WM_PAINT und die genauen Informationen, welcher rechteckige Bereich neu zu zeichnen ist („dirty rectangle“). Optimierte Anwendungen werden nun exakt diesen Bereich neu zeichnen bzw. aufbauen. Leider gibt es viele Anwendungen, die trotz allem das gesamte Fenster neu zeichnen – egal, ob nun komplett sichtbar oder nicht. Dies geht jedoch zu Lasten der Anzeigegeschwindigkeit. Folge davon ist unter anderem der gut bekannte und gehasste Nachzieheffekt, wenn man Fenster ohne Hardwarebeschleunigung schnell verschiebt.
Fassen wir zusammen, was wir bis jetzt haben. Es existieren einzelne Fenster, die durch zweidimensionale Inhalte zum Leben erweckt werden müssen. Diese Fenster wiederum können frei bewegt werden, sich überlappen, gegenseitig ganz oder teilweise verdecken. Deren Inhalte müssen verwaltet und bei Bedarf möglichst verzögerungsfrei am Bildschirm angezeigt werden. Wir wissen zudem, dass die CPU selbst, auch wenn sie schnell sein mag, mit dieser komplexen Aufgabenstellung eigentlich überfordert ist. Was liegt näher, als all diese Aufgaben auf die Grafikkarte auszulagern? Dass sich dies einfacher liest, als es sich umsetzen lässt, das erfahren sie als Nächstes.
Die Spezialisierung der Grafikkarten erfolgte zunächst im reinen 2D-Bereich. Dass diese Karten noch heute exzellente Leistungen bringen, wenn es darum geht, komplexe Zeichnungen auszugeben, das ist kein Geheimnis. Noch so manches Schätzchen aus längst vergangenen Tagen hat sich dadurch bis heute das Überleben gesichert. Jedoch versagen diese Karten schnell im Alltag, wenn es um die allgemeine Oberflächendarstellung aktueller Windows-Versionen geht. Dies hat einerseits mit der grafischen Aufwertung der Oberfläche und andererseits mit einem beschränkten Funktionsumfang zu tun. Doch der Reihe nach…
2D-Beschleunigung von Zeichenfunktionen
Darunter versteht man den Teil der 2D-Hardwarebeschleunigung, der für die native Ausgabe von Zeichenaufgaben des GDI über die Grafikkarte zuständig ist. Das betrifft einerseits einfache geometrische Objekte wie Pixel, Linien, Kurven, Polygone, Rechtecke, Ellipsen und andererseits das Skalieren, Rendern und Kantenglätten der Schriften (TrueType, OpenType). Sprach man anfangs noch von sogenannten 2D-Einheiten auf den Grafikbeschleunigern, so ist diese spezialisierte Einheit mittlerweile auf den Heimanwenderkarten völlig verschwunden. Die Beschleunigung dieser 2D-Zeichenfunktionen erfolgt analog zur 3D-Beschleunigung auf einer identischen Hardware und die Implementierung erfolgt einzig und allein über den Grafiktreiber.
Wir werden im zweiten Teil unseres Artikels einen speziell von uns für diesen Bereich entwickelten Benchmarktest vorstellen, der diese wichtigen Funktionen umfassend testen wird und zeigt, dass Treiber eklatant und unerwartet versagen können, wenn man die grundlegendsten Funktionen sträflich vernachlässigt. Nachfolgend eine kleine Auswahl von insgesamt 9 Testkriterien: Textausgabe, Rechtecke und Kurven
2.5D-Beschleunigung der Oberflächendarstellung
Das Umsetzen der Zeichenfunktionen ist mittlerweile jedoch nur ein Teil der 2D-Beschleunigung. Eine sichtbare und subjektiv sehr gut wahrnehmbare Beschleunigung lässt sich durch aktuelle 3D-Grafikkarten erzielen, die zudem in der Lage sind, die im vorigen Abschnitt erwähnten 2.5D-Layer selbst hardwaremäßig zu erzeugen, zu verwalten und bedarfsgerecht anzuzeigen. Gerendert wird zunächst alles.
Wie funktioniert das? Ähnlich wie bei der 3D-Darstellung werden auch die nicht sichtbaren Teile eines Fensters zunächst als virtueller rechteckiger Ausschnitt, der stellvertretend für das betreffende Fenster steht, in einem Stück an die Grafikkarte übergeben und dort komplett gerendert und gespeichert. Es muss also später nichts „nachgezeichnet“ werden. Die Grafikkarte kennt jederzeit Größe und Position dieser virtuellen Rechtecke und über den sogenannten Tiefenpuffer (Z-Buffer) teilt man der Karte mit, in welcher Reihenfolge (Z-Order) die Fenster bzw. Objekte übereinander liegen und dargestellt werden. Über die Sichtbarkeit der Inhalte entscheidet dann die Grafikkarte allein.
Fassen wir einmal kurz zusammen:
Die damalige 2D-Hardwarebeschleunigung beinhaltetete sowohl die Implementierung der wichtigsten 2D-Zeichenfunktionen, als auch die Umsetzung der 2.5D-Layertechnik für die Fenster- bzw. Oberflächendarstellung.
Es wäre sicher ermüdend, auf jede einzelne Windows-Version näher einzugehen. Da die aktuellen Probleme, die uns zu diesem Test veranlasst haben, vor allem unter Windows 7 auftreten, haben wir uns im Folgenden auf die Betrachtung von Windows XP, Windows Vista und natürlich Windows 7 beschränkt.
- 1 - Einführung: 2D-Grafik – ungeliebtes Stiefkind oder Routineübung?
- 2 - Die Grenzen von 2D und 2.5D - Der Mythos 2D-Hardwarebeschleunigung
- 3 - Windows XP: Old school 2D und die Grenzen des WM_PAINT
- 4 - Windows Vista: Echter Fortschritt und die Kunst des Weglassens
- 5 - Windows 7: Rückkehr des verlorenen Sohnes
- 6 - Windows 7: Radeon HD5xxx ohne 2D-Beschleunigung
- 7 - Tom2D: 2D-Benchmark HD 5870 vs. GTX 285 unter Windows 7
- 8 - Tom2D: Fazit und Vorschau auf Teil 2 des Artikels
16 Antworten
Kommentar
Lade neue Kommentare
Mitglied
Veteran
Urgestein
1
Urgestein
1
Urgestein
Urgestein
Urgestein
Urgestein
Mitglied
Urgestein
1
Urgestein
Mitglied
1
Alle Kommentare lesen unter igor´sLAB Community →