AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi schnelles Kopieren von Direct3DSurface -> DirectDrawSurface
Thema durchsuchen
Ansicht
Themen-Optionen

schnelles Kopieren von Direct3DSurface -> DirectDrawSurface

Ein Thema von JamesTKirk · begonnen am 11. Sep 2006 · letzter Beitrag vom 20. Nov 2006
 
Benutzerbild von JamesTKirk
JamesTKirk

Registriert seit: 9. Sep 2004
Ort: München
604 Beiträge
 
FreePascal / Lazarus
 
#1

schnelles Kopieren von Direct3DSurface -> DirectDrawSurfa

  Alt 11. Sep 2006, 22:03
Abend Leutz!

Ausgehend von diesen Quellcodes, arbeite ich momentan an einem Programm, dass es mir ermöglicht Direct3D Inhalte "live" als Desktophintergrund anzeigen zu lassen. (Fragt nicht nach dem warum... - Also schön... ich wollte schon immer einen Desktop mit tollen 3D Animationen im Hintergrund ) Von der Theorie her funktioniert das ganze schon mal.

Mein Problem ist aber, das die Geschwindigkeit des Kopiervorgangs vom Direct3DSurface zum DirectDrawSurface äußerst zu wünschen übrig lässt (~90-120ms pro Kopiervorgang), vor allem, wenn man zumindest eine Auflöung von 640x480 als Surface Auflösung möchte. (320x240 ist zwar von der Geschwindigkeit her OK (~30ms), allerdings sieht das von 320x240 auf 1024x758 gestreckte Resultat nicht mehr schön aus )
Deswegen frage ich euch, was es alles für Möglichkeiten gibt, den Kopiervorgang zu beschleunigen oder ob es gar die Möglichkeit gibt mehr oder weniger direkt in das DirectDrawSurface zu renden.


Hier noch die primitivste,langsamste, aber am besten aussehendste Kopierprozedur (natürlich - wie üblich - um das unnötigste gekürzt ):

Delphi-Quellcode:
procedure CopyImageToSurface(surface:IDirectDrawSurface7;src:IDirect3DSurface9);
var
  ddsd:DDSURFACEDESC2;
  hr:HResult;
  LockedRect:D3DLOCKED_RECT;
  dest:PDWord;
begin
  ZeroMemory(@ddsd,SizeOf(ddsd));
  ddsd.dwSize:=SizeOf(ddsd);
  if FAILED(surface.Lock(NIL, ddsd, DDLOCK_SURFACEMEMORYPTR or DDLOCK_WAIT, 0)) then
    raise Exception.Create('...');

  if Failed(src.LockRect(LockedRect,NIL,D3DLOCK_READONLY)) then
    raise Exception.Create('...');

  dest:=PDWORD(ddsd.lpSurface);

  //Dies ist DER zeitaufwendigste Part... Das warum ist mir allerdings klar ;)
  Move(LockedRect.pBits^,dest^,IMG_W*IMG_H*4);

  src.UnlockRect;

  surface.Unlock(NIL);
end;
Sven
[Free Pascal Compiler Entwickler]
this post is printed on 100% recycled electrons
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz