【问题标题】:What's the difference between JBox2D and libGDX Box2DJBox2D 和 libGDX Box2D 有什么区别
【发布时间】:2015-08-12 00:10:05
【问题描述】:

我正在开发 libGDX 并使用 Box2D 在我的游戏中进行简单的 2D 物理交互。但是,最近我发现了一个名为 JBox2D 的库。

这两个库有什么区别吗?各有什么优势?

我知道它们都基于 c++ 的 Box2D 库,因为:

libgdx 中的 Box2D 实现是一个围绕 C++ 引擎的瘦 Java 包装器。


JBox2d 是 C++ 物理引擎 LiquidFun 和 Box2d 的 Java 端口。

但是,端口和包装是什么意思? JBox2D 是否比 Box2D 更完整?哪个更快?

我问这个是因为我想知道将我的项目从一个更改为另一个(在本例中从 Box2D 更改为 JBox2D)是否会影响或优化我的游戏性能。

【问题讨论】:

  • 包装意味着它们是一个精简的(本质上是非功能性的)API,这使得从 Java 调用底层 API 变得更容易。它基本上充当 Java 和(可能)本机实现之间的代理。移植是实际代码从 C++ 翻译成 Java 的地方,因此移植后的版本(大概)变成纯 Java,不依赖任何外部本地库
  • 这个是不是让端口变慢了?
  • 您必须进行基准测试,有时,是的,有时不是。该端口将更容易在多个平台上运行,因为您无需担心确保安装了正确的库,例如,它也不会受到平台(OS)上更新库等问题的影响这可能会导致问题

标签: java libgdx jbox2d


【解决方案1】:

正如 MadProgrammer 所说,libgdx box2d 扩展 (gdx-box2d) 是原生 box2d 库的 JNI 包装器。而 JBox2D 库完全是用 Java 编写的,不依赖于本地库。但是,当无法包装本机库时,您可能会发现在幕后知道 the gdx-box2d extension uses JBox2d 很有趣。这仅适用于 GWT 后端。

在大多数情况下(特别是 Android),使用 JNI 包装器而不是 JBox2d 更快(在 iOS 上它可能也更快,因为 RoboVM 需要翻译 JBox2D 字节码)。这就是为什么扩展在这些后端使用它的原因。当然,这取决于实际情况,因此您应该对其进行基准测试和比较以了解实际差异。

我自己没有对 gdx-box2d 和 JBox2d 进行基准测试。但我可以根据经验说,与 JBullet Java 端口相比,(3D 物理)gdx-bullet JNI 包装器要快得多。

请注意,gdx-box2d 包含所需的库。它不依赖于平台上任何需要更新的库。您也不必担心确保安装了正确的库。

【讨论】:

  • 我必须学习如何进行基准测试(这对我来说是一个新词),是否只是将我的游戏从一个库移植到另一个库,然后测量两者的时间/性能是否算作基准测试?还是有关于如何进行基准测试的标准?
  • 除非您尝试解决实际(性能)问题并且您实际上发现 box2d 导致了该问题并且您验证了这不是您自己的代码的问题(例如滥用 API),您甚至不应该考虑这一点。先找出问题,再尝试解决。不要试图解决可能存在或不存在的问题。
猜你喜欢
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 2010-10-02
  • 2011-12-12
  • 2010-09-16
相关资源
最近更新 更多