打破跨平台神话





0/5 (0投票)
碎片化对业务不利,而移动游戏开发是一个充斥着陷阱和困难的碎片化严重的行业。本文概述了这些因素,并解释了开发人员如何在无需妥协的情况下克服这些因素,从而降低成本。
引言
碎片化对业务不利,而移动游戏开发是一个充斥着陷阱和困难的碎片化严重的行业。开发人员必须应对与为不同平台和不同供应商开发游戏相关的各种棘手问题。
这些问题包括
- 编程语言 – 不同平台使用不同的编程语言。例如,iOS 使用 Objective-C,Android 使用 Java,Windows Phone 8 使用 C#,BlackBerry 使用 C++ 等等。
- 框架 – 每个平台都有其独特的框架和 API 集,必须彻底掌握才能高效地使用。
- 服务 – 每个平台在实现各种服务(例如应用内购买)方面都有自己独特的方式。此外,支持该平台的制造商也有自己实现这些服务的方式,例如 Android 的 Google Play、Amazon、Samsung Apps 等。
- 性能 – 要在每个平台上获得接近最佳的性能,需要对平台非常了解的程序员。
- 开发设备 – 大多数平台都可以使用 Mac 和 PC 进行开发。但是,iOS 开发只能在 Mac 上进行。
- 测试 – 测试从仿真开始,这提供了一种简单的方式来测试各种不同的外形尺寸、屏幕分辨率、输入设备等。问题在于,一些设备仿真器速度慢且响应不灵敏,这会使针对不同场景的测试变得困难。
- 维护 – 将应用程序更新推出到多个平台是一项艰巨的任务,尤其是在距离上次查看项目可能已经过去几周或几个月的情况下。
上述因素会带来风险和不断上涨的成本,这是移动游戏开发者绝对需要避免的。
有什么方法可以降低将游戏移植到不同平台所带来的成本和风险?开发者如何避免上述大部分问题?
一个解决所有这些问题的答案是转向跨平台开发系统。人们普遍误认为跨平台方法会带来某种程度的妥协,无论是覆盖平台功能、牺牲性能还是延长整体开发周期。
我们在本文中将说明情况并非如此!
Marmalade 解决方案
本文将重点介绍 Marmalade C++,即 Marmalade SDK 的核心,以及它如何应对上述所有问题。
- 单一语言 – Marmalade C++ 不出所料,在所有平台上都选择 C/C++ 作为其首选语言。
- 统一框架 – Marmalade 是一个单一的 SDK,它封装了对图形、音频、输入、网络服务等子系统的访问。
- 统一中间件 – 应用内购买等服务在所有平台上使用单一的统一 API。
- 原生性能 – 代码被编译为 ARM、x86 和 MIPS 处理器的原生代码。在一个平台上进行的优化适用于所有平台。
- 桌面/IDE 不受限制 – 开发人员可以在 Windows 或 Mac 上为大多数平台进行开发,包括 iOS。无需在 IDE 中创建或管理项目,可以使用 Marmalade Hub 提供的一个易于使用的通用用户界面来完成。
- 测试简单 – Marmalade 模拟器附带指标,能够跨越大量不同的屏幕尺寸和各种输入设备进行快速测试。Marmalade 还支持直接将调试和发布版本部署到设备。
- 易于维护 – 采用单一语言、单一框架以及简便的统一测试和部署,推出更新会更加轻松快捷。
Marmalade C++ 经过多年的发展,已成为一款可靠、稳定且用户友好的产品,支持包括
- Android(ARM、MIPS 和 x86)
- iOS(iPhone、iPad、iPod)
- BlackBerry(PlayBook、BB10)
- Windows Phone 8
- Windows Store 8/8.1
- Windows 桌面
- Mac OS X
- Tizen
- 智能电视(LG / ROKU)
节省时间的统一框架
整个 Marmalade C++ 框架基于 C/C++,通过个别 API 提供对设备子系统的访问。让我们来看几个例子。
示例 1 – 加载图像文件并绘制 2D 精灵
// Load an image from storage
CIw2DImage* image = Iw2DCreateImage("candy_gem.png");
// Draw the image on screen
Iw2DDrawImage(image, CIwFVec2(x, y), CIwFVec2(width, height));
Marmalade 可以直接从存储加载各种不同的图像格式。
示例 2 – 加载 3D 模型、材质和纹理并渲染它
// Load a 3D model, its material and textures
CIwResGroup* group = IwGetResManager()->LoadGroup("my_model.group");
// Find the model resource
CIwModel* my_model = (CIwModel*)group->GetResNamed("my_model", IW_GRAPHICS_RESTYPE_MODEL);
// Build models 3D transform
CIwFMat transform
transform.SetRotY(rotation.y);
transform.ScaleRot(scale);
transform.SetTrans(position);
IwGxSetModelMatrix(&transform);
// Render model
my_model->Render();
Marmalade 将 3D 模型及其相关数据存储在一个方便的资源组中,允许相关资源一起加载和卸载。提供的工具可将数据从 3D Studio Max 和 Maya 直接转换为 Marmalade 资源组,从而提供高效可靠的资产转换管道。
示例 3 – 播放流式音乐
// Check if MP3 is supported and play an MP3 file
if (s3eAudioIsCodecSupported(S3E_AUDIO_CODEC_MP3))
s3eAudioPlay("background_music.mp3");
Marmalade 支持播放各种不同的音频和视频格式。
示例 4 – 读取加速计
// Read accelerometer values
int x = s3eAccelerometerGetX();
int y = s3eAccelerometerGetY();
int z = s3eAccelerometerGetZ();
Marmalade 支持各种输入设备,包括加速计、指南针、触摸、键盘等。
示例 5 – 进行应用内购买
// Initialise billing
IwBilling::Init("public_key", IwBilling::BILLING_VENDOR_GOOGLE_PLAY);
// Purchase a product
IwBilling::PurchaseProduct("product_id");
Marmalade supports a wide variety of app stores including
Marmalade 支持各种应用商店,包括 Apple App Store、Google Play、Amazon AppStore、Samsung Apps、BlackBerry App World 等。
上述所有示例在所有支持的平台和设备上行为一致。使用 Marmalade SDK 编写的代码易于编写和维护,可大幅降低项目成本。
集中式开发中心
Marmalade Hub 是一个以平台无关的方式集中以下功能的工具
- 项目创建
- 项目编译和测试
- 项目部署到设备和应用商店
这消除了使用 makefile 和构建脚本以及不同工具集进行工作的需要。
Marmalade Hub 还检查用户系统上的依赖项,以确保所有内容都已安装并正常运行。
仿真下的轻松测试
Marmalade 模拟器是一个工具,可让开发人员直接在桌面以全速测试其创作,提供快速的测试环境,从而大幅加快开发速度。
模拟器拥有大量有用的功能,可以辅助开发和测试,包括模拟各种不同的输入设备、屏幕分辨率/方向、内存大小、音频等。
模拟器还支持指标,使开发人员能够看到内存分配/释放、API 调用和 GL 调用等事件发生的频率。
尽善尽美的性能
Marmalade SDK 不使用任何解释器或虚拟机,所有代码都针对目标处理器(ARM、x86 和 MIPS)进行了编译和优化,为 2D 和 3D 游戏提供超快的 60 帧每秒游戏体验。
摘要
跨平台移动游戏开发是一个困难、昂贵且耗时的过程,但并非必须如此。
应用商店中提供的许多 Marmalade 制作的游戏和应用 表明,开发者可以在跨平台开发产品的同时,最大限度地减少此类方法通常伴随的问题。
Marmalade 的单一语言、统一 API 以及 Hub 和模拟器等便捷工具可以帮助降低成本,使曾经遥不可及的项目变得可行。