JBox2D和libGDX Box2D有什么区别?

5
我一直在使用libGDX,并在我的游戏中使用Box2D进行简单的2D物理交互。然而,最近我发现了一个名为JBox2D的库的存在。
这两个库有什么区别?一个库的优势是什么?
我知道它们都基于Box2D C ++库,因为:
引用:

libgdx中的Box2D实现是C ++引擎的薄Java包装器。


JBox2d是LiquidFun和Box2D C++物理引擎的Java移植版。"port"和"wrapping"是什么意思?JBox2D比Box2D更完整吗?哪个更快?我问这个问题是因为我想知道从一个引擎(在这种情况下是从Box2D到JBox2D)是否会影响或优化我的游戏性能。

2
包装意味着有一个薄的(基本上是非功能性的)API,使得从Java调用底层API更容易。它基本上充当Java和(可能)本地实现之间的代理。端口是指将实际代码从C++翻译成Java,因此移植版本变为(可能)纯Java,并且不依赖于任何外部本机库。 - MadProgrammer
这会让端口变慢吗? - Alex S. Diaz
1
有时候需要进行基准测试,有时候不需要。将端口移植到多个平台上会更容易,因为您无需担心是否安装了正确的库,例如,它也不会受到平台(操作系统)上更新的库可能导致的问题的影响。 - MadProgrammer
1个回答

9
正如MadProgrammer所说,libgdx box2d扩展(gdx-box2d)是本地box2d库的JNI包装器。而JBox2D库完全是用Java编写的端口,不依赖于本地库。然而,当无法包装本地库时,您可能会发现有趣的是{{link1:gdx-box2d扩展在幕后使用JBox2d}}。这只适用于GWT后端。

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

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

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

我得学习如何进行基准测试(这对我来说是个新词),仅仅将我的游戏从一个库移植到另一个库,然后测量两者的时间/性能是否算作基准测试?或者有关于如何进行基准测试的标准吗? - Alex S. Diaz
4
除非你真正需要解决一个实际的(性能)问题,而且你确实发现box2d是导致该问题的原因,并且你已经验证它不是你自己代码的问题(例如误用API),否则你不应该考虑这个问题。首先确定问题,然后尝试解决。不要试图解决可能存在或可能不存在的问题。 - Xoppa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接