AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

schnelstmöglich dividieren?

Ein Thema von Memnarch · begonnen am 26. Mai 2011 · letzter Beitrag vom 1. Jun 2011
Antwort Antwort
Seite 6 von 6   « Erste     456   
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#51

AW: schnelstmöglich dividieren?

  Alt 30. Mai 2011, 16:51
ACH MIST,
ja lag daran dass ich zu kleine werte eingegeben hatte. Je größer die werte sind, umso ungenauer wird es >.<.

€dit: Zeitlich aber weiterhin dasselbe.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#52

AW: schnelstmöglich dividieren?

  Alt 30. Mai 2011, 16:59
Hier ein Beispiel (Anzeigewert ist jeweils 12345):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  res,test, wert, iwert: longint;
begin
  wert := 10000;
  iwert := (int64(1) shl 32) div wert;
  test := 123456789;
  ShowMessage('Div: '+inttostr(test div wert));
  asm
    mov eax,[test]
    mul [iwert]
    mov [res],edx
  end;
  ShowMessage('Mul: '+inttostr(res));
end;
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#53

AW: schnelstmöglich dividieren?

  Alt 30. Mai 2011, 17:23
WOW klasse.
Mit dieser Methode ist meine spitzen fps von 28-30 auf 52(!!) gestiegen. Ich wusste doch dass die divs und die float/int das waren. Klasse .

MFG
Memnarch
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.067 Beiträge
 
Delphi XE2 Professional
 
#54

AW: schnelstmöglich dividieren?

  Alt 30. Mai 2011, 23:58
@gammatester:
Funktioniert einwandfrei. Mal wieder was dazugelernt.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
bit4bit

Registriert seit: 14. Jun 2006
Ort: Köln
25 Beiträge
 
#55

AW: schnelstmöglich dividieren?

  Alt 31. Mai 2011, 01:13
Sorry, da hatte ich einen Flüchtigkeitsfehler drin.

Delphi-Quellcode:
PROCEDURE Test1;
var Wert2 : Integer;
begin
   Wert2 := Integer((Int64(1) shl 32) div Wert); { <<<------ war falsch }
   Ergebnis := Integer(((A*x + B*Y + C*Z) * Wert2) shr 32);
   Ergebnis2 := Integer(((A*x2 + B*Y2 + C*Z2) * Wert2) shr 32);
   Ergebnis3 := Integer(((A*x3 + B*Y3 + C*Z3) * Wert2) shr 32);
end;
Ich benutze einfach nur die Nachkommastellen einer Binärzahl, die 32 bit vor,
und 32 bit nach dem Komma hat. Also 2^32 entspricht der 1 ( =2^0 ).
Wenn ich 2^32 div Wert rechne, hab ich vor dem gedachten Binärkomma immer 0
stehen (Jedenfalls bei den Werten, die hier infrage kommen).
Ich benutze also zur Multiplikation immer nur die 32 bit nach dem Binärkomma
und weiß, dass mein Ergebnis um den Faktor 2^32 zu hoch ist.
Durch die Verwendung von EDX nach der Multiplikation kann ich mir ein "shr 32"
sparen.

Das Ganze würde natürlich auch mit 2^16 klappen, das Ergebnis kann ja nur 8 bit
haben! Wäre aber nur mit 16 bit Arithmetik praktisch. Das Ergebniss wär dann
eben in DX .

@gammatester

Meine Idee ist im Prinzip so, wie du sie umgesetzt hast. Wenn jetzt noch alle
Variablen als Integer definiert werden, wird’s bestimmt schneller.

@Memnarch

Wenn Du linear äquidistant interpolierst gibt’s nix schnelleres als den Bresenham-
Algorithmus. Funktioniert ja nicht nur bei x/y Koordinaten, sondern auch x/r ,
x/g und x/b . Er ist sehr genau und sehr schnell, da nur Additionen und
Subtraktionen vorkommen.
Es gibt in der Literatur eine Menge an Vorschlägen für seine Optimierung.

Tuning Tip:
Vermeide unbedingt Unterprogramme, Sprünge ( if ... then ... else ) und Schleifen
( for , while , until ) wo immer das geht. Die heutigen CPUs haben sehr lange
execution pipelines und trotz sehr aufwändiger branch prediction geht dabei immer
noch eine Menge an cycles verloren um die pipelines neu zu laden.

Wenn Du irgendwann mal ein wenig von Deinem Code zeigst, können wir Dir bestimmt
noch ein paar Tips geben, wo noch was zu holen ist!

Viel Spaß, bit4bit
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#56

AW: schnelstmöglich dividieren?

  Alt 31. Mai 2011, 11:25
@Bit4Bit: Den code kann ich leider nciht zeigen. Den habe ich während der Arbeitszeit geschrieben, und ist somit unter Verschluss. Wenn ich das ganze hier zuhause nochmal schreibe, werd ichs mal posten, aber zuhause momentan beschäftigt mit anderen programmen^^


MFG
Memnarch
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#57

AW: schnelstmöglich dividieren?

  Alt 1. Jun 2011, 09:11
Entshculdigt ich bins nochmal:

@Bit4Bit: in einem der vorherigen Posts hatte ich einen Formelbuffer erähnt. Dabei hatte ich gedacht, dass ich im Ratserizer nicht mehr direkt die Pixel(Farben) berechne, sondern lediglich in einen Buffer pro pixel abspeichere, was ich für den jeweiligen Pixel berechnen muss(also die zahlenwerte). Sobald der Rasterizer durchgelaufen ist, nudel ich dan einfach alle berechnungen des Buffers Durch. Der vorteil wäre, dass ich die Farbwerte eines Pixels 100% niemals doppelt berechne. Eine formel kann bei schlechter sortierung höchstens mehrfach überschrieben werden.

MFG
Memnarch
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 6   « Erste     456   


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:

(?)

LinkBack to this Thread

Erstellt von For Type Datum
Untitled document Post #0 Refback 30. Mai 2011 17:36

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:45 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