【发布时间】:2026-01-22 06:45:01
【问题描述】:
我用SFML很久了,到现在都没用过Audio模块。
我想在我的游戏中添加音效,所以我的第一种方法类似于此...
class Deck : public sf::Drawable
{
public:
...
private:
sf::Sound shuffleSound;
...
static sf::SoundBuffer soundBuffer;
};
计划是初始化一次soundBuffer,然后在每个对象的构造函数中执行shuffleSound.setBuffer(soundBuffer);。但是我收到了这个错误:
AL lib: (EE) alc_cleanup: 1 device not closed
Assertion failed: (lockret == althrd_success), function LockLists, file /Users/m/Desktop/tmp/openal/build_deps/openal-soft-openal-soft-1.17.2/Alc/ALc.c, line 776.
(lldb)
在谷歌上搜索此错误后,我在某处看到一条关于未将 SFML 资源置于全局范围内的模糊消息。确定 static 变量是错误的原因,我尝试了这个:
class Deck : public sf::Drawable
{
public:
...
private:
sf::Sound shuffleSound;
...
static std::unique_ptr<sf::SoundBuffer> bufptr;
};
如果对象为空,则通过调用make_unique 初始化指针一次,然后在构造函数中执行shuffleSound.setBuffer(*bufptr)。
但是,我仍然遇到同样的错误。顺便说一句,直到程序即将终止,错误才会发生。
任何帮助将不胜感激。
【问题讨论】:
-
看起来 SFML 在关闭时没有正确清理 OpenAL 资源。 Alc.h 是一个 OpenAL util 标头,因此这可能是一个错误。
-
我可以想象有一个后台线程为渲染处理程序提供服务,而您在停止音频输出之前刚刚从它下面拉出地毯