AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Scanline in 3 bis 4 MINUTEN.... Ok
Thema durchsuchen
Ansicht
Themen-Optionen

Scanline in 3 bis 4 MINUTEN.... Ok

Ein Thema von Corelgott · begonnen am 5. Mai 2004 · letzter Beitrag vom 6. Mai 2004
Antwort Antwort
Benutzerbild von Corelgott
Corelgott

Registriert seit: 11. Apr 2003
Ort: Lübeck
213 Beiträge
 
Delphi 2006 Enterprise
 
#1

Scanline in 3 bis 4 MINUTEN.... Ok

  Alt 5. Mai 2004, 10:18
Hi @ all,

wie sollte es auch anders sein ich habe mal wieder ein Problem

Also ich schreib gerade an eine kleinen Grafikkomponten, die so allerlei spielkram wie alpha-transparentz usw kann. Die ganze grafik-veränderung mache ich per Scanline und von hier kommt auch das problem.
Wenn ich ein Bild lade (TBitmap) und es mit meiner Komponente bearbeite geht das ganze sprichwörtlich in milli-sekunden also so flink wie ich das gerne hätte. Ich bin jetzt aber dazu gekommen, dass ich eine zweite instanz meines grafikobjects in einer unterkompontet brauche.

Also Hauptprogram hat eine Grafikkomponente
Ein Unterobjekt hat eine weitere Instanz der Grafikkomponente

So die unterkomponente erzeugt und bearbeitet ein Bild und gibt das als an das Hauptprogram


Routine im Unterobj:
Code:


//Irgendwo davor...
img := TBitmap.Create;
img.PixelFormat := pf24Bit;

usw....

procedure TBox.getPic(var img : TBitmap);
var
    I : Integer;

begin
    For I := 0 to myItemCount - 1 do drawItem(i);
    MyDraw.Render(myImg.Canvas);

    img.Assign(myImg);
end;
(Render erzeugt das Bild)

Nun das eigentliche Problem:
Wenn ich das neue Bild ein weiteres mal mit Scanline barbetien will dauert das an die 3-4min (JA MINUTEN) also einiges zu lange für ein bild mit 300 x 300 px.

Kennt wer das Phänomen?

thx für's nachdenken
Corelgott
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Scanline in 3 bis 4 MINUTEN.... Ok

  Alt 5. Mai 2004, 11:11
Moin!

Ich kenne das Problem nicht, könnte mir aber ein paar Nachteile mit nicht freigemachten Speicher oder überschreiben von altem Speicher vorstellen - oder die Komponente hat einen Buffer mit temporären Daten von denen er beim zweiten mal wieder was berechnet - umsonst - so nach dem Motto, das irgendwelche Variablen nicht ordentliche neu-initialisiert werden.

Ansonsten kann ich dir noch empfehlen pf32Bit zu verwenden beim Bitmap, weil dann die Daten ordentlich aligned sind und die CPU nochmal etwas schneller drauf zugreifen dürfte...

MfG
Muetze1
  Mit Zitat antworten Zitat
Benutzerbild von Corelgott
Corelgott

Registriert seit: 11. Apr 2003
Ort: Lübeck
213 Beiträge
 
Delphi 2006 Enterprise
 
#3

Nee nu is aber mal gut.... !! *argh*

  Alt 5. Mai 2004, 18:15
ok nu reicht's!!!

Ich ahbe die letzen 5std damit verbracht nach dem bug zu suchen... Aber irgendwie.... Nö nicht mal ansaztweise.....

Das Ding soll später mal, wenn es fertig werden sollte, sowas wie ein Pong werden. Noch fehlen aber die Schläger und das Zhlsystem (alos nur der Rohbau!)

Die beiden Probleme, die mir Kopfzerbrechen bereiten sind:
1. Warum ist die zeichenroutine so "langsam". Auf nem 3Ghz Pc ist das Teil super mega flüssig bei ner CPU auslastung von 0 - 4%. Auf nem 500 ruckelt es wie sau und von dem 233 Laptop, dass ich hier noch stehen habe, rede ich schon gar nicht erst...

2. Dieser dumme Start-Screen!
Ich lade bei der einen Form ein Menu (Menu bitte hier als ein aus Bitmaps zusammengeflicktes wird; oder versuche es zu mindest) das ich mit meiner Zeichenroutine ausgeben möchte. (Das die Alpha-fading kann) Also Hintergrundbild + (Kasten + Einträge)

Aber das braucht richtig Zeit zum rendern... Obwohl das die Komponete in ein paar milli Sekunden schaffen sollte; und es auch kann..... aber anscheinden nicht will....)

Ich wäre jedem sehr dankbar den sich mal der Herrausvorderung stellen würde... Also thx im vorraus
Hier ist es dann

(Ich bitte zu entschuldingen, dass ich in dieser Pre-Alpha etwas sparsam mit den Kommentaren war... )

Ohne es böse zu meinen... Das Programm bekommt wenn es fertig ist von mir nen weiblichen Namen verpasst; Es ist nämlich so mega Zickig!

thx
Corelgott
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Scanline in 3 bis 4 MINUTEN.... Ok

  Alt 5. Mai 2004, 21:53
Moin!

1. Der Code ist schwer durchschaubar.
2. Du hast haufenweise Resourcen-Lecks (neues Bitmap in der Grösse 1280x1024 in 24 Bit anlegen, einmal faden und beim nächsten mal mit einem neuen Bild überschreiben)
3. Du hast nix mal probeweise auf 32 Bit umgestellt
4. die Routinen sind z.T. wirklich langsam geschrieben
5. Ein wenig Assembler würde da nochmehr tun
6. Du hast haufenweise Bitmaps die immer wieder neu zugewiesen werden oder überschrieben werden
7. Du malst nicht im OnPaint der Form, auf der du direkt malst
8. Von den Klassen ist das ja alles eine gute Idee, aber nicht weit genug gedacht. Warum nicht einfach der Draw Klasse das Canvas direkt beim Create geben und gut? Dann muss man doch nur noch beim Paint einmal die Draw Klasse anschupsen
9. Spare dir Malereien und nutze Invalidate/InvalidateRect und das ClipRect vom Canvas im Zusammenhang mit IntersectRect()
10. Versuche auch mal mehr die WinAPI zu nutzen - zumindest an den wichtigen Stellen - BitBlt() ist schneller als das Draw() und es kümmert sich sogar darum, das die Farben stimmen im Ziel HDC...
11. Bei einem Click wird das Draw 2x aufgerufen (noch nicht behoben) - woher der andere Aufruf auch immer kommen mag.
12. Unit IdXXX und Types war nicht mit dabei und anscheinend nicht benötigt - habe ich auskommentiert. Ich benutze Delphi 5 Prof.
13. Du hast dir extra Types für den Scanline Zugriff geschrieben - aber Windows.pas definiert sowas schon
14. Deine alten Proceduren haben öfters Grün und Blau vertauscht. Benutze den in Windows.pas definierten Type und es ist eindeutiger.
15. Wenn er mal wieder meckert, das TBitmap Variablen keine Klassen sind: Abhilfe schafft das einbinden der Graphics nach der Windows Unit in der Uses Liste, dann wird der TBitmap Record Typ nach hinten gestellt.

Ich habe hier mal ein wenig an manchen Stellen ein bischen was gedreht und das Programm Faded zumindest und die Routinen brauchen nicht mehr soo lange - und sind zumindest gleich schnell...

Ich habe zum Debugging den Trick eingesetzt vorne in der Delphi Projektdatei ein {$APPTYPE CONSOLE} einzufügen. Dadurch werden WriteLn() Ausgaben möglich und es wird ein Konsolenfenster geöffnet. Um die WriteLn() nach dem entfernen von {$APPTYPE CONSOLE} zu einer Exception werden zu lassen, kannst du vor jedem Writeln ein If IsConsoleApp Then schreiben, dann gibt es keine Exception wenn du nachher einfach das {$APPTYPE CONSOLE} entfernst.

So, genug gemeckert. Wenn du das vielleicht mal einzeilig die Procedurendefinitionen dokumentierst, dann kann ich bestimmt noch mehr drehen, aber so sehe ich nicht durch.

MfG
Muetze1
Angehängte Dateien
Dateityp: zip delphi_-_pong.zip (193,6 KB, 25x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Corelgott
Corelgott

Registriert seit: 11. Apr 2003
Ort: Lübeck
213 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: Scanline in 3 bis 4 MINUTEN.... Ok

  Alt 6. Mai 2004, 11:49
*schluck*

Erst mal vielen Dank an Muetze1 für die geopferte Zeit....

So, also, na dann...

Ich habe mir mal deine Vorschläge angesehen und den überarbeiteten Code versucht zu verstehen.
(Ich bin dabei zu der erkenntnis gekommen, dass ich doch besser etwas anderes als Informatik studieren sollte! )
(*etwas übertrieben*)

Ist auch durch aus veständlich was du da als kretikpunkte aufführst und ich habe es auch schon teilweise umgesetzt.

Aber mit so ein paar Punkten habe ich dann doch noch so ein bisschen trouble.
Wie zum bsp. mit
Zitat:
Du hast nix mal probeweise auf 32 Bit umgestellt
eigentlich hatte ich das und dann bekam ich cryptische bilder in meiner "ich-habe-mir-ne-seltsame-grafik-routine-geschieben-funktion". So richtig schön mir verzerrung usw.

Des Weiteren:
Zitat:
5. Ein wenig Assembler würde da nochmehr tun
Tolle Idee! Wäre bei diesem Pukt bloß sehr hilfreich, wenn ich assambler könnte. (Fällt also aus... Ich muss auch gestehen, das ich noch nicht mal C kann... in sofern bin ich von solchen low-level sachen noch meilen entfernt.)

So nun ja habe viel in meimem Proggi herrumgeschraubt.. Aber Irgendwie will da die performance nicht richtig kommen. Ich brauche pro frame zum rechen und zeichen immernoch so was um die 20ms. Die Grafikroutine kann man bestimmt noch schenller machen.. Habe da auch schon ewtas im Auge, was ich aber mal wieder *ich@doof.de* nicht hinbekomme.

Also wenn ich mit meinem Scanline-Kram
Code:
  for Y := 0 to Image.height - 1 do
  begin
    pt := tmp.ScanLine[Top + Y];
    inc(pt, Left);
    ps := Image.ScanLine[Y];

    for X := 0 to Image.width - 1 do
    begin
      if ((ps^.rgbRed <> 255) or (ps^.rgbBlue <> 0) or (ps^.rgbGreen <> 0)) then
        pt^ := ps^;
      inc(pt);
      inc(ps)
    end;
  end;
Meinen Ball auf das tmp-Bitmap kopiert habe um es nachher mit meiner Render-Prozedur herraus zu geben, muss ich beim rendern später
Code:
Canvas.Draw(0, 0, tmp);
nehemen. Wenn ich die von Muetze1 vorgeschlagene
Code:
  BitBlt(Parent.Handle, 0, 0, tmp.Width, tmp.Height, tmp.Canvas.Handle, 0, 0, SRCCOPY);
benutzen will fehlt der Ball, den ich, so dachte ich zu mindest, gerade reingezeichnet habe. Mit der Draw() geschichte funzt es aber...

2. Wie man oben sieht mache ich den ganzen Scanline-Kram nur, damit ich eine Farbe (255,0,0) rausfiltern kann. Hab mal ein bisschen gesucht und herrausgefunden, dass es eine Funtkion namens MaskBlt gibt. Da ich eh von jedem Bil eine Schwarz-weis version habe um das abprallen zu erleichtern könnte ich doch auch die benutzen? oder?

Ich habe bei google und hier nirgend was gefunden, wie genau ich den krams benuzte... Beimm selbst dran testen bin ich an diesen seltsam 32Bit-Tenär-Operator geschietert... Hab mir zwar das durchgelesen was das MSDN dazu sagt aber.. JA! (Das ist ja schön? Kann man das essen?)

Also falls dazu wer ein tutorial rumliegen hat... -> thx

cya
Corelgott
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:10 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