AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi schwarze Pixel weg : copyMode cmSrcAND cmSrcPaint zu langsam
Thema durchsuchen
Ansicht
Themen-Optionen

schwarze Pixel weg : copyMode cmSrcAND cmSrcPaint zu langsam

Ein Thema von henrik · begonnen am 27. Dez 2004 · letzter Beitrag vom 27. Dez 2004
Antwort Antwort
Seite 1 von 2  1 2      
henrik

Registriert seit: 25. Nov 2003
36 Beiträge
 
Delphi 2007 Professional
 
#1

schwarze Pixel weg : copyMode cmSrcAND cmSrcPaint zu langsam

  Alt 27. Dez 2004, 08:54
hallo !

altbekanntes Problem : ich will eine Bitmap (60*100 Pixel) "Org-Image" ohne eine bestimmte Farbe zB schwarz in eine anderes Bild, sagen wir "ZielImage" ,
einfügen zB grüner Hase auf schwarzem Hintergrund : nur der grüne Hase soll gezeichnet werden.


Bei mir soll dies allerdings mind. alle 10 msec geschehen, und das verursacht bei meinem 1,3 GHZ Celeron eine Auslastung von über 80% , wenn ich es mit einem der folgenden Wege probiere :

- ZielImage.copyRect(..Org-Image,orgRect) :
zuerst ein MaskImage (da wo beim Org.-Image schwarz ist , ist weiss, und wo bei Org-Image
nicht schwarz ist , ist schwarz.) mit dem copyMode cmSrcAnd des ZielImage in dieses kopieren
und dann mit cmSrcPaint (OR-Verknüpfung) das Org-Image drüberkopieren.

- mit 2 for-schleifen durch das Org-Image- laufen und mit der Abfrage
if NOT Org-Image.Canvas.Pixel[x,y] = clBlack
nur die Pixel im ZielImage einfärben die nicht clBlack sind.


- mit Canvas.BrushCopy (es wird eine Farbe angegeben die nicht gezeichnet werden soll)


Ein Zugriff auf Pixel in einem Image.Canvas Objekt sind anscheinend recht teuer.
(obwohl des ZielImage gar nicht sichtbar ist (es ist eine Art Buffer) )

Warum eigentlich ist es nicht wie ein array [60][100] of TColor ? Damit gäbe es keine Geschwindigkeits-Probleme.



Hat jemand noch eine andere Idee wie man dieses Problem lösen könnte ?


gruß
henrik
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: schwarze Pixel weg : copyMode cmSrcAND cmSrcPaint zu lan

  Alt 27. Dez 2004, 12:19
Am komfortabelsten lässt sich sowas mit der Graphics32-Lib machen. Dort kannst du nämlich mit Alphamasken arbeiten, und schnell ist sie dazu .

Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
henrik

Registriert seit: 25. Nov 2003
36 Beiträge
 
Delphi 2007 Professional
 
#3

Re: schwarze Pixel weg : copyMode cmSrcAND cmSrcPaint zu lan

  Alt 27. Dez 2004, 13:31
hey,

danke, damit klappt es besser.

die pixel-manipulationen kosten hier fast nichts,
dafür aber das TPaintbox32.refresh (was explizit aufgerufen werden muss) alleine 30% der cpu, was zwar 2-3 mal so schnell ist
wie mit dem langsamen Canvas , aber da müsste sich doch noch was machen lassen,
denn mit Canvas kostet wiederum das einfache refresh (was explizit gar nicht aufgerufen werden muss)
nach einem paintbox.cancas.copyrect(...) fast nichts !
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: schwarze Pixel weg : copyMode cmSrcAND cmSrcPaint zu lan

  Alt 27. Dez 2004, 14:44
Evtl. ist TPaintBox32.Flush da schneller. Laut Hilfe zur G32 müsste es das auch tun
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: schwarze Pixel weg : copyMode cmSrcAND cmSrcPaint zu lan

  Alt 27. Dez 2004, 14:59
Moin Henrik,

wozu muss das Bild 100 mal pro Sekunde neu gezeichnet werden?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
henrik

Registriert seit: 25. Nov 2003
36 Beiträge
 
Delphi 2007 Professional
 
#6

Re: schwarze Pixel weg : copyMode cmSrcAND cmSrcPaint zu lan

  Alt 27. Dez 2004, 15:21
hi Christian,


100 mal pro sekunde weil es im Rahmen eines Spiels welches ich dabei bin zu entwickeln, diese
hohe frequnez braucht um flüssig zu wirken : es soll in der paintbox ein bereich aus einer
Map dargestellt werden (scrolling), und dabei der Pixel-verschiebe-Wert von einem Ausschnitt zum nächsten möglichst klein gehalten werden, sonst wirkt es zu ruckelig, deshalb muss aber die BildAuschnittswiederholungsrate hochgesetzt werden !
  Mit Zitat antworten Zitat
henrik

Registriert seit: 25. Nov 2003
36 Beiträge
 
Delphi 2007 Professional
 
#7

Re: schwarze Pixel weg : copyMode cmSrcAND cmSrcPaint zu lan

  Alt 27. Dez 2004, 15:36
hi dizzy,


mit Flush gehts leider auch nicht schneller. Die PaintBox32 ist 400*400 Pixel groß.

In der ontimer Methode mit der einzigen Anweisung

PaintBox321.Flush;

wird die cpu mit 70% belastet (obwohl nur die leere Paintbox gezeichnet wird)
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: schwarze Pixel weg : copyMode cmSrcAND cmSrcPaint zu lan

  Alt 27. Dez 2004, 15:43
Also ich selber habe ja immer ein TImage32 genommen, in das TImage32.Bitmap gezeichnet, und dann TImage32.Changed aufgerufen. Bisher kam mir das recht flüssig vor .

Letzten Endes bleibt noch der Weg über DirectX. Das ist noch viel performanter, aber leider auch ungleich komplexer.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
henrik

Registriert seit: 25. Nov 2003
36 Beiträge
 
Delphi 2007 Professional
 
#9

Re: schwarze Pixel weg : copyMode cmSrcAND cmSrcPaint zu lan

  Alt 27. Dez 2004, 16:03
also wenn ich folgendes mache :

Delphi-Quellcode:
procedure TForm1.MMTimer1Timer(Sender: TObject; Time: Cardinal);
begin
 buffer32.Changed;
end;

mit einem TimerInterval von 10 msec und buffer32 ist ein (leeres) TImage32 auf Form1 und ist 400*400 groß, dann ist die cpu auslastung 50 % bei 1.3GHZ.
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: schwarze Pixel weg : copyMode cmSrcAND cmSrcPaint zu lan

  Alt 27. Dez 2004, 16:24
Ein Timer ist im übrigen sehr sehr unschön, zumal du an 10msec Intervalldauer real so gut wie nie heran kommen dürftest. Ein MMTimer (Unit MMSystem) ist da deutlich besser geeignet, oder ein Gameloop, oder Application.OnIdle. (Gameloop ist eigentlich das Übliche.) Und damit die Spielgeschwindigkeit nicht von der Geschwindigkeit des Rechners abhängt, solltest du auf jeden Fall ein Framerate-Control einbauen. (Mal im Forum stöbern, dazu hatten wir schon mal was meine ich.)
Damit die CPU-Auslastung nicht so irre hoch wird, könnte man zu dem ein Framerate-Limit einbauen. Das Zeichnen selber wirst du aber vermutlich auf konventionellem Wegen (GDI) nicht viel schneller bekommen. Genau deshalb gibt es ja DirectX . Da musst du dann abwägen wie sehr sich der evtl. Mehraufwand lohnt. Grundsätzlich ist hohe CPU-Auslastung bei Games völlig normal und auch okay. Nur sollte nicht grad 80% auf das pure Neuzeichnen entfallen, da hast du Recht .
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:22 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