![]() |
AW: schnelstmöglich dividieren?
Ich nochmal:
Also im Moment ist es ja so, dass ich bei jedem Pixel dividieren muss. Allerdings werkelt da noch so einiges nebenher, womit das nicht die einzigen operationen wären. Stellen wir uns mal vor, ich dividiere nicht im rasterizer, sondern speicher im Rasterizer nur pro pixel die werte für die Formeln ab. Wenn der rasterizer durchgelaufen ist, gehe ich durch diesen FormelBuffer und kalkuliere dann erst die Farbwerte der pixel. Einerseits kann ich dann ungestört alle Berechnungen direkt hintereinander ausführen(mh...-> optimierung hier vllt besser möglich weil ich nicht mehr switchen muss?) andererseits werden mehrfach berechnungen der farben pro pixel absolut verhindert(kommt hier noch nicht zum tragen, aber bei komplexeren umgebungen). Eine formel kann im schlimmsten fall mehrfach überschrieben werden, aber der finalstep kalkuliert erst. Jemand noch Ideen? MFG Memnarch |
AW: schnelstmöglich dividieren?
Zitat:
Vielleicht könnte bit4bit mal erläutern was er sich dabei gedacht hat. |
AW: schnelstmöglich dividieren?
oh klasse 1/wert zu multiplizieren wär super...dan hab ich wieder ne float und müsste truncaten >.<
|
AW: schnelstmöglich dividieren?
na ja, bit4bit's idee war sicherlich, das nicht auf Float-Basis zu machen sondern bei Integer-Werten zu bleiben.
Warten wir doch mal seine Erklärung ab, wie er sich das gedacht hat. Vielleicht funktioniert das ja irdenwie. Ich hab mich mit dieser speziellen Thematik bisher noch nicht beschäftigt und kann keine fundierte Aussage machen ob das prinzipiell möglich ist oder nicht. Schneller wäre diese Version vermutlich. |
AW: schnelstmöglich dividieren?
Wenn dass wirklich das ist was bit4bit's Idee war, und das funktioniert, bin ich dochmal gespannt.
|
AW: schnelstmöglich dividieren?
Eine Frage, die bisher unbeantwortet ist: Wie oft ändert die der Divisions-Wert und in welchem Bereich liegt er? Zu Division via inverser Multiplkation gibt's seit ewigen Zeiten Beispiele:
![]() ![]() und viele andere. Wenn Wert lokal-konstant ist, oder nur einen relativ kleinen Bereich umfaßt, kann man die Inversen vorberechnen bzw in die Routinen packen, die Wert berechnen (brauchst Du den überhaupt zu was anderen als zum Dividieren?). |
AW: schnelstmöglich dividieren?
Wert ändert sich pro Triangle, nicht voraussehbar da sich umgebung/triangles verändern.
Gerade mal getestet: bit4bit's methode funktioniert SO:
Delphi-Quellcode:
Dem gegenüüber die 'alte' methode:
Wert2 := Integer((2 shl 12) div Wert);
Ergebnis := Integer(((A*x + B*Y + C*Z) * Wert2) shr 13); Ergebnis2 := Integer(((A*x2 + B*Y2 + C*Z2) * Wert2) shr 13); Ergebnis3 := Integer(((A*x3 + B*Y3 + C*Z3) * Wert2) shr 13);[/U]
Delphi-Quellcode:
Wenn ich beides Jeweils 100Millionen mal ausführe (wert2 natürlich nur einmal kalkuliert)
Ergebnis := (A*x + B*Y + C*Z) div Wert;
Ergebnis2 := (A*x2 + B*Y2 + C*Z2) div Wert; Ergebnis3 := (A*x3 + B*Y3 + C*Z3) div Wert; Stellt sich heraus, beides ergibt dasselbe ergebnis, Bit4Bits methode ist aber 4mal SCHNELLER. Seine methode braucht ca 1Sec. Meine 4Sec. |
AW: schnelstmöglich dividieren?
Wenn Du die Shifts so anpaßt, daß shr 13 zu shr 32 würde und mit Inline-ASM arbeitest, dann kannst Du Dir die Shifts sparen, denn das Ergebnis steht in EDX (und das ganze wäre wohl noch etwas genauer).
|
AW: schnelstmöglich dividieren?
@gammatester: ich soll shr auf 32 ändern? bit4bit's beispiel mit shr/shl 32 klappt nicht, da komtm immer 0 raus.
Könntest du mir es bitte etwas genauer erklären was du meinst o.O? EDIT: mal ganz abgesehen davon hab ich gerade ein problem: Ergebnis ist ein Byte wert(farbe eben), und wnen ich nen hardcast Integer reinpacke gibts zwar keine fehler....aber alle farbwerte immer schwarz :stupid: |
AW: schnelstmöglich dividieren?
Das ist bei mir ganz anders.
Bei 100 Mio Durchläufen braucht (bei mir) die "alte" 1125 ms, die "neue" 843 ms, wobei auch bei mir Wert2 nur einmal berechnet wird. Auch die Ergebnisse sind nicht identisch. Bei den Werten, die ich in einem früheren Beitrag eingesetzt habe erhalte ich folgende Ergebnisse "alte" 25324 235794 447532 "neue" 25278 235362 446713 Ich kann allerdings nicht beurteilen, diese eher geringfügigen Differenzen tolerierbar sind. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz