Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DelphiX: DXDraw.Surface ist schneckenlahm (https://www.delphipraxis.net/27901-delphix-dxdraw-surface-ist-schneckenlahm.html)

roderich 17. Aug 2004 11:29


DelphiX: DXDraw.Surface ist schneckenlahm
 
Hab mich etwas schlau gemacht über DelphiX und auch im Forum gesucht, aber nichts gefunden zu meinem Problem.
Vielleicht klärt mich jemand auf, der sich mit DirectX / DelphiX auskennt. Ich will mit mindestens 60-100 Hz eine selbstgezeichnete Grafik (genauer ein Oszi) per DelphiX zeichnen.
Ich komme aber auf höchstens 25 Hz, kann ja wohl nicht sein, wenn ich direkt im Video-RAM zeichne, oder ?!?
Bei der DXDraw Komponente hab ich alle Optionen durchprobiert, z.B. doWaitVBlank, ohne richtigen Erfolg.
Das DXDraw läuft im Fenster, nicht im Vollbild (auch probiert, auch nix).


Erster Versuch mit DXDib und einem zweiten Surface (FSurface):
Delphi-Quellcode:
  FSurface := TDirectDrawSurface.Create(DXDraw1.DDraw);

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
  if not DXDraw1.CanDraw then
    exit;
  with DXDIB1.DIB.Canvas do
    begin
      // Male irgendwas
    end;
  FSurface.LoadFromGraphic(DXDIB1.DIB); // Auch nicht besser, wenn direkt auf DXDraw1.Surface
  DXDraw1.Surface.Draw(0, 0, FSurface.ClientRect, FSurface, true);
  DXDraw1.Flip;
end;

Zweiter Versuch mit Surface.Canvas, auch lahm:
Delphi-Quellcode:
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
  if not DXDraw1.CanDraw then
    exit;
  with DXDraw1.Surface.Canvas do
    begin
      Brush.Color := clAqua;
      FillRect(Rect(0, 0, DXDraw1.Width, DXDraw1.Height)); // Das allein ist schon lahm
      // Male irgendwas
      Release; // <- muß sein, sonst a) gnadenloser Absturz b) Farben falsch
    end;
  DXDraw1.Flip;
end;
Der DXTimer läuft ohne Last mit fast 1000 Hz, an dem liegt's also nicht.

Gibt's hier den DelphiX-Guru, der mir weiterhelfen kann ?

Liegt es an meiner Grafikkarte mit zu wenig Speicher ? Habe nur ne Matrox G450 mit 16 MB, fahre aber zwei Monitore mit 1280x1024 in TrueColor -> 1280 x 1024 x 2 * 4 Byte = ca. 10 MB verbraten, so daß es nicht mehr für DirectX-Flipping reicht !?
Aber es läuft auch auf anderen Rechnern mit mehr Video-RAM und nur einem Monitor nicht schneller.
Ich vermute, daß die Grafik doch immer noch irgendwie im Hauptspeicher aufgebaut wird und dann an die Grafikkarte geschickt wird, was zu langsam ist.
Wie bekomme ich hin, daß direkt im Video-RAM gezeichnet wird ?

Roderich

Michaela_ 17. Aug 2004 12:26

Re: DelphiX: DXDraw.Surface ist schneckenlahm
 
Hi,

ist schon eine weile her dass ich mit DelphiX was gemacht hab. Allerdings ist bei DirectX so, dass die Texture wieder zurück in den Arbeitsspeicher geladen wird sobald du darauf über einen Canvas zurückgreift. Nur dann kann Windows GDI Interface darauf zugreifen. Am schnellsten gehts wenn du bei der Surface SystemMemory setzt, dann ersparst du dir die Zeit die das System braucht um die Grafik über den AGP Bus wieder in den Systemspeicher zu kopieren.
Soweit ich mich aber erinnern kann kommst mit DelphiX nicht leicht auf 100 Frames.
Schau dir mal die DirectX 9 Header an. Unter http://clootie.narod.ru/ findest die aktuellen und einige Beispiele (die Seite ist leider ur langsam, aber super Inhalt)

Bedenke aber auch dass DirectX die Größe der Texturen umwandelt (Faktor 2). Auflösung von 700x700 wären dann 1024x1024 auf der Grafikkarte. Am schnellsten ist es eine Texture mit 512x512 Pixel zu nehmen und dann mit Direct3D Funktionen auf zwei Dreiecke zu Rendern. Dann kannst du Sie nebenbei ohne Zeitverlust zoomen, drehen oder sanft ein/ausblenden. Aber ich denk das wird jetzt ein bisschen zuviel...


lg,

Michaela

roderich 17. Aug 2004 14:03

Re: DelphiX: DXDraw.Surface ist schneckenlahm
 
hallo Michaela,

vielen Dank für die schnelle und ausführliche Antwort !

Surface SystemMemory hatte ich auch an-/ausgeschaltet, ohne größere Unterschiede in der Geschwindigkeit.
Komischerweise läuft mein Rechner jetzt auch mit den einfachen Beispielen immer langsamer, muß wohl mal rebooten... :angel2:

Wenn die Graphik immer wieder in den Systemspeicher geladen wird, sobald ich den Canvas verwende, dann kann ich das Surface.Canvas wohl vergessen. Wobei das Zeichnen per DIB.Draw bei mir auch lahm ist.

Ich probiere mal mit gekachelten Sprites rum, ob ich die schneller schieben kann.


Danke auch für den Link, sieht informativ aus !


viele Grüße
Roderich

Thebe 17. Aug 2004 17:37

Re: DelphiX: DXDraw.Surface ist schneckenlahm
 
Ich würd ma so sporadisch sagen statt

Delphi-Quellcode:
with DXDraw1.Surface.Canvas do
begin
   Brush.Color := clAqua;
   FillRect(Rect(0, 0, DXDraw1.Width, DXDraw1.Height)); // Das allein ist schon lahm
   // Male irgendwas
   Release; // <- muß sein, sonst a) gnadenloser Absturz b) Farben falsch
end;

lieber

Delphi-Quellcode:
DxDraw1.Surface.Fill(clAqua);
zu nehmn. Wenn Du auffen Canvas der Bild zugreifst benutzt Du wieder die GDI, was nicht Sinn der Sache bei DirectX is.

roderich 17. Aug 2004 17:46

Re: DelphiX: DXDraw.Surface ist schneckenlahm
 
ja, stimmt, Surface.Fill() ist deutlich schneller als Surface.Canvas.FillRect.
Nur die Farbwerte stimmen nicht mit den Windowsfarben überein, aber die kann ich über RGB oder so umrechnen.
Ich werde also gar nicht den Canvas verwenden, sondern es mit DXSprites o.ä. versuchen.

Erst mal vielen Dank für die Hilfe @Thebe und @Michaela !

Gruß
Roderich


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz