Events Unity3D中的帧率独立事件

Events Unity3D中的帧率独立事件,events,unity3d,delegates,puredata,libpd,Events,Unity3d,Delegates,Puredata,Libpd,我使用包与纯数据通信。我通过LibPD.bang从纯数据接收到砰的一声。在爆炸事件中,我播放FMOD的声音 问题是,我经常收到刘海,例如每500毫秒一次,但事件不会在特定的帧长内触发。通常长度变化小于或大于1帧 这个问题有解决办法吗?例如,与帧率无关的事件?我想知道Unity3D中的事件(委托)是否与帧速率无关 因为每个声音都有节奏,只有一帧的节奏 我需要同步每个单独的砰砰声播放的声音。关于代理是否依赖于Unity的帧率或独立于Unity的帧率,没有直接的答案。这取决于如何称呼您的代理。它们是从

我使用包与纯数据通信。我通过
LibPD.bang
从纯数据接收到砰的一声。在爆炸事件中,我播放FMOD的声音

问题是,我经常收到刘海,例如每500毫秒一次,但事件不会在特定的帧长内触发。通常长度变化小于或大于1帧

这个问题有解决办法吗?例如,与帧率无关的事件?我想知道Unity3D中的事件(委托)是否与帧速率无关

因为每个声音都有节奏,只有一帧的节奏


我需要同步每个单独的砰砰声播放的声音。

关于代理是否依赖于Unity的帧率或独立于Unity的帧率,没有直接的答案。这取决于如何称呼您的代理。它们是从线程调用的吗?它们是在线程中执行的吗?
协同程序不是独立于帧率的,它们是在Unity的循环中执行的

下面的脚本应该说明在协程和线程中处理代理的区别

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用系统线程;
公共类委托和框架:单一行为{
delegate void MyDelegate();
MyDelegate myDelegate1;//使用协同程序完成
MyDelegate myDelegate2;//使用线程完成
螺纹;
bool-threadDone=false;
私有整数帧计数=0;
私有int delegate1CallCount=0;
private int delegate2CallCount=0;
private int callerloopscont\u coroutine=0;
private int callerLoopScont_线程=0;
无效开始(){
myDelegate1+=Elab1;
myDelegate2+=Elab2;
start例程(CallerCoroutine());
线程=新线程(新线程开始(调用线程));
thread.Start();
}
无效更新()
{
frameCount++;
}
void Elab1()
{
委派1呼叫计数++;
}
void Elab2()
{
delegate2CallCount++;
}
IEnumerator CallerCoroutine()
{
while(true)
{
CallerLoopScont_Corroutine++;
myDelegate1();
收益返回空;
}
}
void CallerThread()
{
而(!threadDone)
{
CallerLoopScont_线程++;
myDelegate2();
}
}
void OnDestroy()
{
Log(“帧计数:+frameCount”);
Log(“委托调用计数(协同路由):”+delegate1CallCount);
Log(“委托调用计数(线程):”+delegate2CallCount);
Log(“调用方循环计数(协同路由):”+CallerLoopScont\u协同路由);
Log(“调用方循环计数(线程):”+callerLoopsCount\u线程);
threadDone=true;
thread.Join();
}
}
如果你把它连接到一个游戏对象上,让Unity玩几秒钟,你会发现从协同程序调用委托的次数等于执行的帧数,而从线程调用委托的次数会大得多

我有与纯数据类似的软件接口经验,我认为你需要的是一个(相当典型的)线程,让你的所有代表都在那里,为Unity创建一个命令队列,并在Unity的更新中消化它。 在特定情况下不了解libPD这可能不是该案例的最佳实践,但它是一种广泛使用的方法。基本上是生产者-消费者模式


根据这个例子,libPD只要求您订阅正确的委托。您无法控制何时执行这些命令,而库却控制了这些命令;因此,如果您一直存在此问题,我想向开发人员提交错误报告是值得的。

有人吗?有解决办法吗?有什么建议吗?你能分享你接收和详细描述BANG的代码吗?“协同程序不是独立于帧速率的,它们是在Unity的循环中执行的。”这有点误导,因为协同程序本质上是独立于帧速率的,但它们的内容可能不是,这就是为什么它们在Unity的循环中执行(就像任何东西一样)。这意味着可以通过多个帧运行单个协同路由线程(也称为循环),这与任何更新方法不同,更新方法需要在下一帧启动时完成。但是,在协同程序中,任何对时间或物理的引用都可能基于活动帧保存协同程序,从而使其依赖于帧