- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在玩一个 native 库,我为此编写了 monotouch(我们现在应该将其命名为 Xamarin.iOS 吗?)绑定(bind)。
重写 C# 中的一些常用方法会导致严重的性能下降,即使函数的核心不执行任何操作或返回 base.X()。 Instruments 确认了问题以及在托管<->本地交互中花费的时间。
有没有办法从一侧或另一侧( native 或托管)加快速度?或者这是在 MT 中 P/调用时要支付的税?
我遇到的玻璃天花板大约是每秒 50000 次调用。
[更新 2013/02/22]举一些背景或例子,这就是我正在做的。我正在玩 cocos2d 运动学(没有花栗鼠)。为了管理我自己的 Sprite 位置,我必须重写
CGAffineTransform NodeToParentTransform { get; }
和
bool Dirty { get; }
前者返回一个矩阵,戳原生端获取ScaleX、ScaleY、RotationX等参数。 RotationY和AnchorPointInPoints,后者无条件返回true
。
我在降低成本方面的尝试目前取得了部分成功,因为通过将 native 代码更改为具有单个点来覆盖它不会戳到任何属性,我获得了 25% 到 50% 的加速。
-(BOOL) dirty:(CGAffineTransform*)nodeToParentTransform rotationX:(float)rotX rotationY:(float)rotY scaleX:(float)scaleX scaleY:(float)scaleY anchorPointInPoints:(CGPoint)anchorPointInPoints;
我的 3500 个 Sprite 现在几乎可以接受 25-30fps,但我仍然想走得更远。而且也不必修补 native 源。
[更新 2013/02/22 2]这是您可以用来测试的示例 https://github.com/StephaneDelcroix/mt-speed .它包含一个过度简化的一阶运动引擎、3501 个主体和 Sprite 。
这里有趣的类是KinematicSprite
。代码适用于 cocos2d 的修改版本(包含在 Cocos2D.dll 中)。您可以通过注释掉新的 Dirty
函数并取消注释 NodeToParentTransform
和旧的 Dirty
使其在现有的 cocos2d 和 cocos2d 绑定(bind)上工作。根据 Subclassing bound type in mono touch ,它只适用于设备。我在 iPad mini 上达到 20 到 22.5 fps。
最佳答案
are we supposed to name that Xamarin.iOS now?
是的,现在是 Xamarin.iOS :-)
Or is this a tax to pay when P/Invoking in MT ?
从托管代码和非托管代码转换时,有很多事情要做。 trampolines 负责:编码(marshal)参数和返回值、处理托管异常、处理 native 异常...
您也可能多次进行转换,例如new Managed ();
调用 native init*
调用 (native) setFoo:
回到 (managed) Foo
setter(然后返回...给调用者)。
因此,即使每个部分都很快,如果您不执行任何操作(或只调用 base
),它仍然会值得注意,因为没有太多的用户时间可以摊销反对。
Is there a way to speed that up, from one side or the other (native or managed) ?
是的。首先确保您测量的是真实的东西。例如。
上述任务不同于模拟器和设备,例如JIT 与 AOT,x86 和 ARM 的不同 ABI;
调试和发布构建配置也将使用不同的代码;
因此,您可能希望在 iOS (ARM) 设备上测量发布版本。
接下来您应该做的是确保启用链接所有程序集(如果您有非 SDK 绑定(bind),例如 Cocos2d)。这不会改变蹦床,但当您调用 base
时,您正在调用绑定(bind)代码。
事实证明,链接器在绑定(bind)方面非常聪明,可以删除您的情况不需要的代码。例如
IsDirectBinding
;NewRefCount
(sgen option) ;编辑:启用链接器的另一个原因是它删除了绑定(bind)中的额外(未使用)方法 - 使得 native 代码不太可能需要回调到托管世界(和更少的转换意味着更快的时间)
其他方法更具侵入性,可能需要更改代码以尽量减少托管代码和 native 代码之间的冲突。例如。有时你可以打电话
var x = new X (1, 2, 3, 4);
或
var x = new X ();
x.a = 1;
x.b = 2;
x.c = 3;
x.d = 4;
您可以猜到第一种情况需要更少的转换(并且更快)。如果这样的 API 不存在,那么可以添加它 - 但这应该是一个最少的选择(可能有其他地方的优化会让你获得更大的返回)。
关于c# - 降低单点触控中 native <-> 托管交互的成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14985336/
我在堆栈上创建了这段代码: function increase_brightness(hex, percent){ var r = parseInt(hex.substr(1, 2), 16)
为什么我能够LOWER COALESCE 中的每个项目,但无法LOWER整个COALESCE,否则我会遇到语法错误?例如: SELECT COALESCE(LOWER(google_provider_
我在谷歌上搜索到的所有内容都表明,以下任何一项都会将 double 舍入到小数点后两位。 double roundToFourDecimals(double d) { DecimalForma
我正在开发一个 flexdashboard/storyboard,我想在其中降低每个帧的高度。那可能吗? 示例代码: --- title: "Flex" output: flexdashboard
我在 WPF 中有一个图像控件。我需要减小图像尺寸控件的宽度和高度。但是当我这样做时,图像看起来不太好。数据丢失更多。 所以我想降低图像分辨率而不是仅仅改变图像控件的宽度和高度。 任何人都可以帮助我如
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 1年前关闭。 Improve this
我正在扩展 Fluent NHibernate,以便更好地与 F# 一起使用(即引用支持),并希望获得一些关于降低 API 流畅性的反馈。 F# 要求使用返回值,除非它们是单位类型。所以这最终以“|>
我们有一个 BizTalk 2010 接收位置,它将获取一个 70MB 的文件,然后使用入站映射(在接收位置)和出站映射(在发送端口)生成一个 1GB 文件。 执行上述过程时,SQL Server 会
我的代码分析插件提示包含以下代码的方法中的代码复杂性。我注意到以下代码看起来可以组合,但我不知道如何做到这一点: for(Command command : commands) { if (c
我正在寻找一种方法来始终忽略 R 中 float 之间的微小差异(根据 IEC 60559,这些是 double 浮点),通过使用基本 R 工具而不诉诸 C 或 C++。换句话说,我想“四舍五入” d
在 Blazor 中使用 ChartJs.Blazor 的 BarChart 组件时是否可以降低甚至关闭动画速度?我发现这个 NuGet 包非常有用,但我不知道如何在更新条形图时关闭动画。为了更容易忽
所以我为一个游戏编写了这段代码,现在该游戏的速度非常快。我想降低 FPS,让游戏慢一点。 我认为我唯一的出路就是制作一个计时器。但我发现很难找到放置计时器的位置?谁能帮我解决这个问题吗? 所以我为一个
我正在编写一个程序,我担心它运行所需的时间和所占用的空间。 在程序中我使用了一个变量来存储数组的长度: int len=newarray3.length; 现在,我想知道是否能够通过不使用 len 变
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 2 年前。 Improve th
我用Java编写了一个程序,但它的计算时间很长,我不知道为什么。有人可以指点一下以降低复杂性吗?此外,在计算一些值(例如 3,100 之后)后,它会给出空指针异常。代码: public class F
我有下图,由 1 行 2 列的网格组成。我愿意 降低右侧子图的高度(3D PREDICTION),使棋盘平面看起来有点挤压并显示更好的视角。 在左侧子图的顶部添加一些边距(2D PREDICTION)
是否有一种简单的方法可以更改以 RGB 字符串形式给出的颜色的亮度? 例如 in_RGB = '#FF0000' --> out_RGB = '#CC0000' 最佳答案 将十六进制字符串转换为 R
我已经编写了代码来更改对象(不是进程)(在本例中是文件)的完整性级别。据我们所知,我们从中等完整性级别开始,但我想将其降低到“低”。我想运行完整性较低的 .txt 文件而不是默认介质。 我使用 WIN
是否可以在保持原始宽高不变的情况下降低图像分辨率? 我已经使用 BitmapFactoryOptions 尝试了几个选项: 在样本大小 inDensity、inScaled、inTargetDensi
是否有高级(Java)或低级方式(使用 native 代码)将 Android 设备上的蓝牙信号强度更改为最低? 目标是使设备在 20 厘米范围内可被发现?在 Internet 上根本找不到与此相关的
我是一名优秀的程序员,十分优秀!