原生Android/iOS开发与Marmalade SDK对比

38

我们公司即将选择原生Android/iPhone开发或者一些跨平台解决方案,具体来说是Marmalade SDK(前身为Airplay SDK)。

我们是一家计算机视觉公司,这意味着我们需要低级别访问相机设备。此外,我们的应用程序在计算上很昂贵,这意味着我们倾向于挤出每一点可用的处理能力。

我们的团队有足够的经验在Objective-C和Java(或C)提供平台特定的解决方案。然而,我们的主要关注点始终是C++,因此我们希望防止分裂团队,而是使用跨平台解决方案。

我们最担心的是选择Marmalade会牺牲处理速度(主要关注点),或者通过复杂化对相机帧缓冲器的低级别访问来严重增加开发时间。

所以我的问题是,除了明显的优点之外,Marmalade SDK在处理器密集型视频处理应用程序方面有哪些限制?


1
我不确定关于果酱(Marmalade),但如果它们没有给您直接访问本地API的权限(例如Work Light),并且不能将您的代码转换为本地API,则计算软件应选择本地API。现在大多数共享代码确实可以使用C++,甚至可以在Andriod代码中使用本地Activity,因此只需使用Java包装器应用程序,所以我会选择本地代码。 - codeScriber
6个回答

99
我在我的独立游戏公司使用了Marmalade / Airplay将近两年时间。对我来说,这是一个胜利,因为我只是一个程序员,我可以在Windows上使用MS Dev Studio(这是我最喜欢的开发环境),几乎可以完成所有工作,并且它可以保护我免于处理许多特定平台的详细信息,特别是各种开发工具,这可能会占用我更多本可用于游戏内容的时间。
Marmalade的速度不会成为问题。您的C++代码运行本机。此外,访问相机和其他功能也不应该成为问题;已经提供了它们或者可以使用扩展SDK添加,这很容易使用。
Marmalade是一款成熟的产品,该公司在快速解决问题方面非常有帮助,即使是免费使用该产品的独立开发人员。除了跨平台功能外,它还内置了一些不错的工具,如内存泄漏跟踪器、日志系统、图形分析工具等。
我在使用Marmalade时遇到了一些缺点。
1. 尽管理论上任何API或第三方SDK都可以通过扩展系统访问,但实际上您需要的可能尚不存在。例如,许多开发人员目前正在努力将分析包Flurry集成到应用中,这对一些人来说是个挑战。与许多其他第三方SDK类似的情况也存在;如果您正在进行Objective-C开发,则可能只需要几行代码就可以集成,但通过Marmalade可能会更困难。
2. 由于操作的跨平台层,某些事情可能会不太自然。对我来说,一些示例包括:
- 我在iOS和Android上无法正确地显示我的启动屏幕(应用程序启动屏幕),并且很难在没有一些闪烁、短暂的黑屏时间或者在Marmalade应用程序本身的设备负载和Marmalade加载应用程序代码之间转换时调整图像大小的情况下显示它们。 - Marmalade实施了非常简单的内存模型,您会得到一个固定的堆,所有内存分配都是通过Marmalade完成的。从系统的角度来看,应用程序只有并保留一个大块(或几个大块)的内存。这有一些优点,但我在将此模型与iOS模型相匹配方面遇到了问题,例如收到内存警告并被期望放弃任何不必要的资源。这似乎是一个“一刀切”的情况,最终失去了一些关键性能。您可以使用扩展管理器和其他方法来显示本地UI元素,但整合大量的本地外观UI可能是一项挑战。因此,如果您的应用程序类似于游戏,并且用户可以处理非标准按钮等内容,那么这很好,但如果您预计需要重要的本地UI,则更难办到。[编辑:最新版本的Marmalade增加了本地UI框架,让您以通用方式指定标准UI元素,然后使用适当的设备小部件实现它们。我没有使用过这个,但它看起来相当全面。]
如果遇到问题,通常不清楚它是一般的操作系统问题还是Marmalade问题,找到帮助可能会感到孤独。例如,我最近在我的游戏中添加了iOS和Android的应用内购买。 IAP很具有挑战性,即使没有额外的SDK层,也有许多特殊情况需要处理。在我的情况下,我的应用程序因为一个小问题被苹果拒绝了,而在被拒绝的状态下,我的应用内购买也处于“已拒绝”状态(尽管IAP本身并没有任何错误; 这只是苹果过程的怪癖)。当我试图回归测试应用内购买功能时(同时我提交修复这个非与应用内购买相关的问题),游戏实际上崩溃了,而不是获得适当的错误结果。我能确定崩溃不是在我的游戏代码中发生的,所以要么是操作系统(不太可能),要么是处理应用内购买回调的Marmalade中间层(这就是它变成的[更新11/28/2012:据报告,Marmalade已经在最近的SDK更新中修复了这个问题])。
因此,在这种情况下,您可以尝试在Stack Overflow上寻求帮助,但实际上没有人愿意为您提供帮助,因此您需要依赖Marmalade团队向您提供答案。正如我所说,他们在这方面做得相当不错,但它无法与来自全球常规iOS程序员社区的几乎即时响应相竞争。因此,我会说这是使用像Marmalade这样的系统时我最大的担忧。它节省了您花费时间学习各种平台SDK细节的时间,但是当遇到问题时,您将“取决于”Marmalade团队(或友好的Marmalade社区成员)向您提供答案。(在这里请记住,我作为一个免费的独立开发者,只获得标准优先级的问题解决方案。您可以支付费用以获得保证的快速解决方案。)对我个人而言,一直不得不回来向我的制作人说“我正在等待Marmalade的答案”是很困难的。
(另一个问题3的例子是直到最近才有一些Android设备上的声音效果存在延迟的问题。这是一个Marmalade问题,他们最终确实解决了它,但需要一段时间,并且在此期间基本上无事可做。)请记住(正如其他回答者所指出的),即使没有Marmalade,您仍然可以在iOS或Android上将大部分代码库编写为C++。
尽管上面列出了许多潜在问题,但我是Marmalade的粉丝,并感谢公司为我提供的免费服务。当涉及到其他平台时,这个工具真正发挥作用,否则你可能从未关注过这些平台,例如对我来说就是bada或PlayBook。您可以从计算机和开发人员工作室(或者如果想让自己的生活变得有点艰难,可以从带有xcode的Mac上)轻松地部署到各种设备上。他们拥有的模拟器工具非常好用,只有少数情况下我必须在设备本身上进行调试;通常情况下,如果它在模拟器上运行,它就会正常工作。IdeaWorks承担了巨大的挑战,他们正在很好地处理所有这些功能(即基本上每个移动设备上提供的功能)和所有这些平台(即存在的所有重要设备,但不包括Windows Phone 7,因为它当前不允许本机代码)。它只是需要一些注意事项。

3
非常好的回答,感谢您花时间提供适当客观的经验。 - trickdev
2
感谢您提供详细的答案。只是想知道自您上次更新答案以来,您的任何问题是否有所改善/解决? - Costa
@Costa:嗯,我有点处于等待状态,仍在使用Marmalade。对我来说最紧迫的问题是启动画面,我已经找到了一个足够好的解决方法。在iPad上加载时仍会有一些跳动,但除此之外还可以。 - M Katz
我需要使用Opencv进行简单的人脸检测。我已经尝试了这里的Github代码https://github.com/marmalade/MarmaladeCV。但是我无法控制从相机捕获的帧。我能否得到一个简单的示例或链接,以便我可以继续使用Marmalade SDK + Opencv。 - user2727765
1
@MKatz,非常感谢您提供如此详细的答案;我真的很感激您的时间...只是想知道自从您上次更新答案以来已经过去了一年,您的问题是否有所改善/解决... - Shekhu
显示剩余3条评论

9

作为Marmalade的CTO,我可能有点偏见...但如果你的主要需求是(1)相机访问和(2)“挤出所有可用处理能力”,那么Marmalade是一个很好的选择。

Marmalade将您的C/C++编译为本地ARM(或x86)指令...无需转码,无虚拟机。它非常容易将现有的C/C++代码带入,几乎支持所有C/C++标准库等等。而且,您可以在项目中使用ASM代码。此外,您可以在Windows或Mac上进行所有开发,而不管您部署到哪个平台(是的,您甚至可以纯粹在Windows上编译/测试/部署到iOS)。


只有一个问题问Tim Closs: 你说:“(是的,你甚至可以在Windows上纯粹地编译/测试/部署到iOS)”。我能在Windows机器上将我的应用程序部署到苹果吗?我不需要Mac将应用程序发送到App Store吗?谢谢。 - user413185
我不能代表Marmalade官方回答,但是在整个过程中我使用Mac的唯一目的就是使用AppLoader提交应用程序。(据我所知,Windows没有AppLoader,但是有一个很好的iPhone配置实用程序可供Windows使用。) - M Katz
Tim,我们喜欢Marmalade并相信它的未来。它具有良好的性能和深入的工程工具(我们实际上已经向其git贡献了OpenCV)。但是,当使用相机时,我们现在担心应用程序会间歇性崩溃,其他人也报告了同样的问题。你们可以专注于解决这个问题吗?这对我们至关重要,我相信对每个人都是如此。一些相关的线程: http://tinyurl.com/7mcd5y5 http://tinyurl.com/7apzx4y http://tinyurl.com/czklmr9 - Lior
如何在不违反苹果开发者SDK许可/协议的情况下,在Windows上进行编译/测试/部署?我知道苹果明确禁止在非苹果操作系统上分发其SDK的衍生作品。因此,Xamarin使用Mac机器上的远程后端进行编译。Marmalade如何遵守苹果的许可证?如果一切都是二进制而不是解释性的,那么必须在Windows上安装从iOS SDK派生的一组头文件和库。 - register

2
据我所知,关于ANDROID开发: Android自身的相机API似乎有点不稳定(例如:在2.1之前,没有办法在纵向模式下显示相机而不会扰乱图像)。 在此之上添加另一层抽象可能更好(在可访问性、功能等方面),或者更糟糕。它确实会占用资源,这些资源可能是您自己应用程序所需的。

2
橘子酱提供了一个出色的原生扩展框架。

http://www.madewithmarmalade.com/marmalade/features/extensions-development-kit

这意味着你可以直接跳转到任何特定功能的本地实现。同时,你仍然可以保留主应用的跨平台开发的核心优势。
另外,在Android上,由于Marmalade利用了Android NDK,你的C++数据处理代码将比相应的Android Java代码运行得更快。
我正在使用Marmalade和扩展来制作游戏,本地代码的速度让我非常自信,能够至少与“原生”应用程序一样好。

1

我会使用MoSync Android/iOS,但我得说,因为我在MoSync工作。

但公平地说,我更喜欢MoSync相机API。

如果你真的想要挤出所有处理能力,你应该使用ASM。

/Tony


我们确实偶尔会使用一些内联汇编。 - Abai

0

我在2013年使用过Marmalade,感觉还不错。虽然有些bug和烦人的问题(比如固定内存池),但总体来说是一次不错的体验。

唯一真正令人失望的是缺乏对Linux的支持。我无法理解为什么Marmalade的开发者可以支持像Blackberry这样的小众平台,却不支持Linux;这毫无意义。也许随着Steam OS(一个基于Linux的面向游戏的平台)的成熟,情况会有所改变,尽管现在Steam OS并没有带来太多其他操作系统所没有的东西。


感谢您在Stack Overflow上的回答和贡献,但请再仔细看一下问题,因为根据[帮助/主题],它似乎不属于主题范围。回答不相关的问题会让人觉得这样提问是可以的 - 实际上并不是这样。不相关的问题可能会被关闭,然后被删除,这将使您的贡献无效! - Kyll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接