Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#70

AW: Optimierung von Pixel

  Alt 9. Apr 2016, 15:40
Verstehe ich nicht warum den Buffer vergrößern sind doch genug Daten enthalten die ich Rendern will also wenn das Bitmap 160 hoch ist.
Nochmal: Nur weil du genau passend aus dem Buffer liest, heisst das nicht, dass die DLL auch passend rein schreibt. Stell dir die Funktion in der DLL grob so vor:
Delphi-Quellcode:
function GetData(aChannel, aMaxData, aPosition: Integer): Single;
begin
  ...
end;

procedure BASS_ChannelGetData(aChannel: Integer; buf: Pointer, aDataType: TBassDataType);
var
  i: Integer;
begin
  case aDataType of
    BASS_DATA_FFT256:
      for i := 0 to 127 do
        Single((buf+(i*4))^) := GetData(aChannel, 127, i);
    BASS_DATA_FFT512:
      for i := 0 to 255 do
        Single((buf+(i*4))^) := GetData(aChannel, 255, i);
    BASS_DATA_FFT1024:
      for i := 0 to 511 do
        Single((buf+(i*4))^) := GetData(aChannel, 511, i);
    ...
  end;
end;
Wenn du diese Funktion mit dem Parameter BASS_DATA_FFT512 aufrufst, werden immer zwingend 256 Single-Werte ab der Speicherposition des ersten Elementes deines Arrays geschrieben. Selbst wenn dein Array nur 1 Element lang wäre. Die Prozedur weiss nicht wie lang das Array ist, und geht - weil du mit BASS_DATA_FFT512 aufgerufen hast - davon aus, dass du dafür gesorgt hast, dass der Speicher lang genug reserviert ist.
Wenn dies nicht der Fall ist, liegen im Speicher hinter dem zu kurzen Array potenziell andere Variablen, möglicherweise sogar welche, die überhaupt nichts mit dem Programmteil zu tun haben, sondern vielleicht irgendwas in der VCL oder weiss der Geier. Die DLL würde diese dann ohne Gnade überschreiben, und wenn sie dann später mal gebraucht würden, knallt es. Auch wieder möglicherweise an komplett anderen Stellen, die keinen Rückschluss darauf zulassen, dass der eigentliche Fehler hier an dieser Stelle passiert ist.
Wenn man sich solche Schnitzer eingefangen hat, kann man in größeren Programmen Tage bis Wochen damit verbringen sie zu finden.

Anderes Thema:
----------------------------------
Ich habe erst jetzt realisiert, dass du ja gar nicht beim Abspielen "live" das FFT Bild malst, sondern vorab! Das eröffnet eine interessante Möglichkeit: Man könnte das Bild zunächst um 90° gedreht auf ein Puffer-Bitmap zeichnen, weil du damit dann nämlich schön alle Zeilen (lies: Scanlines) nacheinander durchgehen kannst, und nicht wie jetzt diese puffern und umherspringen musst. Das fertige Puffer-Bitmap zum Schluss dann mit PlgBlt() gedreht in das Image malen, und fertig. Das sollte ruck zuck gehen.
Leider hast du alle Anhänge gelöscht (wieso!?!?), so dass ich das nicht testweise bauen kann. Schade.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat