我正在玩一个本机库,我为此编写了 monotouch(我们现在应该命名那个 Xamarin.iOS 吗?)绑定。
覆盖 C# 中一些常用的方法会导致性能严重下降,即使函数的核心什么也不做或返回 base.X()。Instruments 确认了问题以及在托管<->本机交互中花费的时间。
有没有办法从一侧或另一侧(本地或托管)加快速度?或者这是在 MT 中 P/Invoking 时要缴纳的税款?
我达到的玻璃天花板约为 50000 次调用/秒。
[更新 2013/02/22] 给出一些上下文或示例,这就是我正在做的事情。我正在玩 cocos2d 运动学(没有花栗鼠)。为了管理我自己的精灵位置,我必须重写
CGAffineTransform NodeToParentTransform { get; }
和
bool Dirty { get; }
前者返回一个矩阵,戳原生端获取ScaleX、ScaleY、RotationX等参数。RotationY 和 AnchorPointInPoints,后者true
无条件返回。
目前,我在降低成本方面的尝试取得了部分成功,因为通过将本机代码更改为有一个不涉及任何属性的单点覆盖,我获得了 25% 到 50% 的加速。
-(BOOL) dirty:(CGAffineTransform*)nodeToParentTransform rotationX:(float)rotX rotationY:(float)rotY scaleX:(float)scaleX scaleY:(float)scaleY anchorPointInPoints:(CGPoint)anchorPointInPoints;
现在,我的 3500 个精灵得到了几乎可以接受的 25-30fps,但我仍然想走得更远。而且也不必修补原生资源。
[更新 2013/02/22 2] 这是一个可用于测试https://github.com/StephaneDelcroix/mt-speed的示例。它包含一个过度简化的一阶运动学引擎、3501 个身体和精灵。
这里有趣的课程是KinematicSprite
. 代码原样适用于 cocos2d 的修改版本(包含在 Cocos2D.dll 中)。您可以通过注释掉新Dirty
功能并取消注释NodeToParentTransform
和旧的Dirty
. 根据Mono touch 中的子类绑定类型,它仅适用于设备。我在 iPad mini 上获得 20 到 22.5 fps。