【发布时间】:2023-03-25 22:08:02
【问题描述】:
这是一个我可能应该早点问的问题,但我并没有急于在 MonoTouch 中使用 p/invoke 类型的东西。
基本上我在与大量浮点运算有关的性能方面存在问题,特别是涉及最小/最大函数、向量乘法和类似的东西(基本上检测不同类型的形状是否相交)。
这些操作的原因是因为使用 C# 编写的 2D 物理引擎。
在 Windows Phone 7 和 Xbox 360 等一些平台上,物理引擎运行时没有任何问题,它会占用一些 CPU 周期,但会留下足够的时间来确保游戏以稳定的帧速率运行。
问题在于在 iPhone 上运行的 MonoTouch。看起来 MonoToch 并不是那么好,有这么多的浮点运算,iPhone(甚至 iPad 2)发现自己受到了严重的影响,物理是明显的性能瓶颈。我有profiled the performance,它归结为一组相对基本的数学函数,如I mentioned before,没有真正优化这些函数的方法,物理引擎本身写得很好,我看不到它有什么明显的地方落后,坦率地说,我怀疑它作为 2D C# 物理引擎有什么问题。
为此,我决定找到一个用 C(或 C++,如果可能)编写的物理引擎,并将其与 MonoTouch 主应用程序连接起来。我的理由是,由于 MonoTouch 中的性能问题可能与 MonoTouch 编译器无法编译 .net 代码以像 Wp7/xbox 360 JIT 编译器一样快(这是可以理解的)将事情从 monotouch 中移出这一事实有关并在本地运行它们将有助于提高性能。
所以我的想法是,我将使用 Box2D,编写一堆静态包装函数(例如 CreateWorld()、CreateBox()、GetBodyPosition(int id) 等)并通过 p/hook 所有这些调用功能并将其全部集成到我的物理包装类中,这样核心游戏逻辑将需要最少甚至不需要修改,并且我可以保持原始代码设计的完整性,但由于物理正在运行而获得性能提升原生 C.
但这让我想到,性能问题源于非常简单直接的数学函数、简单的乘法和大小比较。如果通过 p/invoke 运行函数可以提高速度,那么只需将 Vector2.Max 之类的函数重写为 C 函数并调用也可以提高性能?
然而这似乎有点牵强,如果是这样的话,Mono不会这样做吗?
所以我想我的总体问题是,从 p/invoke 调用静态链接的本机库时,性能是否比 MonoTouch 编译的等效 C# 函数更好?
【问题讨论】:
标签: c# c performance xamarin.ios pinvoke