Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi [Bass.dll] CPU auslastung wegen Visualization (https://www.delphipraxis.net/89759-%5Bbass-dll%5D-cpu-auslastung-wegen-visualization.html)

DIET3RIX 5. Apr 2007 11:28


[Bass.dll] CPU auslastung wegen Visualization
 
Hey Leute,

ich hab da ma 'n Problem mit meinem Projekt und zwar mit der Visualization mit Hilfe von Bass.dll (2.3.0.2) [Spektrum].
Durch die hab ich ca. 80% CPU Auslastung, deaktiviere ich den Timer2 [Interval: 33] hab ich 10-20% der CPU Auslastung. Deaktiviere ich noch einen Timer1 [Interval: 100] habe ich eine Auslastung von max 2% (habe 2 Timer drin').

Wie kann ich die Auslastung vermeiden bzw. womit kann ich die Timer ersetzen?

Hier die Procedure von dem Timer, der für die Visualization verantwortlich ist:

Delphi-Quellcode:
procedure TMain_Form.Timer2Timer(Sender: TObject);
var
  FFTFata : TFFTData;
begin
  if BASS_ChannelIsActive(aChannel) <> BASS_ACTIVE_PLAYING then Exit;

  BASS_ChannelGetData(aChannel, @FFTFata, BASS_DATA_FFT1024);
  Spectrum.Draw(vis_img.Canvas.Handle, FFTFata, 0, 0);
  vis_img.Repaint; // lasse ich das Weg, kriege ich nichts angezeigt :/
//^-- Den Befehl hab ich nirgendswo in den Demos gefunden.
end;
Ach ja, habe P4 3GHz HT (FSB: 800 MHz) und 1,5 GB RAM (FSB: 400 MHz)

EWeiss 5. Apr 2007 16:03

Re: [Bass.dll] CPU auslastung wegen Visualization
 
Zitat:

Zitat von DIET3RIX
Hey Leute,

ich hab da ma 'n Problem mit meinem Projekt und zwar mit der Visualization mit Hilfe von Bass.dll (2.3.0.2) [Spektrum].
Durch die hab ich ca. 80% CPU Auslastung, deaktiviere ich den Timer2 [Interval: 33] hab ich 10-20% der CPU Auslastung. Deaktiviere ich noch einen Timer1 [Interval: 100] habe ich eine Auslastung von max 2% (habe 2 Timer drin').

Wie kann ich die Auslastung vermeiden bzw. womit kann ich die Timer ersetzen?

Hier die Procedure von dem Timer, der für die Visualization verantwortlich ist:

Delphi-Quellcode:
procedure TMain_Form.Timer2Timer(Sender: TObject);
var
  FFTFata : TFFTData;
begin
  if BASS_ChannelIsActive(aChannel) <> BASS_ACTIVE_PLAYING then Exit;

  BASS_ChannelGetData(aChannel, @FFTFata, BASS_DATA_FFT1024);
  Spectrum.Draw(vis_img.Canvas.Handle, FFTFata, 0, 0);
  vis_img.Repaint; // lasse ich das Weg, kriege ich nichts angezeigt :/
//^-- Den Befehl hab ich nirgendswo in den Demos gefunden.
end;
Ach ja, habe P4 3GHz HT (FSB: 800 MHz) und 1,5 GB RAM (FSB: 400 MHz)

Naja eigentlich gehört das nach Multimedia
Versuchs doch einfach mal weniger Samples zu übergeben wenn das Spectrum nur 32 bars zur verfügung stellt
reicht es aus wenn du nur 512 übergibst.

Mit den Schnipsel kann auch niemand was anfangen.
Die frage ist doch wie das Render Event aussieht, wie umfangreich das ist.
Die auslastung müßte eigentlich bei 0% liegen

gruss Emil

DIET3RIX 5. Apr 2007 16:28

Re: [Bass.dll] CPU auslastung wegen Visualization
 
Oke, ich hab ma ein bissle rumprobiert und habe festgestellt, dass das an "vis_img.Repaint;" [Image] liegt.

Lasse ich den weg, dann passiert nichts, also keine Visualization.
Das komische ist, dass ich den Befehl in dem Demo nicht gefunden habe.

So, dann hab ich den Befehl auskommentiert und den 2. Timer angemacht und siehe da ich hab wieder 40-50 % an Auslastung.

D.h. dann also, dass das an dem repaint Befehl, aber auch an dem Timer liegt.

Gibt es 'ne Möglichkeit den Timer durch irgendwas anderes Ähnliches zu ersetzen?

MrKnogge 5. Apr 2007 16:34

Re: [Bass.dll] CPU auslastung wegen Visualization
 
Moin schau dir mal folgenden Thread, vielleicht hilft dir das ja.

http://www.delphipraxis.net/internal...light=spectrum

Gruß

DIET3RIX 5. Apr 2007 17:33

Re: [Bass.dll] CPU auslastung wegen Visualization
 
leider funzt das immer noch nicht.

Hab versucht den Code mit der Zeile: "Self.Canvas.Brush.Style := bsClear;" zu ergänzen, aber ich bekomme das nicht Compiliert: "[Fehler] spectrum_vis.pas(130): Undefinierter Bezeichner: 'Canvas'"

Und wieso muss ich immer Repaint hinzufügen in dem Demo sieht man nichts von.

EWeiss 5. Apr 2007 20:49

Re: [Bass.dll] CPU auslastung wegen Visualization
 
Zitat:

Zitat von DIET3RIX
leider funzt das immer noch nicht.

Hab versucht den Code mit der Zeile: "Self.Canvas.Brush.Style := bsClear;" zu ergänzen, aber ich bekomme das nicht Compiliert: "[Fehler] spectrum_vis.pas(130): Undefinierter Bezeichner: 'Canvas'"

Und wieso muss ich immer Repaint hinzufügen in dem Demo sieht man nichts von.

Würde vielleicht mal die eigenschaften des Image untersuchen
ob es da nicht eine automatische refresh methode gibt.

Untersuche doch mal die eigenschaft des image aus dem Sample und mit deiner..

gruss Emil

Ghostwalker 6. Apr 2007 06:39

Re: [Bass.dll] CPU auslastung wegen Visualization
 
Du kannst statt Repaint mal ein invalidate benutzen. Das zeichnet zwar auch das image neu, aber macht etwas weniger als repaint (soweit ich das im Kopf hab).

Wie EWeiss schon meinte reichen dir auch 512 aus. :)

Alternativ kannst du es auch so machen, das du statt das ganze "zufuss" zeichnest, einfach die entsprechenden Teile aus einem Bitmap kopierst. So hab ich das mal gemacht. Wenn du ein Beispiel brauchst -> sag bescheid :)

EWeiss 6. Apr 2007 07:56

Re: [Bass.dll] CPU auslastung wegen Visualization
 
Zitat:

Zitat von Ghostwalker
Du kannst statt Repaint mal ein invalidate benutzen. Das zeichnet zwar auch das image neu, aber macht etwas weniger als repaint (soweit ich das im Kopf hab).

Wie EWeiss schon meinte reichen dir auch 512 aus. :)

Alternativ kannst du es auch so machen, das du statt das ganze "zufuss" zeichnest, einfach die entsprechenden Teile aus einem Bitmap kopierst. So hab ich das mal gemacht. Wenn du ein Beispiel brauchst -> sag bescheid :)

Genau!
Ich benutze für das Originale Spectrum (Winamp) nur 256.
Allerdings unterstützt Bass das mit seinen Flag nicht, da muss man sich schon selbst was basteln.

Die Samples durch eine Schleife laufen lassen und dem array neu zuordnen.
Habe selbst unter Vb eine CPU last von -80% ;)

Gruss Emil

DIET3RIX 6. Apr 2007 10:06

Re: [Bass.dll] CPU auslastung wegen Visualization
 
So Leute vielen Dank für eure Hilfe und hiermit entschuldige ich mich für meine Dummheit :wall:

Für die Visualization wird TPaintBox benutzt und das Image wird dahintergelegt :wall:

So sieht das jetzt aus und man braucht kein Repaint usw ;)

Delphi-Quellcode:
procedure TMain_Form.Timer2Timer(Sender: TObject);
var
  FFTFata : TFFTData;
begin
  if BASS_ChannelIsActive(aChannel) <> BASS_ACTIVE_PLAYING then Exit;

  BASS_ChannelGetData(aChannel, @FFTFata, BASS_DATA_FFT512);
  Spectrum.Draw(vis.Canvas.Handle, FFTFata,0,0);
end;
Ein Problem hab ich noch mit dem 2. Timer, aber das guck mir jetzt mal in Ruhe an.

Nochmals vielen Dank :hi:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:23 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