![]() |
[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:
Ach ja, habe P4 3GHz HT (FSB: 800 MHz) und 1,5 GB RAM (FSB: 400 MHz)
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; |
Re: [Bass.dll] CPU auslastung wegen Visualization
Zitat:
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 |
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? |
Re: [Bass.dll] CPU auslastung wegen Visualization
Moin schau dir mal folgenden Thread, vielleicht hilft dir das ja.
![]() Gruß |
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. |
Re: [Bass.dll] CPU auslastung wegen Visualization
Zitat:
ob es da nicht eine automatische refresh methode gibt. Untersuche doch mal die eigenschaft des image aus dem Sample und mit deiner.. gruss Emil |
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 :) |
Re: [Bass.dll] CPU auslastung wegen Visualization
Zitat:
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 |
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:
Ein Problem hab ich noch mit dem 2. Timer, aber das guck mir jetzt mal in Ruhe an.
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; Nochmals vielen Dank :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:55 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