AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi brauche hilfe mit LineTo und MoveTo
Thema durchsuchen
Ansicht
Themen-Optionen

brauche hilfe mit LineTo und MoveTo

Ein Thema von Wishmaster · begonnen am 13. Apr 2013 · letzter Beitrag vom 13. Apr 2013
Antwort Antwort
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#1

brauche hilfe mit LineTo und MoveTo

  Alt 13. Apr 2013, 08:34
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
Miniaturansicht angehängter Grafiken
vis.jpg  
Angehängte Dateien
Dateityp: pas Bass_Vis.pas (6,3 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#2

AW: brauche hilfe mit LineTo und MoveTo

  Alt 13. Apr 2013, 08:42
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.

Geändert von Namenloser (13. Apr 2013 um 08:42 Uhr) Grund: Anhang nicht gesehen
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#3

AW: brauche hilfe mit LineTo und MoveTo

  Alt 13. Apr 2013, 09:03
danke für die antwort. und der code ist dabei
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.

Geändert von Wishmaster (13. Apr 2013 um 09:05 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: brauche hilfe mit LineTo und MoveTo

  Alt 13. Apr 2013, 09:15
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.
Angehängte Dateien
Dateityp: pas Bass_Vis.pas (4,7 KB, 8x aufgerufen)

Geändert von Namenloser (13. Apr 2013 um 09:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: brauche hilfe mit LineTo und MoveTo

  Alt 13. Apr 2013, 10:18
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.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: brauche hilfe mit LineTo und MoveTo

  Alt 13. Apr 2013, 10:30
Also eigentlich erwartet BitBlt gar kein hWnd sondern ein hDC...
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
301 Beiträge
 
Delphi XE2 Architect
 
#7

AW: brauche hilfe mit LineTo und MoveTo

  Alt 13. Apr 2013, 12:06
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?"

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
Angehängte Dateien
Dateityp: pas Bass_Spectrum.pas (8,4 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

AW: brauche hilfe mit LineTo und MoveTo

  Alt 13. Apr 2013, 14:52
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...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 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