AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Bitmap erstellen und mit Direct2D zeichnen
Thema durchsuchen
Ansicht
Themen-Optionen

Bitmap erstellen und mit Direct2D zeichnen

Ein Thema von milos · begonnen am 11. Mär 2014 · letzter Beitrag vom 25. Mär 2014
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#1

Bitmap erstellen und mit Direct2D zeichnen

  Alt 11. Mär 2014, 14:45
Hallo

ich suche eine Lösung um ein Bitmap zu erstellen und mit Direct2D zu zeichnen.
Gibt es eine wirklich schnelle Lösung dafür? 100+ Bilder pro Sekunde wären nice.

Momentan mach ich das ganz einfach, kriege aber nicht viele Bilder.
Ich nehme ein Bitmap nehme 2 For schleifen, nehme jedes Pixel und zeichne es mit Direct2D.
Ihr könnt euch bestimmt vorstellen wie langsam das ist...

MfG
Milos
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Bitmap erstellen und mit Direct2D zeichnen

  Alt 11. Mär 2014, 14:59
Schau doch mal unter Samples\Delphi\Vcl\Direct2D.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Bitmap erstellen und mit Direct2D zeichnen

  Alt 11. Mär 2014, 16:08
nehme jedes Pixel
Mittels TBitmap.Canvas.Pixels[]? Dann lässt sich da schon allein durch Nutzung von .Scanline ein Gewinn um größere Faktoren erreichen. (Beispiele dazu gibt's in der DP mehr als nötig.) >100FPS wird bei größeren Bildern aber dennoch kaum drin sein, zumindest nicht mit der normalen WinAPI. (Und die wenigsten TFT Bildschirme stellen >60Hz (=FPS) überhaupt dar, wenn man mal schon ganz davon absieht, dass es ein Mensch ab spätestens 60Hz eh kaum noch wahrnimmt.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Bitmap erstellen und mit Direct2D zeichnen

  Alt 13. Mär 2014, 00:54
Danke für den Tipp mit ScanLine. Habe ne weile gebraucht bis ich es verstanden habe, aber habe es endlich hingekriegt einen brauchbaren Test zu machen.

Werde bald die Pixels variante mit der ScanLine variante umtauschen, mal sehen was sich an der Performance verändert ^^

MfG
Milos
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Bitmap erstellen und mit Direct2D zeichnen

  Alt 13. Mär 2014, 07:37
Handelt es sich denn bei jedem Frame um ein neu generiertes Bitmap?
Dann ist hier der Flaschenhals!

Das Darstellen des immer gleichen Bitmaps geht auch mit mehr als 100 FPS, je nach Grafikhardware und Größe des Bitmaps.

Wenn du magst, kannst du ja mal ein kleines Beispielprojekt anhängen!
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Bitmap erstellen und mit Direct2D zeichnen

  Alt 13. Mär 2014, 16:41
Hab mal ein kleines Testprojekt erstellt um die Performance von ScanLine mit der von Pixels zu vergleichen.

Ich glaube jedoch ich mache was falsch, da die Performance nur minimal besser ist :/

Habe das Projekt in eine Zip gepackt und hochgeladen. Das kompilat ist nicht in der Zip da sie sonst zu gross gewesen wäre um sie hier hochzuladen.
Im "Debug" Ordner habe ich 5 Bilder in verschiedenen Auflösungen reingetan.

Edit: Der Code wurde schnell geschrieben und wird später nicht mehr gebraucht. Ist nur für Testzwecke gedacht.
Edit2: Ja die Bitmaps werden ein mal geladen und werden nicht (bzw. sehr selten) während der Laufzeit verändert werden aber an verschiedenen Positionen angezeigt.

Edit3: In diesem Beitrag ist leider eine falsche version des Projekts ^^ Weiter unten ist die richtige
Miniaturansicht angehängter Grafiken
anwendung.jpg  
Angehängte Dateien
Dateityp: zip Pixels_vs_ScanLine.zip (3,46 MB, 31x aufgerufen)
Milos

Geändert von milos (13. Mär 2014 um 17:59 Uhr)
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Bitmap erstellen und mit Direct2D zeichnen

  Alt 13. Mär 2014, 17:20
Die Funktionen des angehängten Projekts sind leer.

Delphi-Quellcode:
procedure TForm1.DrawPixels;
begin

end;

procedure TForm1.DrawScanLine;
begin

end;
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Bitmap erstellen und mit Direct2D zeichnen

  Alt 13. Mär 2014, 17:56
Oh lol, da hab ich wohl ernsthaft vergessen abzuspeichern bevor ich es gepackt habe

Danke fürs melden ^^
Angehängte Dateien
Dateityp: zip Pixels_vs_ScanLine.zip (3,46 MB, 30x aufgerufen)
Milos

Geändert von milos (13. Mär 2014 um 17:59 Uhr)
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Bitmap erstellen und mit Direct2D zeichnen

  Alt 13. Mär 2014, 18:36
Was willst du eigentlich machen? Das wird aus deinem Code irgendwie nicht ersichtlich.

In dem Code lädst du eine Bitmap und zeichnest sie Pixel für Pixel über TDirect2DCanvas auf die Form, mit beiden Funktionen.

Du könntest zB auch mit MSDN-Library durchsuchenBitBlt die Bitmap in einem Rutsch auf die Form zeichnen. Wozu der Umweg?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Bitmap erstellen und mit Direct2D zeichnen

  Alt 13. Mär 2014, 20:11
Das ist ja mal wirklich gruselig! Pixel für Pixel!

Hier mal ein kleiner Ansatz, wie es schneller geht.
Da ist aber noch Luft nach oben.

Delphi-Quellcode:
procedure TForm1.Loop(CountTo: integer);
var
  c : integer;
begin
  c := 0;
  while c < CountTo do
  begin
    Invalidate;
    Application.ProcessMessages;
    inc(c);
    if c mod 10 = 0 then
      edit1.Text := inttostr(c);
  end;
  edit1.Text := 'done';
end;

procedure TForm1.WMPaint(var Message: TWMPaint);
var
  PaintStruct: TPaintStruct;
begin
  BeginPaint(Handle, PaintStruct);
  try
    FCanvas.BeginDraw;
    try
      FCanvas.StretchDraw(ClientRect, FBitmap);
    finally
      FCanvas.EndDraw;
    end;
  finally
    EndPaint(Handle, PaintStruct);
  end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 17:46 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