Registriert: Di Jun 12, 2012 21:26 Beiträge: 112
Programmiersprache: Delphi
Hallo,
in meiner Delphi-Anwendung spiele ich die Soundeffekte mit Hilfe der bass.dll ab. Das Problem ist, dass (nur) das erste Abspielen anscheinend enorm viel Rechenzeit benötigt, was sich beim ersten Start des Spiels negativ aufs Timing auswirkt (das Spiel "hängt" kurz). Das Problem umgehe ich im Moment, in dem ich beim Start der Anwendung einen Soundeffekt abspiele und sofort stoppe (dadurch ist der Effekt nicht hörbar). Keine elegante Lösung, aber es funktioniert. Das Problem ist eindeutig reproduzierbar. Kennt jemand vielleicht eine bessere Lösung?
ich habe bereits mit der bass.dll gearbeitet und kenne dieses Problem nicht. ein bisschen Code wäre ganz sinnvoll, wie initialisierst du den Sound und bass.dll
Wie schon geschrieben, tritt das Problem auf, sobald ich den "ersten" Soundeffekt im OnIdle-Event abspiele (reproduzierbar). Bei Bedarf kann ich auch mal mein Spiel hochladen.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Hast du es mal mit einem "normalen" Hauptloop probiert? Mit OnIdle hab ich auch so meine Erfahrungen gemacht und verzichte da schon seit langem drauf. Ich meine sowas :
Registriert: Di Jun 12, 2012 21:26 Beiträge: 112
Programmiersprache: Delphi
Danke für Eure Antworten!
Sascha Willems hat geschrieben:
Hast du es mal mit einem "normalen" Hauptloop probiert?
Habe ich gerade ausprobiert. Löst das Problem leider nicht
Das Interessante ist, das sich das Problem wie oben beschrieben umgehen lässt (Ich schätze mal, dass es mit dem Speicher zusammenhängt und ein erneutes Abspielen einfach schneller ist!?). Ohne Bass.dll tritt das Problem nicht auf, also muss/sollte es an der Bass.dll liegen!?
Dropye hat geschrieben:
Du spielst den ersten Sound in der OnIdle ab?
Naja, im Grunde findet das meiste meiner Anwendung im OnIdle-Event statt. Ich wollte nur darauf hinweisen, dass ich das OnIdle-Event nutze (Ich nutze übrigens die ApplicationEvents-Komponente). In den Menüs spielt das Timing jedoch keine besondere Rolle. Soundeffekte gibt es im Moment nur im Spiel selbst, nicht in den Menüs. Ein Soundeffekt kann pro "Frame" einmal abgespielt werden (ein Frame ist bei meinem Spiel die Bewegung eines Elements von einem Feld zum nächsten, wie bei einem Schachbrett. Beim Original gabs noch keine flüssige Grafik).
Ich hab mal die aktuelle Version meines Projekts auf meine Homepage hochgeladen (565 KB): - Downloadlink entfernt -
Vorgehensweise: Anwendung starten, auf Select Game gehen, Sounddemo auswählen und anschließend das Spiel starten. Zum Vergleich vor dem Start "Select Cave" wählen (hierbei wird ein Soundeffekt abgespielt) und das Spiel danach starten.
Wie schon geschrieben, gelöst habe ich im Moment das Problem so, dass ich einfach beim Start der Anwendung einen Soundeffekt abspiele und in sofort wieder stoppe (dadurch ist der Effekt nicht hörbar).
Zuletzt geändert von subotai am Do Sep 13, 2012 15:47, insgesamt 1-mal geändert.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Bei mir läuft das hier ohne jegliche Verzögerung, evtl. liegts also an deiner Hardware. Ich nutze eine Soundblaster X-Fi, also 100% hardwarebeschleunigt.
Aber warum willst du eigentlich BASS benutzen? Wie wärs denn mit OpenAL als Alternative?
Registriert: Di Jun 12, 2012 21:26 Beiträge: 112
Programmiersprache: Delphi
Vielen Dank Euch beiden fürs Testen Dann scheint es wohl wirklich ein Hardware-Problem zu sein.
Dropye hat geschrieben:
hehe das spiel gefällt mir irgendwie
Freut mich. Mir gefällt die OpenGL-Version wesentlich besser als meine "reine" SDL-Version (ohne OpenGL). Für mich hat sich die Arbeit (jetzt) schon gelohnt, ... und ich bleib am Ball.
Sascha Willems hat geschrieben:
Aber warum willst du eigentlich BASS benutzen? Wie wärs denn mit OpenAL als Alternative?
Ich bin nicht auf die bass.dll fixiert. Ich nutze sie nur schon seit vielen Jahren und bin damit sehr zufrieden. Da war es naheliegend, die bass.dll für mein Projekt zu verwenden. Danke für den Tipp mit OpenAL, werde ich ausprobieren.
Registriert: Di Jun 12, 2012 21:26 Beiträge: 112
Programmiersprache: Delphi
Ich habe die dumpfe Vermutung, dass das Problem daran liegen könnte, dass ich Streams verwende und keine Samples. Ab und zu tritt auch der Effekt auf, dass manche Sounds etwas leiser und andere wesentlich lauter abgespielt werden. Ich denke, dass das auch damit zusammenhängt. Naja, die Soundeffekte stehen auf meiner Prioritätenliste ganz unten, aber ich werde wohl doch auf die Nutzung von Samples umsteigen.
Ich benutzte die bass.dll übrigens auch deshalb, weil sie direkt Ogg-Vorbis-Dateien unterstützt. Würde ich Wav-Dateien für die Soundeffekte nutzen, hätte ich wesentlich größere Dateien. Für OpenAL oder SDL_Mixer brauche ich wieder zusätzliche Dateien zum Decodieren.
Registriert: Mi Dez 03, 2008 12:01 Beiträge: 167 Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
subotai hat geschrieben:
Ich benutzte die bass.dll übrigens auch deshalb, weil sie direkt Ogg-Vorbis-Dateien unterstützt. Würde ich Wav-Dateien für die Soundeffekte nutzen, hätte ich wesentlich größere Dateien. Für OpenAL oder SDL_Mixer brauche ich wieder zusätzliche Dateien zum Decodieren.
Die Ogg/Vorbis Bibliotheken direkt zu benutzen ist gar nicht so schlimm wie es scheint. Zumal du durch den Verzicht auf unnötige Features auch dein Programm schön schlank hältst, und vergiss nicht die die Hardwarebeschleunigung und die schöne API von OpenAL
_________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Registriert: Di Jun 12, 2012 21:26 Beiträge: 112
Programmiersprache: Delphi
Ist OpenAL wirklich so gut?
Zitat:
Unless the BASS_SAMPLE_SOFTWARE flag is used, the sample will use hardware mixing if hardware resources are available.
Also direktes Hardware-Mixing über DirectSound wird auch von der bass.dll unterstützt. Wenn es um die Plattformunabhängigkeit geht, so gibt es bass.dll auch für Linux. Von der Dateigröße her ist die bass.dll eher kleiner als OpenAL. Ich habe immer das Gefühl, dass es letztendlich Geschmacksache/Glaubenssache ist, welche Lib man verwendet. Im Endeffekt werden die sich qualitativ nicht viel geben. Einige benutzen hier in ihren Programmen auch Fmod. Bei SDL scheiden sich schließlich auch die Geister. Von den einen wird es hochgelobt (ich übertreib jetzt mal etwas ), von den anderen wird eher davon abgeraten. Da fällt die Entscheidung wirklich schwer
Ich werds erstmal mit der Bass.dll ausprobieren, und dann sehen, ob's funktioniert.
Registriert: Mi Dez 03, 2008 12:01 Beiträge: 167 Wohnort: /country/germany
Programmiersprache: C++ / FreeBASIC
subotai hat geschrieben:
Also direktes Hardware-Mixing über DirectSound wird auch von der bass.dll unterstützt.
Vorsicht, diese Aussage kann man so nicht stehenlassen. DirectSound unterstützt nämlich gar kein Hardware-Mixing mehr! Ab Vista läuft da alles im Software-Mode. Daher hat Creative damals eine Software namens ALchemy veröffentlicht, die im Prinzip einen DirectSound-zu-OpenAL-Wrapper bereitstellt. Damit war es dann möglich wieder Hardwarebeschleunigung und EAX zu verwenden. Wenn du OpenAL direkt nutzt, hast du bei allen unterstüzten Soundchips Hardwarebeschleunigung, ansonsten benutzt OpenAL einen Software-Renderer.
subotai hat geschrieben:
Von der Dateigröße her ist die bass.dll eher kleiner als OpenAL.
Wenn ich OpenAL verwende, muss ich keine Dll mitliefern. Ist die bass.dll also auch kleiner als 0 Byte? OpenAL wird einmal installiert, von dem Programm mitgeliefert werden muss nichts mehr (und soll auch gar nicht!).
subotai hat geschrieben:
Ich werds erstmal mit der Bass.dll ausprobieren, und dann sehen, ob's funktioniert.
Klar, das ist natürlich deine Entscheidung. Wenn du bereits Erfahrung mit Bass hast (bzw es dir einfach gefällt) ist dieses Vorgehen durchaus sinnvoll. Ich persönlich würde dir eben zu OpenAL raten, da ich damit durchweg positive Erfahrungen gemacht habe, vor allem wegen der API, die eben sehr OpenGL-ähnlich ist (und damit extrem einfach zu benutzen und nachzuvollziehen). Gerade wenn du sich bewegende, Sound emittierende Objekte im dreidimensionalen Raum hast finde ich OpenAL extrem gut geeignet. Ich habe auch gesehen, dass Bass MP3 unterstützt. Da wäre ich übrigens vorsichtig damit, wegen der Verwendung von MP3-Decodern in kommerzieller Software gab es früher schon viel Ärger (ich weiß aber nicht inwieweit das nicht-kommerzielle Software betrifft).
_________________ Traue keinem Computer, den du nicht aus dem Fenster werfen kannst -- Steve Wozniak
Registriert: Di Jun 12, 2012 21:26 Beiträge: 112
Programmiersprache: Delphi
Danke für deine Rückmeldung
darkinsanity hat geschrieben:
Da wäre ich übrigens vorsichtig damit, wegen der Verwendung von MP3-Decodern in kommerzieller Software gab es früher schon viel Ärger
Davon habe ich schon gelesen. Ich ziehe Ogg-Vorbis sowieso vor, da es im Gegensatz zum mp3-Format verlustfrei komprimiert. Wobei ich nicht glaube, dass es bei Freeware bzgl. mp3's Probleme gibt, kenne diverse Freeware-Programme, die mp3's abspielen können. Das Problem an den Wav-Dateien ist eben, dass die teilweise extrem groß ausfallen, was heutzutage zum Glück keine große Rolle mehr spielt, mich aber dennoch stört.
darkinsanity hat geschrieben:
Wenn ich OpenAL verwende, muss ich keine Dll mitliefern. Ist die bass.dll also auch kleiner als 0 Byte?
Das ist ein Argument Soweit ich weiss, ist in der Regel OpenAL meist bereits sowieso vorinstalliert!?
Die Bass.dll war für mich zuersteinmal naheliegend, da ich sie schon seit Jahren für diverse Projekte benutze. Aber ich muss gestehen, dass Du mich neugierig gemacht hast. Werde mich doch nochmal an OpenAL versuchen.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ogg-Vorbis ist nicht verlustfrei. FLAC ist verlustfrei. Opus ist awesome, aber auch nicht verlustfrei, Vorbis ist nicht verlustfrei. Wo ich gerade von Opus rede, das wäre auch ein sehr sinniger Audiocodec.
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.