![]() |
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 |
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.
|
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. |
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 ![]() |
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:
Die Auftrennung in zwei Prozeduren macht die Sache klarer und flexibler.
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; 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. |
AW: brauche hilfe mit LineTo und MoveTo
Also eigentlich erwartet BitBlt gar kein hWnd sondern ein hDC...
|
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:
aus der Bass hilfe Zitat:
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 |
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