一直在使用 FMOD 进行 C# 游戏开发,我很早就遇到了一个似乎无法解决的问题。我想做一些分支音频的东西并将一些游戏动作同步到节拍等,所以我尝试将同步点添加到我的音乐曲目中。这是代码:
public class Music
{
private Sound music;
private Channel channel;
private IntPtr syncPtr;
public string File { get; private set; }
public Music(string file)
{
File = file;
}
public void Load()
{
music = new Sound();
Audio.System.createSound(File, MODE.HARDWARE, ref music);
}
public void Unload()
{
music.release();
}
public virtual void Play()
{
Audio.System.playSound(channel == null ? CHANNELINDEX.FREE : CHANNELINDEX.REUSE, music, false, ref channel);
music.addSyncPoint(500, TIMEUNIT.MS, "wooo", ref syncPtr);
channel.setCallback(channelCallback);
}
private RESULT channelCallback(IntPtr channelraw, CHANNEL_CALLBACKTYPE type, IntPtr commanddata1, IntPtr commanddata2)
{
if (type == CHANNEL_CALLBACKTYPE.SYNCPOINT)
Console.WriteLine("sync!");
return RESULT.OK;
}
}
进而...
m = new Music(MUS_TUTORIAL); //m is static
m.Load();
m.Play();
歌曲加载并播放良好......直到它达到我添加的 500 毫秒同步点。此时,VC# 从 FMOD.EventSystem.update() 中吐出以下错误:
对“Game!FMOD.CHANNEL_CALLBACK::Invoke”类型的垃圾收集委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。将委托传递给非托管代码时,托管应用程序必须使它们保持活动状态,直到保证它们永远不会被调用。
所以不知何故,FMOD 正在失去我通过它的代表的踪迹。保存委托的 Music 实例尚未被垃圾收集 - 我现在将它存储在静态变量中 - 但我也尝试过使用静态方法无济于事。如果我禁用 CallbackOnCollectedDelegate MDA,则错误将变为空引用异常,因此 MDA 没有弄错。我想我一定不能完全理解 FMOD 在这里做什么。
是否有任何 C# + FMOD 大师能够看到我的错误?