gpt4 book ai didi

c# - 使用P/invoke提高性能,可行还是一厢情愿?

转载 作者:太空狗 更新时间:2023-10-29 16:09:14 25 4
gpt4 key购买 nike

这个问题我可能应该早点问,但我并没有急于在 MonoTouch 中玩 p/invoke 类型的东西。

基本上,我遇到了与大量浮点运算相关的性能问题,特别是涉及最小/最大函数、 vector 乘法和类似内容的运算(基本上检测不同类型的形状是否相交)。

这些操作的原因是因为一个用 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 编译器那样快(这是可以理解的),将事情从 monotuch 中移出在 native 运行它们将有助于提高性能。

所以我的想法是我将使用 Box2D,编写一堆静态包装函数(例如 CreateWorld()、CreateBox()、GetBodyPosition(int id) 等)并通过 p/调用功能并将其全部集成到我的物理包装类中,这样核心游戏逻辑将需要最少的修改甚至不需要修改,我可以保持原始代码设计的完整性,但由于物理运行在原生 C.

但这让我想到,性能问题源于非常简单直接的数学函数、简单的乘法和大小比较。如果通过 p/invoke 运行函数会提高速度,那么只需将 Vector2.Max 等函数重写为 C 函数并调用它也能提高性能?

然而,这似乎有点牵强,如果是这样的话,Mono 不会这样做吗?

所以我想我的总体问题是,当从 p/invoke 调用时,静态链接的 native 库是否比 MonoTouch 编译的等效 C# 函数执行得更好?

最佳答案

实际上只有一种方法可以确定它是否更快:对您的案例进行基准测试。可能是您用于 native 库的 c 编译器能够比 mono 的 jit 优化更多,或者可能只是 cpu 不适合您的特定工作负载。

如果您想尝试使用 native 库,请记住您不想经常从托管调用 native 代码,每次托管到 native 的转换都会对性能造成重大影响(影响程度取决于很多因素,但转换次数越少越好)。

也就是说,我个人的猜测是 mono jit 不能很好地处理浮点运算(之前在某些 cpu 上有过这个问题,我现在不记得这些问题是否仍然存在也不在哪个 cpu 上),因此您将从使用 native 库中受益。

关于c# - 使用P/invoke提高性能,可行还是一厢情愿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6812104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com