- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在为 Android 制作一个 2D sidescroller 游戏,并且正在考虑将 Box2D 用于物理。我想知道在使用 Box2D 时,如果设备的帧速率从 60 fps(Android 的上限)下降到例如 30 fps,所有物理是否会随之减慢?
具体来说,我将使用实时在线多人游戏,因此不能将帧率作为常量来依赖。因此,如果多人游戏中的一个设备以 60 fps 的速度运行,而另一个以 30 fps 的速度运行,并且一个对象应该以 10 米/秒的速度移动,那么它在较慢的设备上会以 5 米/秒的速度移动吗?
我想使用 Box2D,所以如果是这种情况,有没有办法解决它?
最佳答案
我认为你的问题实际上是两个问题。
1) 您是否应该在模拟过程中改变物理时间步长的速率。
不,你不应该。。您可以在游戏循环的一个时间步内多次迭代引擎(使用相同的步长值多次调用 Step(...)
函数)。
来自 2.3.0 Box2D 手册的 2.4 节:
A variable time step produces variable results, which makes it difficult to debug. So don't tie the time step to your frame rate (unless you really, really have to).
2) 如何连接两个实时物理模拟并使它们的物理更新周期相互依赖。
曾几何时,有一款名为《帝国时代》的改变游戏类型的游戏。它拥有数千个 AI 单元,它们在 28.8 网络上近乎实时地相互战斗。它工作得很好,有人写了一篇文章介绍他们是如何做到的:
我为我的更新循环调整了下面的技术和代码,以便我可以控制在两个不同的 iPad 上相互运行的两个游戏的帧速率。
void GameManager::UpdateGame()
{
const uint32 MAXIMUM_FRAME_RATE = Constants::DEFAULT_OBJECT_CYCLES_PER_SECOND();
const uint32 MINIMUM_FRAME_RATE = 10;
const uint32 MAXIMUM_CYCLES_PER_FRAME = (MAXIMUM_FRAME_RATE/MINIMUM_FRAME_RATE);
const double UPDATE_INTERVAL = (1.0/MAXIMUM_FRAME_RATE);
static double lastFrameTime = 0.0;
static double cyclesLeftOver = 0.0;
double currentTime;
double updateIterations;
currentTime = CACurrentMediaTime();
updateIterations = ((currentTime - lastFrameTime) + cyclesLeftOver);
if(updateIterations > (MAXIMUM_CYCLES_PER_FRAME*UPDATE_INTERVAL))
{
updateIterations = MAXIMUM_CYCLES_PER_FRAME*UPDATE_INTERVAL;
}
while (updateIterations >= UPDATE_INTERVAL)
{
// DebugLogCPP("Frame Running");
updateIterations -= UPDATE_INTERVAL;
// Set the random seed for this cycle.
RanNumGen::SetSeed(_cycleManager->GetObjectCycle());
// Dispatch messages.
_messageManager->SendMessages();
// Update all entities.
_entityManager->Update();
// Update the physics
_gameWorldManager->Update(Constants::DEFAULT_OBJECT_CYCLE_SECONDS());
// Advance the cycle clock.
_cycleManager->Update();
}
cyclesLeftOver = updateIterations;
lastFrameTime = currentTime;
}
这段代码使执行的迭代次数在上限和下限之间保持平衡。需要注意的一个关键点是,如果未及时收到来自其他玩家的消息,则不会实际调用此函数。这有效地使两个物理系统成为一体。
3) 您(也许)真正应该知道的部分
如果您计划在两个设备上使用 Box2D 来独立运行物理,您几乎肯定会在短时间后看到它们出现分歧。我在 iPad 2 和 iPad 3 上运行我的游戏,并注意到几秒钟后它们发生了分歧(碰撞发生在一个,但另一个没有)。这是因为 float 的舍入行为因多种因素而异。对于一些快速计算,没有问题。但是当值通过积分器不断循环时,小的差异会潜入低阶位并累积(例如,您会在物理模拟中看到)。 double 有一点帮助,但最终没有帮助。
查看多个 CPU 上弹跳球场中特定弹跳球的一些简单测试(例如,iPad 2 与 iPad 3 的代码完全相同)将显示这一点。几秒钟的运动后错误逐渐出现,突然间你的速度/位置偏离足以产生影响。
不动点数学是解决这个问题的方法,但这种方法也会导致其自身的疯狂。曾几何时,Box2D 有过定点版,不过这一次已经过去了。
我什至玩弄了 Box2D 的定点版本,但被另一个项目(Space Spiders Must Die!)分散了注意力。总有一天……
对于您的特定情况,这可能不是问题(即您没有进行独立模拟或以预期的方式进行模拟),如果不是,请不要担心。
You can see lots of other Box2D stuff (but not this game...it is not up there yet) here on my blog.
这有帮助吗?
关于android - Box2D Physics 是否依赖帧率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23038132/
我在 gobject 上阅读了一个维基百科页面,上面写着, Depending only on GLib and libc, GObject is a cornerstone of GNOME and
如何注册一个依赖属性,其值是使用另一个依赖属性的值计算的? 由于 .NET 属性包装器在运行时被 WPF 绕过,因此不应在 getter 和 setter 中包含逻辑。解决方案通常是使用 Proper
我一直在尝试将 ActionbarSherlock maven 依赖项添加到我的项目中 com.actionbarsherlock library 4.2.0 在我的 po
http://tutorials.jenkov.com/ood/understanding-dependencies.html#whatis说(强调我的): Whenever a class A us
我对所有这些魔法有点不清楚。 据我了解,依赖属性是从 DependencyObject 继承的,因此存储值: 如果分配了值(在本地字典中),则在实例本身中 或者如果未指定值,则从指向父元素的链接中获取
我刚刚更新了在 ASP.NET Framework 4.5.2 版上运行的 MVC Web 应用程序。我正在使用 Twilio 发送 SMS 消息: var twilio = new TwilioRe
我刚刚发现了一件令人生畏的事情。 spring 依赖坐标有两个版本。 项目依赖于 spring mvc 和 spring flow。有两组并行的依赖项。 Spring MVC 具有以下方案的依赖项
我正在尝试包含 的 maven 依赖项 org.jacorb jacorb 2.3.1 依赖已解决,但它导致另一个依赖 picocontainer 出现问题: [ERROR
我正在尝试在 Haskell 项目中包含特定版本的库。该库是住宿加早餐型的(用于 martix 操作),但我需要特定的 0.4.3 版本,该版本修复了乘法实现的错误。 所以,我的 stack.yaml
有谁知道如何制作依赖的 UIPickerView.例如,当我选择组件一的第 2 行时,组件二的标题会发生变化吗? 我在互联网上查找过,没有真正的答案,我尝试过使用 if 和 switch 语句,但它们
我正在编写一个用于验收测试的项目,由于各种原因,这依赖于另一个打包为 WAR 的项目。我已成功使用 maven-dependency-plugin 解压 WAR,但无法让我的项目包含解压的 WEB-I
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
开始玩 Scala futures,我被依赖的 futures 困住了。 让我们举个例子。我搜索地点并获得 Future[Seq[Place]]。对于这些地点中的每一个,我搜索最近的地铁站(该服务返回
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
我有一个二进制文件,需要一些 *.so 文件才能执行。现在,当我尝试在一些旧机器上执行它时,它会显示 /lib/libc.so.6: version `GLIBC_2.4' not found 如何将
我尝试使用 Dygraph 来表示图表,我在 https://github.com/danvk/dygraphs 中找到了代码,但是它有太多的依赖文件,我觉得很烦人。是否有一个文件可以容纳所有必需的
我正在处理一个 javascript 文件,该文件 a) 声明一个具有函数的对象,并且 b) 使用它期望在外部声明的散列调用该对象的 init 函数。我的 Jasmine 规范提示它找不到哈希,因为它
最近我一直在学习 Angular 并且进展顺利,但是关于依赖注入(inject)的一些事情我仍然不清楚。 是否有任何理由在我的 app.js 文件中声明我的应用程序的其他部分(服务、 Controll
考虑一个名为 foo 的表,它有 id (PRIMARY & AUTO_INCREMENT) 列。我正在向该表中插入一行,挑战从此时开始。 $db->query("INSERT INTO `foo`
我正在使用级联下拉 jquery 插件。 (https://github.com/dnasir/jquery-cascading-dropdown) 我有两个下拉菜单。 “客户端”和“站点”。 根据您
我是一名优秀的程序员,十分优秀!