You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FMOD类实例分配是否存在数量限制?技术咨询

问题原因与解决方案

是的,你遇到的问题确实是实例数量导致的——FMOD默认限制最多创建16个FMOD_System实例。

每个FMOD_System实例都会占用独立的音频设备资源(包括线程、设备句柄、内存等),系统层面的资源承载能力有限,所以FMOD设置了这个默认上限。你现在每个Sound类实例都在构造函数里创建新的FMOD_System,当实例数达到16时,FMOD_System_Create就会返回错误,触发你的断言。

正确的解决思路

FMOD的设计思路里,一个应用只需要一个全局的FMOD_System实例,所有音频资源(Sound、Channel等)都基于这个系统来创建和操作。你应该重构你的Sound类,去掉每个实例独立创建系统的逻辑:

  1. 先在应用初始化时创建并初始化一个全局的FMOD_System
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 09:43:18