这是一个我可能应该早点问的问题,但在急于使用MonoTouch中的p/invoke类型功能时没有问出来。基本上,我遇到了与大量浮点运算有关的性能问题,特别是涉及min/max函数、向量乘法和类似的东西(基本上是检测不同形状是否相交)。这些操作的原因是因为使用了C#编写的2D物理引擎。在某些平台上,如Windows Phone 7和Xbox 360,物理引擎可以无缝运行,它会占用一些CPU周期,但留下足够的资源来确保游戏以稳定的帧速率运行。
问题出现在运行在iPhone上的MonoTouch。看起来MonoToch在处理如此多的浮点运算时并不那么出色,而iPhone(甚至是iPad 2)发现自己受到严重影响,物理学成为明显的性能瓶颈。我已经分析了性能,结果表明一组相对基本的数学函数就像我之前提到的一样,没有真正优化这些函数的方法,物理引擎本身编写得非常好,我看不出它有任何明显的滞后,并且坦率地说,我怀疑这是否是一个2D C#物理引擎有问题。
为此,我决定找到一个用C(或如果可能的话用C++)编写的物理引擎,并将其与主要的MonoTouch应用程序连接起来。我的理由是,由于MonoTouch编译器不能像Wp7/xbox 360 JIT编译器那样将.net代码编译为运行速度很快的代码(这是可以理解的),将东西移出MonoTouch并以本地方式运行将有助于提高性能。
所以我的想法是使用Box2D,编写一堆静态包装函数(例如CreateWorld(),CreateBox(),GetBodyPosition(int id)等),并通过p/invoke功能将所有内容挂钩到我的物理包装类中,这样核心游戏逻辑将需要最少或不需要修改,并且我可以保持原始代码设计的完整性,但由于物理运行在本机C中,还可以获得性能提升。
问题出现在运行在iPhone上的MonoTouch。看起来MonoToch在处理如此多的浮点运算时并不那么出色,而iPhone(甚至是iPad 2)发现自己受到严重影响,物理学成为明显的性能瓶颈。我已经分析了性能,结果表明一组相对基本的数学函数就像我之前提到的一样,没有真正优化这些函数的方法,物理引擎本身编写得非常好,我看不出它有任何明显的滞后,并且坦率地说,我怀疑这是否是一个2D C#物理引擎有问题。
为此,我决定找到一个用C(或如果可能的话用C++)编写的物理引擎,并将其与主要的MonoTouch应用程序连接起来。我的理由是,由于MonoTouch编译器不能像Wp7/xbox 360 JIT编译器那样将.net代码编译为运行速度很快的代码(这是可以理解的),将东西移出MonoTouch并以本地方式运行将有助于提高性能。
所以我的想法是使用Box2D,编写一堆静态包装函数(例如CreateWorld(),CreateBox(),GetBodyPosition(int id)等),并通过p/invoke功能将所有内容挂钩到我的物理包装类中,这样核心游戏逻辑将需要最少或不需要修改,并且我可以保持原始代码设计的完整性,但由于物理运行在本机C中,还可以获得性能提升。
但这让我想到,性能问题源于非常简单和直接的数学函数,如简单的乘法和大小比较。如果通过p/invoke运行函数会提高速度,那么像Vector2.Max这样的函数重新编写为C函数并调用是否也会提高性能呢?
然而,这似乎有些牵强,如果是这样,Mono难道不会自动执行吗?
所以我总的问题是,当从p/invoke调用时,静态链接的本机库是否比由MonoTouch编译的等效C#函数执行得更好?