Verwendung von Directdraw mit delphi


Dies zeigt, wie mit der DirectX-Bibliothek in Delphi-Programmen zu starten und dann zeigt eine einfache Anwendung, die mit der Freeware-Bibliothek DelphiX.
Wenn Sie jemals schnelle Bildschirmausgabe unter Windows zu tun versucht haben, wissen Sie, dass es keine leichte Aufgabe ist. Mit allen möglichen Tricks fällt es noch kläglich weit hinter den kommerziellen Spielgeschwindigkeiten. Aber ich werde Ihnen zeigen, wie man DirectX in Ihren Anwendungen verwenden, um schnelle Ausgabe glätten, die in Mikrosekunden nicht Minuten gelegt werden können!
Vor ein paar Jahren realisiert Microsoft Entwickler, dass Windows keine Spieleplattform war und sie versprach, dies zu ändern. 1995 erschien der kurzlebige Flügel. Dies ermöglichte die schnelle Ausgabe im 256-Farb-Modi unter Win 3.1 und Win 95. Es war schnell, aber begrenzt und durch DirectX bald ersetzt werden. Dies ist eine Familie von APIs für schnellen Output und Input. Ihre Anwendungen können Grafikkarten, Soundkarten und sogar Force-Feedback Joysticks durch DirectX. Ich schau DirectDraw visual-API und zu den anderen in Zukunft wiederkommen. Anderen DirectX APIs gehören DirectSound für Soundkarten, DirectInput für Joysticks etc., Direct3d für 3D-Grafiken und DirectPlay für Multi-Player. DirectX ist jetzt bei Version 6.1, wurde DirectDraw praktisch unverändert seit der Version 3. Version 3 ist BTW der Win NT 4.0 integriert.
Windows die Stärke ist, dass es mit vielen verschiedenen Monitoren, Grafikkarten und in mehreren Auflösungen und Farbtiefen funktioniert. Dies erfordert eine Menge Code zwischen Ihrer Webanwendung und der Grafikkarten-Hardware und diese Api' Dick' ist, warum Windows Ausgabe Routinen langsam sind. Dies galt auch mit Dos, wenn es zum ersten Mal und Spiele-Entwickler direkt an das Metall gingen anstatt die BIOS oder DOS-API-Routinen. Bis vor zwei Jahren entstanden die meisten Spiele noch für Dos, auch diejenigen, die unter Windows 95 ausgeführt wird. Nun, wahrscheinlich 99 % verwenden DirectX und bald scheint es, dass Windows CE Mikrofone kommerzielle Arcade-Maschinen, die mit DirectX fahren.
DirectX/DirectDraw unterstützt baut ein dünner API-Ansatz mit einigen Schichten zwischen der Hardware und Ihre ca. DirectX auf COM Component Object Model, so dass neue Versionen veröffentlicht werden können, ohne Ihre vorhandenen Code zu unterbrechen. Wenn Ihre App mit DirectX Version 5 arbeitet, ist es garantiert mit DirectX 6, 7... 308!
DirectDraw enthält Informationen zu Ihrer App welche Hardwarefunktionen des Videos oder Soundkarte verfügt, und was in Software emuliert wird. Diese DirectX-Vorgehensweise gewährleistet, dass Ihre Software auf Karten noch nicht entwickelt läuft und werden ihre erweiterten Funktionen nutzen. Auf der anderen Seite bedeutet, dass man zwei oder drei verschiedene Möglichkeiten, Dinge zu schreiben, und wählen am besten (schnellsten =) Methode zur Laufzeit.
DirectX und Delphi
Zwar C und C++ Hauptsprachen Ifor DirectX sind, ist Delphi Ir sehr gut geeignet. Blake Stone hat die erste DirectX Header Übersetzung aus C in Delphi und Borland Charlie Calvert zu diesem Thema in seinen Büchern des Delphi 2/4-'Unleashed' gebürstet hat. Herr Hiroyuki Hori in Japan entwickelte DelphiX-eine ausgezeichnete Reihe von kostenlose Delphi-Komponenten für DirectX. Diese sind von vielen Seiten auf dem Netz oder seine Homepage unter https://www.ingjapan.ne.jp/hori/ erhältlich. Du musst auch DirectX Version 5 oder höher installieren. Sie haben wahrscheinlich haben es auf Ihrem System bereits Wenn Sie ein Spiel im letzten Jahr gekauft haben. Windows 98 und die zukünftige NT5 verfügen über DirectX erbaut. NT 4 Service Pack 3 unterstützt auch DirectX 3.0.
Ich zeige Ihnen jetzt das Wesentliche der DirectDraw-Programmierung und wie man das Beste aus der DelphiX-Komponenten mit einem Beispiel App. Bei Verwendung von DelphiX finden Sie, dass Herr Hori-Hilfedateien vielleicht nicht glasklar sind, aber Sie erhalten vollständigen Quellcode und eine Reihe von guten Beispielprogramme, dies zu überwinden. DelphiX ist eine hervorragende Software und Sie könnten in der Nähe von Qualität Arcadespiele in Delphi schreiben, benutze es.

Auch wenn Sie nicht in die Spiele, die Programmierung, können die zusätzliche Geschwindigkeit, die DirectDraw bietet Sie Anwendungen erstellen, mit Flimmern kostenloser high-Speed-Ausgabe wie Radar zeigt, Oszilloskope, Karten etc. Scrollen. Ich habe es für einen Bildlauf anzeigen und zeichnet Bildschirm mit 256 Farben Sechsecke auf 1024 x 768 Auflösung (jede Hex passt in ein Rechteck 32 Pixel breit durch 34 tief) in 26 ms auf einer P2-300 mit einer AGP Matrox Millenium-Karte ausgestattet. Das ist fast 40 Bilder pro Sekunde, nicht gar schlecht für Delphi...
In DirectDraw habe nicht Microsoft entweder heraus das GDI warf. Einer der großen Schmerzen der Dos-Spiele-Entwicklung war Ausgabe von Text, besonders dass Sie eigene Schriftarten oder Nachricht Bitmaps erstellen. Zum Glück funktioniert das GDI mit DirectDraw damit Truetype-Schriftarten verwendet werden können. In der Tat die meisten der GDI funktioniert, so lange ein bisschen Pflege genommen wird. GDI-Ausgang ist natürlich nicht sehr schnell, also Sie wirklich sollten nur verwenden, zum Erstellen von Text, Menüs usw..
Erste Schritte
Sie benötigen die DirectX Header Dateien-es gibt keinen besseren Ort als die DelphiX-Bibliothek. Die mitgelieferten Directx.pas ist eine satte 300Kb groß. Es enthält alle DirectSound usw. APIs-Datensätze, GUIDs etc.. Wenn Sie in der Gobi für die letzten fünf Jahre darüber nachgedacht haben, können Sie möglicherweise mit GUIDs nicht vertraut, aber sie sind einfach eine Sammlung von Zahlen wie diese ['{5C690320-0BD2-11D3-89DF-00409545E8E7}'], die Objekte und Klassen in Windows eindeutig identifizieren. Microsoft legte nachdenklich GUIDS mit Ihrer Netzwerkkarten Mac-Adresse in alle Word- und Excel-Dateien auf Ihrem PC erstellt. Wenn Sie Strg-Shift-G in der Delphi-Ide tun, sind die letzten 12 Ziffern der GUID generiert Ihre Netzwerkkarten Mac-Adresse (wenn Sie eine Netzwerkkarte haben).
DirectDraw ist nicht so schwierig mit, nur ein wenig knifflig an Orten arbeiten. Hier ist mein 5-Punkt-Anfänger-Führer um loszulegen. Zuerst erstellen Sie ein DirectDraw-Objekt. Dies entspricht einer Karte/Videomonitor Aufspannung, und unter Windows 98 unterstützt mehrere Geräte. Dies ist die Definition des DirectDrawCreate.
Funktion DirectDrawCreate
(LpGUID: PGUID;
aus LplpDD: IDirectDraw;
pUnkOuter: IUnknown): HRESULT;
Überall gibt es ein pUnkOuter-Parameter, übergeben Sie einfach gleich NULL. Dieser Aufruf sollte einen DD_OK-Wert zurück (= 0). Alles andere ist ein Fehler und sollte von Ihrem Code behandelt werden...
Schritt zwei ist die kooperative Ebene angeben. Will er den ganzen Bildschirm ausschließlich oder zu teilen? Die meisten Spiele laufen im Vollbildmodus, so Ihre app wählen kann, den Bildschirmmodus und Auflösung zu verwenden. Wenn Sie es in einem Fenster verwenden, sollten Ihre app Modus nicht ändern.
Der DwFlags-Parameter können Sie angeben, ob Sie Vollbild oder nicht oder ob Ihre Anwendung den Bildschirm Steuert, so dass keine andere app, die es ändern kann, und selbst wenn der Benutzer können Strg-Alt-Entf neu starten.
Funktion SetCooperativeLevel (hWnd: HWND; DwFlags: DWORD): HRESULT;
Die Möglichkeit, das DirectDraw-Objekt für alle Fragen unterstützte Videomodi. Die meisten Grafikkarten unterstützen viele Modi, sondern die höhere Frequenz/Farb-Modi kann benötigen höherer Bandbreite als Ihr Monitor bewältigen kann. Wechsel zu diesen Modi wird nicht arbeiten und könnte lassen den Monitor in einem unsynched Zustand, so sicher sein, einen Disclaimer sind, wenn Sie Ihre apps verteilen! Besser noch, erhalten die Benutzer den Modus aus einer Liste auswählen. Verwenden Sie diesen Ansatz, Quake und viele Spiele.
Schritt 3 wird den Modus festgelegt. Dies gilt nur, wenn Sie Vollbild zugreifen möchten.
SetDisplayMode-Funktion (DwWidth, DwHeight, DwBpp: DWORD): HRESULT;
DwBpp ist die Bits pro Pixel, d. h. 8 für 256-Farben. 640 x 480 8 ist wohl eine sichere Wette auf jedem PC!
Schritt 4 ist dem Oberflächen erzeugt werden. Alle Bilder werden in Flächen gehalten. Dies sind nur wenige Blocks von Ram mit einer optionalen Palette und Ihre app kann Oberflächen erstellen, in der Haupt-PC-System-Ram oder die Grafikkarte Ram. Keine Preise zu erraten, dass Bilder im video-Ram-Bilder kopieren auf video-Ram, schnellste sind, obwohl AGP-Karten können Daten von Ihrem PC zu verschieben ram sehr schnell.
CreateSurface entsteht eine Oberfläche gemäß dem Oberflächenbeschreibung-Parameter.
Funktion CreateSurface (const LpDDSurfaceDesc: DDSURFACEDESC;
aus LplpDDSurface: IDirectDrawSurface; pUnkOuter: IUnknown): HRESULT;
Die wichtigste Oberfläche den Bildschirm repräsentiert und ist bekannt als die Primäroberfläche. Aktualisierung dieser direkt führt zu den Display-Raster fangen Bilder wie sie gezogen werden. Dies gibt einen Effekt der Schneiden oder reißen und vermeiden Sie es mit einem anderen Block video-RAM als Puffer zurück. Die Primäroberfläche wird immer angezeigt, aber Ihre app immer auf den Hintergrundpuffer schreibt und ruft dann die Flip-Methode. Dadurch wird der Inhalt Primäroberfläche und Back Buffer tauschen Positionen und Ihr Monitor jetzt zeigt das neue Bild, das ist das Geheimnis der glatten Computeranimation und kann bis zu 70 mal pro Sekunde passieren.

Eine Primäroberfläche von 1024 x 768 256 Farben plus einem Hintergrundpuffer dauert 1,5 Mb video-RAM. So wird eine Grafikkarte mit 4 Mb Video-Ram nur 2,5 Mb zum Speichern Ihrer Bilder Links haben. Möglicherweise möchten Sie reservieren einen großen Block RAM im PC-Hauptspeicher, tun alle Manipulationen, und kopieren Sie diese an die Grafikkarte-Oberfläche angezeigt werden. Es gibt viele Techniken zur Optimierung der Update-Geschwindigkeit und Teil des Spaßes ist versuchen sie aus. Die Verfolgung von denen wenig Bildschirm geändert hat und nur kopieren, dass etwas ist eine Möglichkeit, den Datenverkehr zu minimieren. Nicht jeder hat AGP, so sollten Sie Ihre app auf so vielen Systemen wie möglich testen.
Das ist wirklich alles gibt. Schritt 5 ist zurückzulehnen und denken-Wow - ich kann jetzt verwenden DirectDraw. Es gibt ein paar kleinere Schwierigkeiten wie immer Ihre Bilder von Bitmap-Dateien oder Ressourcen in eine DirectDraw-Oberfläche. Die Bitmap hat in den Speicher geladen und dann in den hinteren Puffer kopiert werden... Windows-Bitmaps enthalten eine Palette und sind in der Regel auf den Kopf gespeichert. Sie können haben Spaß, die Kodierung selbst oder DelphiX-Bibliothekskomponenten für Bitmap und Palette-Management verwenden.
Direkter Zugriff auf Video-Ram
Wenn Ihre App direkt Pixel im Videospeicher zu ändern dann müssen Sie geben Sie einen rechteckigen Bereich, rufen Sie Sperre erhalten exklusiven Zugang zum Widder, zu ändern oder die Pixel zu lesen und schließlich Anruf entsperren, um ihn freizugeben. Der Code der Lock und Unlock sollten kurz gehalten werden als Windows beendet ist.
Beobachten Sie die Tonhöhe!
Nein es ist nicht über Fußball. Jede Fläche hat eine Tonhöhe. Die Breite des bereinigten in Byte. Wenn Sie Bilder auf Byte-Ebene bearbeiten, müssen Sie dessen bewusst sein. Die Tonhöhe einer Oberfläche unterscheidet sich häufig auf die Breite. Jedes Pixel-Linie startet 'Stellplatz' Byte aus dem vorherigen. Dies kann geschehen, weil die Breite eine ungerade Anzahl von Bytes ist und die Tonhöhe rundet auf die nächste Doppelwort oder die nur die Art und Weise die Grafikkarte es tut. Die Breite könnte 105 aber die Steigung 108 werden könnte. Die erste Zeile ist 0 Bytes vom Anfang der nächsten 108, dann 216 und so weiter.
GDI
Mit der GDI ist kein großes Problem. Das GDI ist ein wenig in seinen Möglichkeiten stecken und verwendet immer den gleichen Block video-RAM. Dies bedeutet, dass eine Systemmeldung (wie eine nicht behandelte Ausnahme) nicht erscheinen kann, wenn Sie Seite kippen und zeige den anderen Block RAM verwenden. Allerdings rufen Sie FliptoGDI, um die primäre Oberfläche der GDI oder GetGDISurface, um einen Zeiger auf die Surface-Objekt abzurufen sein zu machen.


Ihre Daten zu verlieren
Verlieren Bilder in video-Ram ist, dass ein kleines Problem, wenn der Benutzer ein Alt-Tab alles tut verloren geht. Jedoch DirectX verfolgt den 'verlorenen' Status der Oberflächen und gebe einen 'Oberfläche verloren'-Fehler, wenn Sie versuchen, es zu benutzen. Ihre Anwendung sollte einen Handler zum Neuerstellen der Oberflächen und reload Bildern haben wieder in.
Die Nachteile...
Die wichtigste davon ist, dass Vollbild DirectX-Anwendungen debuggen problematisch ist. Zugriff auf video-Speicher erfolgt durch Windows vorübergehend zu stoppen. Es sei denn, Sie arbeiten sehr niedrig sind; Dies kann einen Spaziergang in das Softeis Gebiet, gibt es keine Möglichkeit auf der Erde, die Sie durch Ihren Code zwischen einer Sperre Schritt können... paar zu entsperren. Ein Weg Runde dies soll eine Müllkippe-Prozedur verwenden, um Zeichenfolgen Parameter an eine Protokolldatei Anhängen oder eine Debug-Fenster wie in Gexperts.
Wenn du C oder C++ natürlich wissen bietet Microsoft eine kostenlose DirectDraw-SDK mit vielen Beispielen und wahrscheinlich die informativste Hilfedatei, die ich je gesehen habe. Ich empfehle das Buch 'Inside DirectX' von Microsoft press für alle Hintergrundinformationen über DirectX. Microsoft Press; ISBN: 1572316969. Eine alternative Buch ist Windows Game Programming for Dummies von Andre Lamothe Verlag IDG Books Worldwide Inc; ISBN: 0764503375, aber wieder das ist C/C++-basierte.
Delphix
Haben gelernt, wie man einfache DirectDraw-Material in Delphi zu tun haben Sie jetzt eine Wahl-entwickeln eigener Komponenten oder verwenden Sie die für Sie-wie DelphiX definiert. Ich habe keine Verbindung mit dem Autor außer Bewunderung für hervorragende Arbeit und seine Großzügigkeit in es verschenkt. Wenn Sie mit DelphiX sind, es kann ein wenig überwältigend sein, und ich schlage vor, Sie drucken Sie die Beispiele und Demos und im Detail zu studieren. Hier ist meine Übersicht über deren Verwendung.
Eine TdxForm ist eine modifizierte Form, die wie das Vorgänger-Formular verwendet werden muss, nicht TForm-es tut einige Nachrichtenverarbeitung, einschließlich der Behandlung von Ausnahmen und Primäroberfläche GDI umschalten, so dass Sie Nachrichten sehen. Eine DxDraw-Komponente ist auf es und der Eigenschaften für die Auflösung und Schärfentiefe fallen gelassen. Dies hat die Event-Handler zu bewältigen, Initialisierung und Beendigung des Objekts. Diese Handler sind, wo Ihre app seinen Laden von Bildern und Vorbereitung für das Spielloop tun muss.
Die Hauptschleife Spiele ist eigentlich ein Timer gesteuert-Ereignishandler. Der Timer von protokolliert jede Verzögerung damit Sie sehen können, wenn Ihr Code Ausführung zu lange dauert.
Es gibt Image und Imagelist Komponenten welche Let Sie Bitmap-Grafiken zur Entwurfszeit einrichten und Sie können angeben, in welche Art von Ram (PC-System oder Video) die Bilder platziert werden.
Ein RestoreSurface-Handler wird bereitgestellt, damit Sie Ihre app Bilder nach der Benutzer Alt-Tabs laden kann und verliert die video-Ram Inhalt.
Die TDirectDrawSurface-Klasse implementiert so gut wie alle der Oberfläche DirectX-Funktionen. Oberflächen können überall, in jeder Größe und Bilder Blitted schnell mit optionalen Skalierung und Drehung zwischen Flächen erstellt werden. Die meisten Grafikkarten haben einen Hardware-Blits und DirectDraw verwenden dies. Bilder sind selten rechteckig, sondern immer in einen rechteckigen Block definiert sind. Eine Karte zeichnen Routine zeichnet 150 Sechsecken in unter 4 ms, die d.h. jeder rund 26 Mikrosekunden übernimmt.
Erstellung von einem Hintergrundpuffer wird automatisch durchgeführt, wenn die Dxdraw.Doflip-Option auf true festgelegt ist. Hinweis: Ausgabe erfolgt in diesem Fall der Hintergrundpuffer und Sie werden nicht alles sehen, bis dxdraw.flip aufgerufen wird. Wenn die Doflip-Option auf false festgelegt ist, wie in einem Fenster ausgeführt wird, geht die Ausgabe direkt und du musst nicht dxdraw.flip nennen (obwohl es keinen Schaden tut).
Der Code des Radar.Exe.
370 Zeilen Code ich habe eine kleine Simulation Flugzeuge fliegen in zufällige Richtungen geschrieben-das ist sehr Barebones Funktionalität, also erwarten Sie Kollisionserkennung oder Explosionen nicht!. Die Schlüssel sind ESC beenden, 'A' ein Flugzeug hinzufügen und Alt-1, 2 oder 3, um auf höhere Auflösungen von 640 x 480, 800 x 600 und 1024 x 768 ändern.
Das Flugzeug in drei verschiedenen Farben nach dem Zufallsprinzip fliegen über den Bildschirm mit leicht unterschiedlichen Geschwindigkeiten und Lager und einige beginnen zu blinken. Es gibt 25 zunächst aber die A-Taste gedrückt halten und die Zahlen ganz schnell erhöht. Die Flugzeuge werden als Rechtecke, die rund um die Bildschirm-Koordinaten angezeigt und diese Textausgabe von der Gdi TextOut-Routine; Dies verlangsamt die Dinge ein wenig. Um dies zu sehen, versuchen Sie es mit 100 Flugzeuge, dann kommentieren Sie diese Zeilen unten in der Methode tPlane.MovenDraw und erneut ausführen. Alles, was angezeigt wird ist der einschließende Frame. Dies wird von einigen Assembler-Code gezeichnet; Ich war nur Angeberei!
Wenn Fflashcount > = 0 then
mit Fdxdraw. Surface.Canvas tun
beginnen
Brush.Color: = Fcolor;
Str: = inttostr(fx)+inttostr(fy);
TextOut(FX,fy,Str);
Freisetzung;
Ende;
Hinweis, die Verwendung der Version in diesem Stück Code. Dies ist eine Methode der TDirectDrawSurface und es gibt das Handle des zugrunde liegenden Anzeigekontext frei. Jeder Zeit Sie einen Gdi-Aufruf verwenden sollten Sie Version aufrufen.
Sie haben nun viel mehr Flugzeuge (auch rechteckige Rahmen) reibungslos Monstertrottinettes um den Schirm. Seinen Wert das versuchen es raus mit Spiegeln, aktiviert und deaktiviert, welchen Unterschied ggf. sehen, das macht.
Wie es funktioniert.
Großteil der Esel-Arbeit erfolgt durch Festlegen von Eigenschaften in der Komponente DXDraw.-zB Bildschirmauflösung, Vollbild oder Fenstermodus, DoFlip Etc etc..
Ich benutze eine Tstringlist, um jedes Flugzeug-Objekt zu halten. Diese werden mit zufälligen Koordinaten und Bewegung Richtungen erstellt. Der Zeitgeber-Handler sind alle Flieger zog jeden Frame bis zum willkürlich festgelegten x und y Offsets abprallen Bildschirm Kanten. Der Bildschirm gelöscht, und jedes Mal, wenn alle Flugzeuge neu gezeichnet.
Der Text oben links zeigt, wieviele Flugzeuge sind auf dem Bildschirm und der Sträfling. Ein normale Verzögerung Wert ist 1. Alles ist in einem Frame ausgegeben. Wenn dies zu 2 oder mehr geht (schlanke auf die A-Taste), die Flugzeug-Bewegung wird ruckartig wie es länger als ein Bild dauert zu zeichnen. Versuchen Sie, dies zu vermeiden!
Die ungenutzte Strecke-Methode zeichnet den Rahmen der Rechtecke in weiß und ist sehr schnell. Dies und die ungenutzten Drawrect-Methode sind gute Beispiele für direkten Zugriff auf video-Ram per Lock... Entsperren und beide Routinen verwenden das Tonhöhe Mitglied des Deskriptors Surface (Dds) nach unten verschoben vom pixelweise Zeile zur nächsten.
Hinweise für Delphi 4.0 und NT 4.0 Benutzer
Es gibt zwei Versionen von DelphiX verfügbar und beide werden mit Delphi 3.0 arbeiten, der früheren hat einer kleineren Zipdatei (606Kb). Die zweite (841Kb) hat einige spezifischen Delphi 4.0-Code (Parameter überladen und Default) und unterstützt DirectX 6 aber gebaut, Programme laufen nicht unter Win NT 4.0 - Stattdessen erhalten Sie die Fehlermeldung 'Schnittstelle nicht unterstützt'. Verwenden Sie in diesem Fall die frühere Version.
---------------------
Die Zip-Datei enthaltene hat Quelldateien, aber nicht den DirectX-Code. Dies kann heruntergeladen werden von 'Hori/DelphiX-e.html oder various other Places. https://www.yks.ne.jp/
Die Datei für diesen Artikel kann hier - Ddraw heruntergeladen werden. ZIP









Verwendung von Directdraw mit delphi


Verwendung von Directdraw mit delphi : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Dies zeigt, wie mit der DirectX-Bibliothek in Delphi-Programmen zu starten und dann zeigt eine einfache Anwendung, die mit der Freeware-Bibliothek DelphiX.
Wenn Sie jemals schnelle Bildschirmausgabe unter Windows zu tun versucht haben, wissen Sie, dass es keine leichte Aufgabe ist. Mit allen möglichen Tricks fällt es noch kläglich weit hinter den kommerziellen Spielgeschwindigkeiten. Aber ich werde Ihnen zeigen, wie man DirectX in Ihren Anwendungen verwenden, um schnelle Ausgabe glätten, die in Mikrosekunden nicht Minuten gelegt werden können!
Vor ein paar Jahren realisiert Microsoft Entwickler, dass Windows keine Spieleplattform war und sie versprach, dies zu ändern. 1995 erschien der kurzlebige Flügel. Dies ermöglichte die schnelle Ausgabe im 256-Farb-Modi unter Win 3.1 und Win 95. Es war schnell, aber begrenzt und durch DirectX bald ersetzt werden. Dies ist eine Familie von APIs für schnellen Output und Input. Ihre Anwendungen können Grafikkarten, Soundkarten und sogar Force-Feedback Joysticks durch DirectX. Ich schau DirectDraw visual-API und zu den anderen in Zukunft wiederkommen. Anderen DirectX APIs gehören DirectSound für Soundkarten, DirectInput für Joysticks etc., Direct3d für 3D-Grafiken und DirectPlay für Multi-Player. DirectX ist jetzt bei Version 6.1, wurde DirectDraw praktisch unverändert seit der Version 3. Version 3 ist BTW der Win NT 4.0 integriert.
Windows die Stärke ist, dass es mit vielen verschiedenen Monitoren, Grafikkarten und in mehreren Auflösungen und Farbtiefen funktioniert. Dies erfordert eine Menge Code zwischen Ihrer Webanwendung und der Grafikkarten-Hardware und diese Api' Dick' ist, warum Windows Ausgabe Routinen langsam sind. Dies galt auch mit Dos, wenn es zum ersten Mal und Spiele-Entwickler direkt an das Metall gingen anstatt die BIOS oder DOS-API-Routinen. Bis vor zwei Jahren entstanden die meisten Spiele noch für Dos, auch diejenigen, die unter Windows 95 ausgeführt wird. Nun, wahrscheinlich 99 % verwenden DirectX und bald scheint es, dass Windows CE Mikrofone kommerzielle Arcade-Maschinen, die mit DirectX fahren.
DirectX/DirectDraw unterstützt baut ein dünner API-Ansatz mit einigen Schichten zwischen der Hardware und Ihre ca. DirectX auf COM Component Object Model, so dass neue Versionen veröffentlicht werden können, ohne Ihre vorhandenen Code zu unterbrechen. Wenn Ihre App mit DirectX Version 5 arbeitet, ist es garantiert mit DirectX 6, 7... 308!
DirectDraw enthält Informationen zu Ihrer App welche Hardwarefunktionen des Videos oder Soundkarte verfügt, und was in Software emuliert wird. Diese DirectX-Vorgehensweise gewährleistet, dass Ihre Software auf Karten noch nicht entwickelt läuft und werden ihre erweiterten Funktionen nutzen. Auf der anderen Seite bedeutet, dass man zwei oder drei verschiedene Möglichkeiten, Dinge zu schreiben, und wählen am besten (schnellsten =) Methode zur Laufzeit.
DirectX und Delphi
Zwar C und C++ Hauptsprachen Ifor DirectX sind, ist Delphi Ir sehr gut geeignet. Blake Stone hat die erste DirectX Header Übersetzung aus C in Delphi und Borland Charlie Calvert zu diesem Thema in seinen Büchern des Delphi 2/4-'Unleashed' gebürstet hat. Herr Hiroyuki Hori in Japan entwickelte DelphiX-eine ausgezeichnete Reihe von kostenlose Delphi-Komponenten für DirectX. Diese sind von vielen Seiten auf dem Netz oder seine Homepage unter https://www.ingjapan.ne.jp/hori/ erhältlich. Du musst auch DirectX Version 5 oder höher installieren. Sie haben wahrscheinlich haben es auf Ihrem System bereits Wenn Sie ein Spiel im letzten Jahr gekauft haben. Windows 98 und die zukünftige NT5 verfügen über DirectX erbaut. NT 4 Service Pack 3 unterstützt auch DirectX 3.0.
Ich zeige Ihnen jetzt das Wesentliche der DirectDraw-Programmierung und wie man das Beste aus der DelphiX-Komponenten mit einem Beispiel App. Bei Verwendung von DelphiX finden Sie, dass Herr Hori-Hilfedateien vielleicht nicht glasklar sind, aber Sie erhalten vollständigen Quellcode und eine Reihe von guten Beispielprogramme, dies zu überwinden. DelphiX ist eine hervorragende Software und Sie könnten in der Nähe von Qualität Arcadespiele in Delphi schreiben, benutze es.

Auch wenn Sie nicht in die Spiele, die Programmierung, können die zusätzliche Geschwindigkeit, die DirectDraw bietet Sie Anwendungen erstellen, mit Flimmern kostenloser high-Speed-Ausgabe wie Radar zeigt, Oszilloskope, Karten etc. Scrollen. Ich habe es für einen Bildlauf anzeigen und zeichnet Bildschirm mit 256 Farben Sechsecke auf 1024 x 768 Auflösung (jede Hex passt in ein Rechteck 32 Pixel breit durch 34 tief) in 26 ms auf einer P2-300 mit einer AGP Matrox Millenium-Karte ausgestattet. Das ist fast 40 Bilder pro Sekunde, nicht gar schlecht für Delphi...
In DirectDraw habe nicht Microsoft entweder heraus das GDI warf. Einer der großen Schmerzen der Dos-Spiele-Entwicklung war Ausgabe von Text, besonders dass Sie eigene Schriftarten oder Nachricht Bitmaps erstellen. Zum Glück funktioniert das GDI mit DirectDraw damit Truetype-Schriftarten verwendet werden können. In der Tat die meisten der GDI funktioniert, so lange ein bisschen Pflege genommen wird. GDI-Ausgang ist natürlich nicht sehr schnell, also Sie wirklich sollten nur verwenden, zum Erstellen von Text, Menüs usw..
Erste Schritte
Sie benötigen die DirectX Header Dateien-es gibt keinen besseren Ort als die DelphiX-Bibliothek. Die mitgelieferten Directx.pas ist eine satte 300Kb groß. Es enthält alle DirectSound usw. APIs-Datensätze, GUIDs etc.. Wenn Sie in der Gobi für die letzten fünf Jahre darüber nachgedacht haben, können Sie möglicherweise mit GUIDs nicht vertraut, aber sie sind einfach eine Sammlung von Zahlen wie diese ['{5C690320-0BD2-11D3-89DF-00409545E8E7}'], die Objekte und Klassen in Windows eindeutig identifizieren. Microsoft legte nachdenklich GUIDS mit Ihrer Netzwerkkarten Mac-Adresse in alle Word- und Excel-Dateien auf Ihrem PC erstellt. Wenn Sie Strg-Shift-G in der Delphi-Ide tun, sind die letzten 12 Ziffern der GUID generiert Ihre Netzwerkkarten Mac-Adresse (wenn Sie eine Netzwerkkarte haben).
DirectDraw ist nicht so schwierig mit, nur ein wenig knifflig an Orten arbeiten. Hier ist mein 5-Punkt-Anfänger-Führer um loszulegen. Zuerst erstellen Sie ein DirectDraw-Objekt. Dies entspricht einer Karte/Videomonitor Aufspannung, und unter Windows 98 unterstützt mehrere Geräte. Dies ist die Definition des DirectDrawCreate.
Funktion DirectDrawCreate
(LpGUID: PGUID;
aus LplpDD: IDirectDraw;
pUnkOuter: IUnknown): HRESULT;
Überall gibt es ein pUnkOuter-Parameter, übergeben Sie einfach gleich NULL. Dieser Aufruf sollte einen DD_OK-Wert zurück (= 0). Alles andere ist ein Fehler und sollte von Ihrem Code behandelt werden...
Schritt zwei ist die kooperative Ebene angeben. Will er den ganzen Bildschirm ausschließlich oder zu teilen? Die meisten Spiele laufen im Vollbildmodus, so Ihre app wählen kann, den Bildschirmmodus und Auflösung zu verwenden. Wenn Sie es in einem Fenster verwenden, sollten Ihre app Modus nicht ändern.
Der DwFlags-Parameter können Sie angeben, ob Sie Vollbild oder nicht oder ob Ihre Anwendung den Bildschirm Steuert, so dass keine andere app, die es ändern kann, und selbst wenn der Benutzer können Strg-Alt-Entf neu starten.
Funktion SetCooperativeLevel (hWnd: HWND; DwFlags: DWORD): HRESULT;
Die Möglichkeit, das DirectDraw-Objekt für alle Fragen unterstützte Videomodi. Die meisten Grafikkarten unterstützen viele Modi, sondern die höhere Frequenz/Farb-Modi kann benötigen höherer Bandbreite als Ihr Monitor bewältigen kann. Wechsel zu diesen Modi wird nicht arbeiten und könnte lassen den Monitor in einem unsynched Zustand, so sicher sein, einen Disclaimer sind, wenn Sie Ihre apps verteilen! Besser noch, erhalten die Benutzer den Modus aus einer Liste auswählen. Verwenden Sie diesen Ansatz, Quake und viele Spiele.
Schritt 3 wird den Modus festgelegt. Dies gilt nur, wenn Sie Vollbild zugreifen möchten.
SetDisplayMode-Funktion (DwWidth, DwHeight, DwBpp: DWORD): HRESULT;
DwBpp ist die Bits pro Pixel, d. h. 8 für 256-Farben. 640 x 480 8 ist wohl eine sichere Wette auf jedem PC!
Schritt 4 ist dem Oberflächen erzeugt werden. Alle Bilder werden in Flächen gehalten. Dies sind nur wenige Blocks von Ram mit einer optionalen Palette und Ihre app kann Oberflächen erstellen, in der Haupt-PC-System-Ram oder die Grafikkarte Ram. Keine Preise zu erraten, dass Bilder im video-Ram-Bilder kopieren auf video-Ram, schnellste sind, obwohl AGP-Karten können Daten von Ihrem PC zu verschieben ram sehr schnell.
CreateSurface entsteht eine Oberfläche gemäß dem Oberflächenbeschreibung-Parameter.
Funktion CreateSurface (const LpDDSurfaceDesc: DDSURFACEDESC;
aus LplpDDSurface: IDirectDrawSurface; pUnkOuter: IUnknown): HRESULT;
Die wichtigste Oberfläche den Bildschirm repräsentiert und ist bekannt als die Primäroberfläche. Aktualisierung dieser direkt führt zu den Display-Raster fangen Bilder wie sie gezogen werden. Dies gibt einen Effekt der Schneiden oder reißen und vermeiden Sie es mit einem anderen Block video-RAM als Puffer zurück. Die Primäroberfläche wird immer angezeigt, aber Ihre app immer auf den Hintergrundpuffer schreibt und ruft dann die Flip-Methode. Dadurch wird der Inhalt Primäroberfläche und Back Buffer tauschen Positionen und Ihr Monitor jetzt zeigt das neue Bild, das ist das Geheimnis der glatten Computeranimation und kann bis zu 70 mal pro Sekunde passieren.

Eine Primäroberfläche von 1024 x 768 256 Farben plus einem Hintergrundpuffer dauert 1,5 Mb video-RAM. So wird eine Grafikkarte mit 4 Mb Video-Ram nur 2,5 Mb zum Speichern Ihrer Bilder Links haben. Möglicherweise möchten Sie reservieren einen großen Block RAM im PC-Hauptspeicher, tun alle Manipulationen, und kopieren Sie diese an die Grafikkarte-Oberfläche angezeigt werden. Es gibt viele Techniken zur Optimierung der Update-Geschwindigkeit und Teil des Spaßes ist versuchen sie aus. Die Verfolgung von denen wenig Bildschirm geändert hat und nur kopieren, dass etwas ist eine Möglichkeit, den Datenverkehr zu minimieren. Nicht jeder hat AGP, so sollten Sie Ihre app auf so vielen Systemen wie möglich testen.
Das ist wirklich alles gibt. Schritt 5 ist zurückzulehnen und denken-Wow - ich kann jetzt verwenden DirectDraw. Es gibt ein paar kleinere Schwierigkeiten wie immer Ihre Bilder von Bitmap-Dateien oder Ressourcen in eine DirectDraw-Oberfläche. Die Bitmap hat in den Speicher geladen und dann in den hinteren Puffer kopiert werden... Windows-Bitmaps enthalten eine Palette und sind in der Regel auf den Kopf gespeichert. Sie können haben Spaß, die Kodierung selbst oder DelphiX-Bibliothekskomponenten für Bitmap und Palette-Management verwenden.
Direkter Zugriff auf Video-Ram
Wenn Ihre App direkt Pixel im Videospeicher zu ändern dann müssen Sie geben Sie einen rechteckigen Bereich, rufen Sie Sperre erhalten exklusiven Zugang zum Widder, zu ändern oder die Pixel zu lesen und schließlich Anruf entsperren, um ihn freizugeben. Der Code der Lock und Unlock sollten kurz gehalten werden als Windows beendet ist.
Beobachten Sie die Tonhöhe!
Nein es ist nicht über Fußball. Jede Fläche hat eine Tonhöhe. Die Breite des bereinigten in Byte. Wenn Sie Bilder auf Byte-Ebene bearbeiten, müssen Sie dessen bewusst sein. Die Tonhöhe einer Oberfläche unterscheidet sich häufig auf die Breite. Jedes Pixel-Linie startet 'Stellplatz' Byte aus dem vorherigen. Dies kann geschehen, weil die Breite eine ungerade Anzahl von Bytes ist und die Tonhöhe rundet auf die nächste Doppelwort oder die nur die Art und Weise die Grafikkarte es tut. Die Breite könnte 105 aber die Steigung 108 werden könnte. Die erste Zeile ist 0 Bytes vom Anfang der nächsten 108, dann 216 und so weiter.
GDI
Mit der GDI ist kein großes Problem. Das GDI ist ein wenig in seinen Möglichkeiten stecken und verwendet immer den gleichen Block video-RAM. Dies bedeutet, dass eine Systemmeldung (wie eine nicht behandelte Ausnahme) nicht erscheinen kann, wenn Sie Seite kippen und zeige den anderen Block RAM verwenden. Allerdings rufen Sie FliptoGDI, um die primäre Oberfläche der GDI oder GetGDISurface, um einen Zeiger auf die Surface-Objekt abzurufen sein zu machen.


Ihre Daten zu verlieren
Verlieren Bilder in video-Ram ist, dass ein kleines Problem, wenn der Benutzer ein Alt-Tab alles tut verloren geht. Jedoch DirectX verfolgt den 'verlorenen' Status der Oberflächen und gebe einen 'Oberfläche verloren'-Fehler, wenn Sie versuchen, es zu benutzen. Ihre Anwendung sollte einen Handler zum Neuerstellen der Oberflächen und reload Bildern haben wieder in.
Die Nachteile...
Die wichtigste davon ist, dass Vollbild DirectX-Anwendungen debuggen problematisch ist. Zugriff auf video-Speicher erfolgt durch Windows vorübergehend zu stoppen. Es sei denn, Sie arbeiten sehr niedrig sind; Dies kann einen Spaziergang in das Softeis Gebiet, gibt es keine Möglichkeit auf der Erde, die Sie durch Ihren Code zwischen einer Sperre Schritt können... paar zu entsperren. Ein Weg Runde dies soll eine Müllkippe-Prozedur verwenden, um Zeichenfolgen Parameter an eine Protokolldatei Anhängen oder eine Debug-Fenster wie in Gexperts.
Wenn du C oder C++ natürlich wissen bietet Microsoft eine kostenlose DirectDraw-SDK mit vielen Beispielen und wahrscheinlich die informativste Hilfedatei, die ich je gesehen habe. Ich empfehle das Buch 'Inside DirectX' von Microsoft press für alle Hintergrundinformationen über DirectX. Microsoft Press; ISBN: 1572316969. Eine alternative Buch ist Windows Game Programming for Dummies von Andre Lamothe Verlag IDG Books Worldwide Inc; ISBN: 0764503375, aber wieder das ist C/C++-basierte.
Delphix
Haben gelernt, wie man einfache DirectDraw-Material in Delphi zu tun haben Sie jetzt eine Wahl-entwickeln eigener Komponenten oder verwenden Sie die für Sie-wie DelphiX definiert. Ich habe keine Verbindung mit dem Autor außer Bewunderung für hervorragende Arbeit und seine Großzügigkeit in es verschenkt. Wenn Sie mit DelphiX sind, es kann ein wenig überwältigend sein, und ich schlage vor, Sie drucken Sie die Beispiele und Demos und im Detail zu studieren. Hier ist meine Übersicht über deren Verwendung.
Eine TdxForm ist eine modifizierte Form, die wie das Vorgänger-Formular verwendet werden muss, nicht TForm-es tut einige Nachrichtenverarbeitung, einschließlich der Behandlung von Ausnahmen und Primäroberfläche GDI umschalten, so dass Sie Nachrichten sehen. Eine DxDraw-Komponente ist auf es und der Eigenschaften für die Auflösung und Schärfentiefe fallen gelassen. Dies hat die Event-Handler zu bewältigen, Initialisierung und Beendigung des Objekts. Diese Handler sind, wo Ihre app seinen Laden von Bildern und Vorbereitung für das Spielloop tun muss.
Die Hauptschleife Spiele ist eigentlich ein Timer gesteuert-Ereignishandler. Der Timer von protokolliert jede Verzögerung damit Sie sehen können, wenn Ihr Code Ausführung zu lange dauert.
Es gibt Image und Imagelist Komponenten welche Let Sie Bitmap-Grafiken zur Entwurfszeit einrichten und Sie können angeben, in welche Art von Ram (PC-System oder Video) die Bilder platziert werden.
Ein RestoreSurface-Handler wird bereitgestellt, damit Sie Ihre app Bilder nach der Benutzer Alt-Tabs laden kann und verliert die video-Ram Inhalt.
Die TDirectDrawSurface-Klasse implementiert so gut wie alle der Oberfläche DirectX-Funktionen. Oberflächen können überall, in jeder Größe und Bilder Blitted schnell mit optionalen Skalierung und Drehung zwischen Flächen erstellt werden. Die meisten Grafikkarten haben einen Hardware-Blits und DirectDraw verwenden dies. Bilder sind selten rechteckig, sondern immer in einen rechteckigen Block definiert sind. Eine Karte zeichnen Routine zeichnet 150 Sechsecken in unter 4 ms, die d.h. jeder rund 26 Mikrosekunden übernimmt.
Erstellung von einem Hintergrundpuffer wird automatisch durchgeführt, wenn die Dxdraw.Doflip-Option auf true festgelegt ist. Hinweis: Ausgabe erfolgt in diesem Fall der Hintergrundpuffer und Sie werden nicht alles sehen, bis dxdraw.flip aufgerufen wird. Wenn die Doflip-Option auf false festgelegt ist, wie in einem Fenster ausgeführt wird, geht die Ausgabe direkt und du musst nicht dxdraw.flip nennen (obwohl es keinen Schaden tut).
Der Code des Radar.Exe.
370 Zeilen Code ich habe eine kleine Simulation Flugzeuge fliegen in zufällige Richtungen geschrieben-das ist sehr Barebones Funktionalität, also erwarten Sie Kollisionserkennung oder Explosionen nicht!. Die Schlüssel sind ESC beenden, 'A' ein Flugzeug hinzufügen und Alt-1, 2 oder 3, um auf höhere Auflösungen von 640 x 480, 800 x 600 und 1024 x 768 ändern.
Das Flugzeug in drei verschiedenen Farben nach dem Zufallsprinzip fliegen über den Bildschirm mit leicht unterschiedlichen Geschwindigkeiten und Lager und einige beginnen zu blinken. Es gibt 25 zunächst aber die A-Taste gedrückt halten und die Zahlen ganz schnell erhöht. Die Flugzeuge werden als Rechtecke, die rund um die Bildschirm-Koordinaten angezeigt und diese Textausgabe von der Gdi TextOut-Routine; Dies verlangsamt die Dinge ein wenig. Um dies zu sehen, versuchen Sie es mit 100 Flugzeuge, dann kommentieren Sie diese Zeilen unten in der Methode tPlane.MovenDraw und erneut ausführen. Alles, was angezeigt wird ist der einschließende Frame. Dies wird von einigen Assembler-Code gezeichnet; Ich war nur Angeberei!
Wenn Fflashcount > = 0 then
mit Fdxdraw. Surface.Canvas tun
beginnen
Brush.Color: = Fcolor;
Str: = inttostr(fx)+inttostr(fy);
TextOut(FX,fy,Str);
Freisetzung;
Ende;
Hinweis, die Verwendung der Version in diesem Stück Code. Dies ist eine Methode der TDirectDrawSurface und es gibt das Handle des zugrunde liegenden Anzeigekontext frei. Jeder Zeit Sie einen Gdi-Aufruf verwenden sollten Sie Version aufrufen.
Sie haben nun viel mehr Flugzeuge (auch rechteckige Rahmen) reibungslos Monstertrottinettes um den Schirm. Seinen Wert das versuchen es raus mit Spiegeln, aktiviert und deaktiviert, welchen Unterschied ggf. sehen, das macht.
Wie es funktioniert.
Großteil der Esel-Arbeit erfolgt durch Festlegen von Eigenschaften in der Komponente DXDraw.-zB Bildschirmauflösung, Vollbild oder Fenstermodus, DoFlip Etc etc..
Ich benutze eine Tstringlist, um jedes Flugzeug-Objekt zu halten. Diese werden mit zufälligen Koordinaten und Bewegung Richtungen erstellt. Der Zeitgeber-Handler sind alle Flieger zog jeden Frame bis zum willkürlich festgelegten x und y Offsets abprallen Bildschirm Kanten. Der Bildschirm gelöscht, und jedes Mal, wenn alle Flugzeuge neu gezeichnet.
Der Text oben links zeigt, wieviele Flugzeuge sind auf dem Bildschirm und der Sträfling. Ein normale Verzögerung Wert ist 1. Alles ist in einem Frame ausgegeben. Wenn dies zu 2 oder mehr geht (schlanke auf die A-Taste), die Flugzeug-Bewegung wird ruckartig wie es länger als ein Bild dauert zu zeichnen. Versuchen Sie, dies zu vermeiden!
Die ungenutzte Strecke-Methode zeichnet den Rahmen der Rechtecke in weiß und ist sehr schnell. Dies und die ungenutzten Drawrect-Methode sind gute Beispiele für direkten Zugriff auf video-Ram per Lock... Entsperren und beide Routinen verwenden das Tonhöhe Mitglied des Deskriptors Surface (Dds) nach unten verschoben vom pixelweise Zeile zur nächsten.
Hinweise für Delphi 4.0 und NT 4.0 Benutzer
Es gibt zwei Versionen von DelphiX verfügbar und beide werden mit Delphi 3.0 arbeiten, der früheren hat einer kleineren Zipdatei (606Kb). Die zweite (841Kb) hat einige spezifischen Delphi 4.0-Code (Parameter überladen und Default) und unterstützt DirectX 6 aber gebaut, Programme laufen nicht unter Win NT 4.0 - Stattdessen erhalten Sie die Fehlermeldung 'Schnittstelle nicht unterstützt'. Verwenden Sie in diesem Fall die frühere Version.
---------------------
Die Zip-Datei enthaltene hat Quelldateien, aber nicht den DirectX-Code. Dies kann heruntergeladen werden von 'Hori/DelphiX-e.html oder various other Places. https://www.yks.ne.jp/
Die Datei für diesen Artikel kann hier - Ddraw heruntergeladen werden. ZIP


Verwendung von Directdraw mit delphi

Verwendung von Directdraw mit delphi : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Verwendung von Directdraw mit delphi
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung