Autor |
Beitrag |
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 05.09.10 15:07
Zuletzt bearbeitet von delfiphan am So 05.09.10 15:33, insgesamt 1-mal bearbeitet
Für diesen Beitrag haben gedankt: Tilman
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: So 05.09.10 15:33
und wenn du die 2 schleifen tauschst kommst du mit einem Inc(Pixel) aus
dann sparst du dir die multiplikation, da deine variante schon fast langsamer ist, als ein ständiger scanline aufruf.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 05.09.10 15:35
Mir ging es oben nicht darum, optimierten Code zu zeigen. Das X + Y * N wär überhaupt nicht nötig, da der Pointer bei jedem Durchlauf sowieso nur 4 hochzählt. Ich wollte aber andeuten, dass man eigentlich mit BytesPerScanline arbeiten sollte, wenn man andere Pixelformats verwendet.
Folgendes würde für den Fall oben reichen:
Delphi-Quelltext 1: 2:
| Base^ := Integer((X and Y) > 0) * $FFFFFF; Inc(Base); |
Aber bei mir läuft das sowieso in 0.1ms durch. Da noch weiter zu optimieren wäre reine Zeitverschwendung. Wenn die Performance so wichtig ist, würde ich dann doch auf Hardwarebeschleunigung zurückgreifen, da kriegst du den Gradienten geschenkt.
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: So 05.09.10 16:09
Und ich wollte drauf hinweisen, dass scanline nicht viel mehr macht, als eine multiplikation und einen speicherzugriff. also soviel wie dein code auch.
dein letzter post stimmt nicht: du müsstest noch die x und y schleife vertauschen.
gut bei nem quadrat ist das egal, aber vom prinzip.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 05.09.10 16:11
Flamefire hat folgendes geschrieben : | Und ich wollte drauf hinweisen, dass scanline nicht viel mehr macht, als eine multiplikation und einen speicherzugriff. also soviel wie dein code auch.
dein letzter post stimmt nicht: du müsstest noch die x und y schleife vertauschen.
gut bei nem quadrat ist das egal, aber vom prinzip. |
Richtig, das müsste man noch ändern.
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: So 05.09.10 16:11
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: So 05.09.10 16:14
ähm...scanline läuft richtig rum:
von 0,0->0,1->0,2...->0,h
deine lösung sollte im zugriff langsamer sein. und vermutlich musst du das auch wieder freigeben. bin nicht ganz sicher.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 05.09.10 16:15
Wieso, weiss ich nicht genau aber vermutlich war das für gewisse Fälle schneller. Man google nach "bottom-up dib".
Wenn man die Art des Bitmaps nicht genau kennt, sollte man ScanLine verwenden. Es berücksichtigt die Alignment am Rand und bottom-up vs. top-down. Wenn man das Bitmap kennt, kann man sich die Fallunterscheidungen sparen. Ein grosser Geschwindigkeitsunterschied wird das aber tatsächlich nicht machen.
Zuletzt bearbeitet von delfiphan am So 05.09.10 16:17, insgesamt 1-mal bearbeitet
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 05.09.10 16:15
Scanline läuft richtig rum; allerdings werden Bitmaps im Speicher von Unten nach Oben abgelegt, daher die umgekehrte Zeilenzählung.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 05.09.10 16:17
So ich versuch mal wieder zu Antworten was ich alles gemacht habe!
Bevor ihr euch die besten Ideen untereinander erklärt  und ich evtl gar nix mehr verstehe!
@delfiphan: Was mache ich aber mit der StartFarbe. Bei Dir würde es mit schwarz beginnen und in weiss enden. Wenn ich es richtig sehe, und wie dann mit der 2.bitmap. Das OpenGL/DirectX besser sind ist auch mir klar! Nur ist es auch ne Zeit und verstehen frage. Siehst Doch selbst wie lange ich nur für so ein bischen brauche
@Flamefire: Deine Funktioniert, nur muss man nicht mit 0 Anfangen sondern mit
Delphi-Quelltext 1:
| pl:= peakbufl.ScanLine[peakbufl.Height-1]; |
und die For schleife dann rückwärts laufen lassen!
So wie es bei Dir steht kommt es zum peng schon nach dem 2. Durchlauf! Getestet
Jedenfalls bei mir! Allerdings wüsste ich jetzt nicht wie ich in der gleichen Forschleife die 2.bitmap mit der Farbe fülle und zwar entgegengesetzt!
Flamefire hat folgendes geschrieben : | was meinst du nun mit invertieren?
da die Farben der unteren Bitmap andersrum sind als oben? |
jo das meinte ich!
Bin aber auch an @BenBE Idee dran. Nur muss ich erst mal wieder verstehen was er mit SizeOf( PixelRGB) meint/hernimmt
Anbei weis ich immer noch nicht was man hier evtl noch machen kann!
Delphi-Quelltext 1: 2: 3:
| r:= trunc(102+ (255 - 102) / peakbufl.Height *ypos); g:= trunc(113+ (255 - 113) / peakbufl.Height *ypos); b:= trunc(126+ (255 - 126) / peakbufl.Height *ypos); |
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Tilman
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: So 05.09.10 16:20
Okay ihr habt natürlich völlig recht, nur stellt sich um so mehr die Frage warum in meinen Ausgaben der Hilfe (Delphi 7 und Delphi 2006) kein Pieps davon erwähnt wird, das Scanline[height-1] die gesamten Pixeldaten liefert. Hätte mir ne Stunde rumgesuche erspart ^^
_________________ Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 05.09.10 16:21
Mein Code löst weder das Gescheindigkeitsproblem noch generiert es einen Gradienten. Es zeigt lediglich, dass es reicht, 1x Scanline aufzurufen.
--- Moderiert von Narses: Beiträge zusammengefasst---
Tilman hat folgendes geschrieben : | Okay ihr habt natürlich völlig recht, nur stellt sich um so mehr die Frage warum in meinen Ausgaben der Hilfe (Delphi 7 und Delphi 2006) kein Pieps davon erwähnt wird, das Scanline[height-1] die gesamten Pixeldaten liefert. Hätte mir ne Stunde rumgesuche erspart ^^ |
Das muss auch nicht zwingend so sein (du kannst auch theoretisch ein top-bottom dib mit TBitmap betreiben). Das ganze benötigt aber Systemwissen und ist nicht wirklich ein Delphi-Feature, daher auch nicht so dokumentiert, denk ich mal.
// Sorry, Mods, bitte Posts zusammenführen, falls erwünscht.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: So 05.09.10 16:30
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: So 05.09.10 16:56
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 05.09.10 16:59
Wenn Geschwindigkeit, dann mit Integers rechnen.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 05.09.10 17:02
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: So 05.09.10 17:14
integer gehen wirklich nicht.
und dein fehler kommt vom abschreiben...erst denken
oder nimm meins. da ist dasschon gefixt
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 05.09.10 17:19
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 05.09.10 17:46
Flamefire hat folgendes geschrieben : | integer gehen wirklich nicht. |
Du musst einfach zuerst multiplizieren, dann dividieren.
|
|
ALF 
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 05.09.10 18:48
Bei aller Diskusion wurde vergessen wie ich es machen kann das ich, wenn ich schon nur mit 1*scanline arbeite, die Farbe nun für die 2.Bitmap verändern kann? Meine Versuche haben ja nix gebracht!
@BenBE Vorschlag bekomme ich auch nicht gebacken  .Währe ja auch ne überlegung wert.
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|