Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi brauche hilfe mit LineTo und MoveTo (https://www.delphipraxis.net/174272-brauche-hilfe-mit-lineto-und-moveto.html)

Wishmaster 13. Apr 2013 07:34

brauche hilfe mit LineTo und MoveTo
 
Liste der Anhänge anzeigen (Anzahl: 2)
hi. ich bräuchte mal wieder eure hilfe. und zwar mit den funktionen LineTo und MoveTo
ich arbeite an einer Spectrum Komponente für die bass.dll
ich versuche alle Kanäle gleichzeitig darstellen, und für jeden Kanal benutze ich eine separaten Loop
was zu viele ressourcen frisst. so für (7.1 Surround) sind das 8 Loops die alle ~30 msec abgefragt werden

so meine frage ist, weiß jemand eine bessere lösung/optimierung


ich habe versucht das mit nur einem Loop zu machen doch leider wird das nicht richtig gezeichnet.


thanks in advance

Namenloser 13. Apr 2013 07:42

AW: brauche hilfe mit LineTo und MoveTo
 
Leider enthältst du uns den Quellcode vor, aber was mir beim dem kleinen Fetzen Code, den man im Hintergrund sieht, sofort auffällt: Du setzt bei jeder Iteration die Eigenschaften des Pen neu. Du solltest das nur einmalig vor der Schleife machen. Ich denke, das sollte schon einen deutlichen Performance-Sprung ausmachen.

Wishmaster 13. Apr 2013 08:03

AW: brauche hilfe mit LineTo und MoveTo
 
danke für die antwort. und der code ist dabei :wink:
ich habe den Pen aus dem loop genome und wie erwartet keine änderung.
nur die Vis komponente benutzt 1% von meinem i7-3960x, und das nur mit 4 Kanäle/Loop's
was bei meinem Computer nicht so auffällt
das ist natürlich eine ganz andere sache wenn dein computer nicht so viel power hat.

Namenloser 13. Apr 2013 08:15

AW: brauche hilfe mit LineTo und MoveTo
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mir mal erlaubt, deinen Code zu formatieren – das ist nämlich sehr anstrengend zu lesen – und die ganzen Redundanzen zu entfernen. Hab außerdem Variablen aussagekräftiger benannt, ungenutzte entfernt, und noch ein paar Bemerkungen in den Code geschrieben. (Getestet habe ich es aber nicht, das war mir jetzt zu viel Aufwand). Das wird jetzt an der Performance nichts ändern, aber man kann zumindest besser damit arbeiten.

Vielleicht solltest du noch mal genau beschreiben, wo das Problem ist? Dein letzter Beitrag verwirrt mich. 1% CPU-Auslastung ist doch kein Performance-Problem? Und bist du überhaupt sicher, dass die 1% von diesem Code stammen? Letztlich ist hier auch entscheidend, wie der Code aufgerufen wird – selbst wenn dein Code nur 1+1 addieren würde, würde er, in einer pausenlosen Schleife aufgerufen, 100% CPU-Last auf einem Kern erzeugen.

Ich würde mal den Sampling Profiler runterladen, da sieht man sehr schnell, wo der Flaschenhals ist. Dazu musst du dein Projekt aber mit detailliertem Mapping und Debug-Informationen (kann man in den Projektoptionen einstellen) kompilieren.

sx2008 13. Apr 2013 09:18

AW: brauche hilfe mit LineTo und MoveTo
 
Du hast im Destruktor die Freigabe der Bitmaps vergessen.

Dann schreibst du die ganze Zeit VisBuff.Canvas ; das kostest jedesmal ein bisschen Zeit.
Ändere das mal so ab:
Delphi-Quellcode:
procedure TBass_Vis.Draw_SpectrumToCanvas(canvas:TCanvas; OffsetX, OffsetY : Integer);
begin
  // hier dein ganzer Code zum Zeichen...
  // statt VisBuff.Canvas.xxx nur noch canvas.xxx verwenden
  ...
end;

procedure TBass_Vis.Draw_Spectrum(HWND : THandle; OffsetX, OffsetY : Integer);
begin
  Draw_SpectrumToCanvas(VisBuff.Canvas, OffsetX, OffsetY);
  BitBlt(HWND, 0, 0, VisBuff.Width, VisBuff.Height, VisBuff.Canvas.Handle, 0, 0, srcCopy)
end;
Die Auftrennung in zwei Prozeduren macht die Sache klarer und flexibler.
Du übergibst in deinem alten Code ein Windowhandle.
Jeder der der Code liest denkt doch "wo wird das Handle denn benützt?".
Und dann wird es doch noch in der allerletzten Zeile verwendet.
Solche überlangen Prozeduren muss man zerlegen, speziell in dem Fall wenn ein Parameter erst ganz zum Schluss verwendet wird.

Namenloser 13. Apr 2013 09:30

AW: brauche hilfe mit LineTo und MoveTo
 
Also eigentlich erwartet BitBlt gar kein hWnd sondern ein hDC...

Wishmaster 13. Apr 2013 11:06

AW: brauche hilfe mit LineTo und MoveTo
 
Liste der Anhänge anzeigen (Anzahl: 1)
nochmal danke an alle die geantwortet habe.
ich bin mir sicher dass da noch eine menge fehler drin steken

dazu muss ich sagen, ich habe auf die schnelle die Haupt struktur der Komponente zusamen geschmissen damit ich das ganze testen könnte und sehen ob ich auf dem richtigen weg bin.

und ich habe einiges der komponente von dem bass packet delphi\SampleVis kopiert
damit ich mir nicht doppelte arbeit machen muss nur um par funktionen zu testen
davon stammt auch der type THandle in BitBlt(HWND,...)

Zitat:

// Sicher, dass das hier so stimmt? Vor allem das mit dem OR macht mich sehr stutzig
BASS_Mixer_ChannelGetData(Channel, Samples, (ChannelInfo.chans * VisBuff.Width * SizeOf(Single)) or BASS_DATA_FLOAT)
Ja! Das Stimmt so.

aus der Bass hilfe
Zitat:

Perform a 1024 sample FFT on a channel and list the complex result.

float fft[2048]; // fft data buffer
BASS_ChannelGetData(channel, fft, BASS_DATA_FFT1024|BASS_DATA_FFT_COMPLEX);


und die beanstandung wegen den variablen die ich verwendet habe, das ist doch nu wirklich nebesache. sobald ich alles fertig habe was rein muss, und ich schätze die Compo wird rund ~3000 Codezeilen, dann wird alle neu und sauber programmiert! da kommen noch verschieden Mode's rein wie Oscilloscope, Spectrum, ...
@NamenLozer da bei deinem Kommentar "magic number?" :wink:

wie gesagt das ist nur ein test


Mir ging es nur Speed optimieren!
Sampling Profiler bestätigt auch das problem liegt an LineTo

ich habe eine andere Komponente die das selbe macht ist aber um einiges schneller, siehe anhang.

so jetzt gehe ich schlafen. bei uns hier in Canada ist es schon 5:02 AM

Namenloser 13. Apr 2013 13:52

AW: brauche hilfe mit LineTo und MoveTo
 
Ok, die schnellere Komponente verzichtet anscheinend ganz auf die Line-Funktionen der GDI. Das könntest du natürlich auch versuchen; dadurch dass es in X-Richtung immer in 1-Pixel-Schritten geht, ist es ja relativ einfach: Man muss einfach nur alle Pixel in der Spalte von der Höhe des letzten Samples bis zur Höhe des aktuellen Samples einfärben. Dabei sollte man aber das Bitmap so anlegen, dass die Zeilen auf jeden Fall direkt hintereinander im Speicher liegen, so kann man einzelne Pixel mit wenig Aufwand adressieren. In Bass_Spectrum machen die das wohl von Hand, ich persönlich würde da aus Bequemlichkeit Graphics32 benutzen, dort wird das nämlich von Haus aus so gemacht (anders als beim normalen TBitmap). Es sei denn die Unit darf keine solchen Abhängigkeiten haben, dann muss man es wohl oder übel so machen...


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