C# 降低本地产品的成本<-&燃气轮机;单点触摸中的管理交互

C# 降低本地产品的成本<-&燃气轮机;单点触摸中的管理交互,c#,objective-c,performance,xamarin.ios,C#,Objective C,Performance,Xamarin.ios,我正在使用我为其编写的monotouch(我们现在应该给它命名为Xamarin.iOS吗?)绑定的本机库 重写C#中一些常用的方法会导致性能严重下降,即使函数的核心不执行任何操作或返回base.X()。仪器确认了问题以及在管理性互动中花费的时间 有没有办法从一方或另一方(本地或托管)加快速度?或者这是在MT中调用P/时要支付的税款 我碰到的玻璃天花板大约是每秒50000个电话 [更新2013/02/22] 给一些背景或例子,这里是我正在做的。我在玩cocos2d运动学(没有花栗鼠)。要管理我自己

我正在使用我为其编写的monotouch(我们现在应该给它命名为Xamarin.iOS吗?)绑定的本机库

重写C#中一些常用的方法会导致性能严重下降,即使函数的核心不执行任何操作或返回base.X()。仪器确认了问题以及在管理性互动中花费的时间

有没有办法从一方或另一方(本地或托管)加快速度?或者这是在MT中调用P/时要支付的税款

我碰到的玻璃天花板大约是每秒50000个电话

[更新2013/02/22] 给一些背景或例子,这里是我正在做的。我在玩cocos2d运动学(没有花栗鼠)。要管理我自己的精灵位置,我必须覆盖

CGAffineTransform NodeToParentTransform { 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;
我现在得到一个几乎可以接受的25-30fps为我的3500精灵,但我仍然想进一步。也不必修补本地源

[更新2013/02/22 2] 这是一个你可以用来测试的样本。它包含一个过于简化的一阶运动学引擎、3501个实体和精灵

这里有趣的类是
kineticsprite
。代码按原样在修改后的cocos2d版本(包含在cocos2d.dll中)上工作。通过注释掉新的
Dirty
函数并取消注释
NodeToParentTransform
和旧的
Dirty
,可以使它在股票cocos2d和COCOCOS2D绑定上工作。根据,它只在设备上工作。我在iPad mini上的速度是20到22.5 fps

我们现在应该给那个叫Xamarin.iOS吗

是的,现在是Xamarin.iOS:-)

或者这是在MT中调用p/时要支付的税款

在从托管代码和非托管代码转换时,有很多事情要做。蹦床会处理这些:封送参数和返回值、处理托管异常、处理本机异常

此外,您可能会多次执行转换,例如
newmanaged()
调用native
init*
调用(native)
setFoo:
返回(managed)
Foo
setter(并返回…调用方)

因此,即使每个部分都很快,但如果您不执行任何操作(或者只调用
base
),这仍然是值得注意的,因为没有太多的用户时间来摊销

有没有办法从一方或另一方(本地或托管)加快速度

对。首先确保你测量的是真实的东西。例如

  • 上述任务与模拟器和设备不同,例如JIT与AOT,x86和ARM的ABI不同

  • 调试和发布构建配置也将使用不同的代码

因此,您可能希望测量iOS(ARM)设备上的发布版本

下一步应该做的是确保启用了链接所有程序集(如果您有非SDK绑定,例如Cocos2d)。这不会改变蹦床,但当你调用
base
时,你调用的是绑定代码

事实证明,链接器在绑定方面非常聪明,可以删除在您的情况下不需要的代码。例如

  • )
  • )
  • )
  • (如果您从UIKit继承);及
  • 我们将来添加的任何优化:-)
编辑:启用链接器的另一个原因是它删除了绑定中额外的(未使用的)方法-使本机代码不太可能需要回调到托管世界中(转换越少,时间越快)

其他方法更具侵入性,可能需要更改代码以最小化托管代码和本机代码之间的交互。你什么时候可以打电话来

var x = new X (1, 2, 3, 4);


您可以猜测第一种情况需要更少的转换(并且更快)。如果这样的API不存在,那么可以添加它——但这应该是一个最少的选择(很可能在其他地方,优化会让你获得更大的回报)。

看看你奇怪的崩溃错误问题,我注意到cocos2d代码一直跳回monotouch领域,因为绑定导出每个方法的所有mono版本,并使用objective-c名称。我想知道你是否可以在不暴露的情况下重做绑定,并在速度上获得巨大的提升

除非重写特定的方法,否则您似乎不需要(或者真的想要)那些公开的方法-在这种情况下,您可以为重写的方法添加objective-c导出。。。我没有这样做,我不知道这是否是自找麻烦。如果objc端不回叫,除非您有自定义代码,那么情况似乎会更好


希望听到poupou或其他xamarin的人对此发表评论

如果没有管理功能,每秒调用多少次?在所有条件相同的情况下,如果该方法在本机中被重写,它支持大约350000次调用/秒。您可以显示您调用的方法的代码(带有参数类型)和来自工具的结果(屏幕截图?)?本机托管转换速度取决于许多因素(例如,包括参数的数量及其类型)。从方法(NodeToParentTransform)返回(相当大的)结构将使用相当多的cpu周期来复制数据。你能用仪器来检测单个覆盖点的时间吗?@StephaneDelcroix:一个样本会很好,我最近一直在研究这个问题,所以我可能能找到改进的地方
var x = new X (1, 2, 3, 4);
var x = new X ();
x.a = 1;
x.b = 2;
x.c = 3;
x.d = 4;