Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 13, 2025 09:28

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Rechenintensive Farben
BeitragVerfasst: So Okt 29, 2006 11:29 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Hi. Bei meiner Particleengine habe ich eine funktionierende Farbinterpolation durch dynamische Arrays erstellt:
Code:
  1. procedure TContainer.Advance(aTime : Integer);
  2. var i : Integer;
  3.     Farbe: TColorInterpolArray;
  4.  
  5.     function CalculateColor: TVector3f;
  6.     var j, Count, CurrField: Integer;
  7.         ColorDiff:TVector3f;
  8.     begin
  9.       Count := Length(Farbe);
  10.       if Count-1 = 0 then
  11.       begin
  12.         Result[0]:=1;
  13.         Result[1]:=1;
  14.         Result[2]:=1;
  15.       end
  16.       else
  17.       begin
  18.         Result[0]:=Farbe[0].Color[0];
  19.         Result[1]:=Farbe[0].Color[1];
  20.         Result[2]:=Farbe[0].Color[2];
  21.  
  22.         if Count>1 then
  23.         begin
  24.           for j:=Count-1 downto 0 do
  25.           begin
  26.             if (LiveSpan <= StartLiveSpan/Count*(j+1)) then CurrField:=j;
  27.           end;
  28.           for j:=0 to 2 do
  29.           begin
  30.             if CurrField = 0 then ColorDiff[j] := Farbe[CurrField].Color[j]
  31.             else ColorDiff[j] := Farbe[CurrField].Color[j] - Farbe[CurrField-1].Color[j];
  32.             Result[j]    := ColorDiff[j]/(StartLiveSpan/aTime);
  33.           end;
  34.         end;
  35.       end;
  36.     end;
  37. begin
  38.   LiveSpan := LiveSpan - aTime;
  39.   if (LiveSpan <= 0) then LiveSpan := StartLiveSpan;
  40.           // 30fps verlust!!!
  41.   Farbe := Colors;
  42.   for i:=0 to FNumParticles-1 do
  43.   begin
  44.     with Particles[i] do
  45.     begin
  46.       Color := AddVector(Color, CalculateColor);
  47.  
  48.       Speed       := Speed    + (Acceleration*aTime/1000);
  49.  
  50.       Position[0] := Position[0] + Direction[0] * Speed * aTime/1000;
  51.       Position[1] := Position[1] + Direction[1] * Speed * aTime/1000;
  52.       Position[2] := Position[2] + Direction[2] * Speed * aTime/1000;
  53.       LiveSpan    := LiveSpan - aTime;
  54.       Age         := Age      + aTime;
  55.     end;
  56.   end;
  57. end;


Farbe := Colors greift auf ein property der Klasse zu und bekommt ein Dynamisches Array zurueck.
Es könnten also 3 aber auch 30 sein, obwohl das nicht viel sinn haette mit 30.
Auf jeden Fall ist mein problem: ohne Farbinterpolation habe ich bei etwa 5000 Particle 100 FPS und mit habe ich gleich nur noch 60. Das sollte ja nicht sein. Kann man die Rechnung vereinfachen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Okt 29, 2006 12:23 
Offline
DGL Member

Registriert: Do Mai 30, 2002 18:48
Beiträge: 1617
wahrscheinlich nicht, aber du kannst es dem compiler ermöglichen, divisionen herauszuwerfen und ihn stattdessen multiplikationen rechnen lassen und ergebnisse die du mehrmals braucht in variablen ablegen, damit der Compiler es nicht mehrfach berechnet und so Ergebnisse auch in registern halten kann. z.B.:
Code:
  1.  
  2. Color := AddVector(Color, CalculateColor);
  3.  
  4. atd1000 = (1.0/1.000)*aTime;
  5. //So zwingst du den Compiler zur multiplikation und division zur Compilezeit.
  6. //Hinten dividieren nötigte Delphi zu meiner Zeit immer zu echten Divisionen
  7. //Nachzuprüfen im CPU-Fenster <!-- s;-) --><img src=\"{SMILIES_PATH}/icon_wink.gif\" alt=\";-)\" title=\"Wink\" /><!-- s;-) -->
  8.  
  9. Speed := Speed + (Acceleration*atd1000);
  10. SpdTime = Speed*atd1000; //brauchen wir ja häufiger
  11.  
  12. Position[0] := Position[0] + Direction[0] * SpdTime;
  13. Position[1] := Position[1] + Direction[1] * SpdTime;
  14. Position[2] := Position[2] + Direction[2] * SpdTime;
  15. LiveSpan := LiveSpan - aTime;
  16. Age := Age + aTime;
  17.  

Den gleichen Spaß kannst du in CalculateColor auch machen. EIn bsichen Tempo kannst du so herausholen. Leider gibt es die Seite Optimalcode nicht mehr, da standen viele solcher Tipps für Delphi drinne. Ansonsten musst du halt mal mit Stift und papier deine Rechnungen durchklopfen und sehen, ob sich was vereinfachen lässt - manchmal merkt man dann, daß man noch viel Scheiß rauswerfen kann.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]