FMOD类实例分配是否存在数量限制?技术咨询
问题原因与解决方案
是的,你遇到的问题确实是实例数量导致的——FMOD默认限制最多创建16个FMOD_System实例。
每个FMOD_System实例都会占用独立的音频设备资源(包括线程、设备句柄、内存等),系统层面的资源承载能力有限,所以FMOD设置了这个默认上限。你现在每个Sound类实例都在构造函数里创建新的FMOD_System,当实例数达到16时,FMOD_System_Create就会返回错误,触发你的断言。
正确的解决思路
FMOD的设计思路里,一个应用只需要一个全局的FMOD_System实例,所有音频资源(Sound、Channel等)都基于这个系统来创建和操作。你应该重构你的Sound类,去掉每个实例独立创建系统的逻辑:
- 先在应用初始化时创建并初始化一个全局的FMOD_System
- Sound类仅负责加载、播放具体的音频资源,依赖全局系统实例完成操作
代码示例
全局FMOD系统初始化
#include <FMOD/fmod.h> #include <cassert> FMOD_SYSTEM* g_GlobalFMODSystem = nullptr; // 在应用启动时调用 void InitGlobalFMOD() { FMOD_RESULT result = FMOD_System_Create(&g_GlobalFMODSystem); assert(result == FMOD_OK && "Failed to create FMOD system"); result = FMOD_System_Init(g_GlobalFMODSystem, 32, FMOD_INIT_NORMAL, nullptr); assert(result == FMOD_OK && "Failed to initialize FMOD system"); } // 在应用退出时调用 void ShutdownGlobalFMOD() { if (g_GlobalFMODSystem) { FMOD_System_Close(g_GlobalFMODSystem); FMOD_System_Release(g_GlobalFMODSystem); g_GlobalFMODSystem = nullptr; } }
修改后的Sound类
class Sound { private: FMOD_SOUND* m_pSound = nullptr; FMOD_CHANNEL* m_pChannel = nullptr; public: Sound(const char* audioFilePath) { // 使用全局系统加载音频文件 FMOD_RESULT result = FMOD_System_CreateSound( g_GlobalFMODSystem, audioFilePath, FMOD_DEFAULT, nullptr, &m_pSound ); assert(result == FMOD_OK && "Failed to load sound"); } ~Sound() { // 释放音频资源 if (m_pSound) { FMOD_Sound_Release(m_pSound); m_pSound = nullptr; } // 停止并清理播放通道 if (m_pChannel) { FMOD_Channel_Stop(m_pChannel); m_pChannel = nullptr; } } void Play() { // 通过全局系统播放音频 FMOD_RESULT result = FMOD_System_PlaySound( g_GlobalFMODSystem, m_pSound, nullptr, false, &m_pChannel ); assert(result == FMOD_OK && "Failed to play sound"); } };
这样修改后,无论你创建多少个Sound实例,都只会复用一个FMOD_System,既不会触发数量限制,也能更高效地利用音频资源。
内容的提问来源于stack exchange,提问作者MC Smile
相关产品推荐
相关产品推荐

