Autor Beitrag
Dargor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 59

Win2k SP4, WinXP Pro SP1
D6 Pers
BeitragVerfasst: Fr 12.08.05 12:35 
In meinem Player lese ich über einen VU-Meter den aktuellen Pegel aus und lasse in Abhängigkeit des Pegels Ellipsen auf ein DXDraw (DelphiX) zeichnen. Um die Koordinaten der Ellipsen zu bestimmen, benutze ich die Formeln:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
x1 := (Screen.Height div 2) - ((VuMeter1.ValueRight * (Screen.Height div 2)) div 32768);  //32768 ist der Max-Wert vom VU-Meter
y1 := (Screen.Width div 2) - ((VuMeter1.ValueRight * (Screen.Width div 2)) div 32768);
x2 := Screen.Height - x1;
y2 := Screen.Width - y1;

Da ich insgesamt 4 Ellipsen zeichne (2 für den Pegel links, rechts & 2 für den Peak links, rechts), habe ich 16 Formeln und das geht ziemlich auf die CPU.
Die ganze Prozedur läuft in einem Extra-Thread und hat einen Sleep von 100 msek.
Trotzdem habe ich rund 10-25% CPU-Last auf meinem P4 2,53GHz. Bei einem Sleep von 200 msek sinkt die CPU-Last nicht mal um 5%. Wenn ich die Ellipsen nicht zeichnen lasse, habe ich max. 1-2% CPU-Last - es liegt also nicht am Programm selbst.

Ich nehme mal an, dass die große Menge an Ganzzahl-Divisionen ausschlaggebend dafür ist. Gibt es eine schnellere Alternative? Oder kann man die Formeln optimieren?

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.
chrisw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Fr 12.08.05 12:57 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var tempMidScreenHeight,tempMidScreenWidth : Integer;

tempMidScreenHeight := Screen.Height div 2;
tempMidScreenWidth  := Screen.Width div 2;
X2 := Screen.Height - (tempMidScreenHeight - ((VuMeter1.ValueRight * tempMidScreenHeight ) div 32768));
Y2 := Screen.Width - (tempMidScreenWidth  -((VuMeter1.ValueRight * tempMidScreenWidth ) div 32768));


Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
LigH
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 239

Win98SE, Win2000SP4
D7
BeitragVerfasst: Fr 12.08.05 15:21 
Als es noch was brachte (80286), hatte ich "div Zweierpotenz" auch mal ersetzt durch "shr Exponent", also

"div 2" = "shr 1"
"div 32768" = "shr 15"

Aber

1) lohnt sich das bei heutigen Prozessoren kaum noch,
2) schafft der Delphi-Optimizer solche Ersetzungen wahrscheinlich heute auch selber.
Dargor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 59

Win2k SP4, WinXP Pro SP1
D6 Pers
BeitragVerfasst: Fr 12.08.05 17:10 
Dass ich nicht selber darauf gekommen bin, die beiden Teile Screen.Height div 2 und Screen.Width div 2 auszulagern... immerhin wird das für JEDES x1 und y1 berechnet.
Werde das sofort erstmal probieren. Zusätzlich werde ich wohl dann auch noch den Tip von LigH ausprobieren.

Edit:
Konnte mit beiden Vorschlägen etwas über 5% an CPU-Last einsparen. Hab die Berechnung der beiden TempGrößen auch noch außerhalb des Loops verlagert - brauch ja nicht jedesmal neu berechnet werden, da man ja die Auflösung nicht ständig ändert.