65.9K
CodeProject 正在变化。 阅读更多。
Home

Hot Shots* 颠覆传统触摸游戏

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2014年4月8日

CPOL

13分钟阅读

viewsIcon

16932

最近,英特尔® 应用创新大赛与英特尔® 开发者专区合作,向开发者们发起挑战,寻找触屏领域的下一个大热点,而 Adam Hill 的获奖太空飞船游戏《Hot Shots*》或许已经引爆了它。

下载次数

《Hot Shots*》颠覆传统触屏游戏 [PDF 656KB]

当苹果将触屏世界带入智能手机时,开发者们抓住了这个新机遇。如今,一种类似的机会正以触屏PC的形式再次冲击行业。虽然 Ultrabook™ 设备的发展可能激发了触屏的潜力,但这一趋势正蔓延到其他笔记本类型、桌面显示器以及 一体机 (AIO) 设计中。这是一个开放的领域,英特尔正通过各种竞赛激发全球开发者的创造力,其中一些竞赛类别非常适合触屏技术的创新。最近,由 英特尔® 应用创新大赛英特尔® 开发者专区 合作举办的比赛,向开发者们发起了寻找触屏领域下一个大热点的挑战,而 >Adam Hill 则用他获奖的太空飞船游戏《Hot Shots*》(图1)引爆了这一领域。

图1:Adam Hill 在联想 Horizon* 一体机上审视《Hot Shots*》的主界面。

起源、形式与功能

与许多开发者一样,Hill 在从事编程工作的同时,也一直钟情于许多经典的电子游戏,包括《Asteroids*》(1979年)、《Micro Machines*》(1991年)和《Geometry Wars*》(2003年)。他从作为管理员编写电子表格宏,到获得软件程序员的在职培训,但始终关注娱乐领域,并梦想有一天能创作游戏。当英特尔在2012年举办第一届应用创新大赛时,Hill 觉得自己已经具备了尝试的资格。那个项目是一款名为《Celerity*》的隧道游戏,让 Hill 获得了一些宝贵的经验。Hill 知道他必须精简想法并保持专注。最重要的是,他知道无论做什么,都需要让他自己喜欢;毕竟,他将是第一个用户,如果游戏对他自己来说都不有趣,其他人也不太可能喜欢。

当2013年 英特尔应用创新大赛 于7月启动时,Hill 开始了他的工作。英特尔宣布参赛者将获得一台联想 Horizon 一体机,该设备配备27英寸触屏,赛事组织者特别要求“一个引人注目的平台使用案例”。Hill 决心满足甚至超越这个要求。经过六个月数百小时的投入,最终的游戏看起来很像早期《Asteroids》和《Geometry Wars》的混合体。游戏画面精美,拥有重力物理效果,以及极具竞争性的玩家对战合作设计(图2)。Hill 承认,游戏的目的是专注于一件事:混乱。

图2:《Hot Shots*》明显偏爱触屏输入,但它也兼容游戏手柄、键盘,甚至联想游戏杆输入。

Hill 希望创造一款能重现老派面对面游戏分享体验的游戏,而不是通过互联网进行远程对抗。玩家的飞船像《Asteroids》一样在屏幕上出现,拖着尾焰,向前发射发光弹丸。屏幕中心的恒星对所有物体施加引力。(玩家也可以在屏幕上生成第二个太阳。)一个类似网格的线框覆盖在整个游戏区域下方,随着上方物体的引力而扭曲,给游戏带来了老式街机游戏所缺乏的3D感。屏幕边缘的 触屏 操作最多可供九名玩家使用,包括联想的触屏兼容游戏杆和射击器,其他玩家还可以通过键盘和微软 Xbox*-兼容控制器加入。游戏的设计可以适应任何时长的游戏会话。玩家可以随意加入这场混乱和破坏,享受其中的乐趣,然后离开,而不会打断其他玩家。

与大多数现代触屏面板一样,联想的显示器支持10点触控。Hill 将玩家控制区域设置在屏幕边缘,但他将其中一个边缘区域用于游戏控制,因此最多有九名触屏玩家,而不是十名(图3)。游戏可以单指操作,但用两根手指体验会更好,这会将触屏玩家数量限制在五名。

图3:Hill 可以在显示器边缘容纳多达10个触控区域。其中一个区域最终被用于游戏菜单控制。

“我使用了屏幕上的图标按钮,因为我需要完全陌生的人和非英语母语者一眼就能理解如何控制应用程序,”Hill 说。“许多控件是二元的——开关——让人回想起《Asteroids》这样的复古游戏。另外,我处理的是大量独立的触控。当有触控发生时,为了简单起见,我想知道是几个用户中的哪一个创建了它,这在他们触摸区域内时更容易。从技术角度来看,这主要取决于了解你的 API,设计好手势冲突,并考虑视觉反馈的概念。”

为了完善游戏,Hill 聘请了自由音乐人 Patrick Ytting,他创作了出色的配乐。精美的视觉效果则归功于游戏设计师兼平面艺术家 Thomas Tamblyn。这两位都是愿意以部分知识产权所有权和收入作为报酬的,这是 Hill 作为一名独立程序员能够可行地完成项目的唯一方式。

解决的开发挑战

粒子系统和图形负载

毫不奇怪,《Hot Shots*》背后的图形负载可能相当大。当有两名玩家时,GPU 负载尚可,但只要有三名玩家,粒子和扭曲网格的干扰,加上太阳的暮光射线和其他效果,就可能占用大量的处理资源。如果底层引擎编码不当,这种负载会进一步加剧。因此,Hill 将尽可能多的图形处理转移到了 GPU 上。为了实现跨集成显卡和独立显卡都能流畅运行的性能,Hill 重写了他的粒子引擎三次。

“一旦我知道什么是一个障碍,我就会全力以赴,”Hill 说。“我会重做它,直到它成为系统中速度最快的东西之一,而不是最慢的。通常的方法是将其转移到 GPU,尽管对于粒子来说,诀窍是使用一个简单的粒子池,而不是复杂的链表或队列。你做出的优化决策总是特定于当前程序的。”

Hill 最初的粒子系统基于一个包含粒子对象 LinkedList 的类。他认为他会创建新粒子,将它们添加到 LinkedList 中,并能够从列表中的任何位置删除死粒子而无需重新索引。不幸的是,Hill 忽略了在 C# 中快速创建和销毁大量新实例的性能影响,当实例化和销毁率达到一定程度时,垃圾回收器会因负担过重而难以运行,导致明显的性能下降。

为了诊断这种性能瓶颈,Hill 开始更换软件组件。一旦他消除了粒子,他就找到了罪魁祸首。然而,他想要《Hot Shots》中大量粒子带来的视觉效果,所以他开始浏览不同粒子引擎的源代码以获取灵感。他发现其他人通常偏爱对象池方法而不是链表。此外,还维护一个“死”/空闲粒子的 FIFO 队列。也就是说,有一个固定长度的数组,粒子对象只创建一次。粒子通过将它们的引用移动到队列中和移出队列来按需逻辑激活和停用——即回收而不是重新创建。因此,垃圾回收器永远不必介入,因为在最初的半瞬间设置之后,没有任何东西被创建或销毁。

“最大的收获是,在游戏中的密集处理过程中,你不想在任何地方使用‘new’关键字,”Hill 说。“在关卡开始时加载所有你能加载的东西,然后疯狂地回收利用。”

Hill 的第二个粒子引擎比前一个快了几个数量级,因此更稳定。实际上,更多的玩家可以创建更多的粒子,而不会有任何明显的性能变化。然而,这个较新的引擎在管理空闲粒子列表的队列方面仍然效率低下。尽管它们不是每次都重新创建,但这仍然显得效率低下。像子弹轨迹或推进轨迹这样的粒子寿命很短,并且随着时间的推移会褪色并失去重要性。Hill 意识到他不必只回收已知为空闲的粒子。与其遍历列表直到找到一个空闲粒子,他可以直接使用迭代中的下一个粒子。这使他能够维护一个单一的索引值,而不是管理整个队列,从而大大减少了工作量。当索引绕回到一个已经使用的粒子时,该粒子可能已经死亡或至少是大部分透明的。用户可能永远不会注意到一个突然死亡的粒子,尤其是在其他视觉干扰之中。实际上,Hill 意识到他“……在这种情况下可以逃脱罪责”。

“v3 的优化不仅仅是技术性的,”他补充道,“它依赖于对回收算法和用户感知大部分透明粒子之间的模糊关系的顿悟。在你的游戏中,你必须权衡这一点。也许你可以采取另一种巧妙的技巧?”

下面的代码演示了 Hill 重写前后的粒子引擎

// Version 2 Init
public override void Initialize()
{
    this.particles = new FastParticle[MaxParticles];
    this.freeParticles = new Queue<FastParticle>(MaxParticles);

    for (int i = 0; i < particles.Length; i++)
    {
        particles[i] = new FastParticle();
        freeParticles.Enqueue(particles[i]);
    }

    base.Initialize();
}

// Version 3 Init - can't get much more simple than this
public override void Initialize()
{
    this.particles = new FastParticle[totalParticles];

    for (int i = 0; i < particles.Length; i++)
    {
        particles[i] = new FastParticle();
    }

    base.Initialize();
}

// Version 3 Update, with Version 2's redundant code commented out
public override void Update(GameTime gameTime)
{
    foreach (var p in particles)
    {
        if (p.Active)
        {
            this.UpdateParticle(gameTime, p);

// No need to Queue up free particles any more
// Just wrap round and re-use regardless
// Recycle First. Recycle Hard. NO MERCY (or indeed, queuing).
            //if (!p.Active)
            //{
            //    this.freeParticles.Enqueue(p);
            //}
        }
    }

    base.Update(gameTime);
}

语音识别

Hill 有时间尝试了非必需的游戏元素(图4)。可能最引人注目的是游戏的“脏话警察”,它使用语音识别功能,通过让敌对物体向他们聚集来训斥说脏话的玩家。(请记住,游戏玩法旨在专注于群体设置,可能还包括年轻玩家。)然而,实现起来相当棘手。底层引擎假定所有语音都有意义,但这里的目的是忽略大部分语音,只关注已知的脏话。Hill 试图将一个 API 强行用于与其原始目的相反的功能。可以预见,他得到了相当多的误报。

图4:《Hot Shots*》的游戏画面可能相当激烈。Hill 实现了一个“脏话警察”功能,以鼓励玩家保持游戏体验适合所有年龄段。

“作为回应,我打破了常规的做法,即向识别数据库提供一组非常有限的词汇,而是给了它一个包含20,000个单词的巨大词典来忽略,”Hill 解释说。“这样,如果它认为听到了我30个左右的关键脏话,而忽略了20,000个其他随机单词,那么脏话发生的可能性就大得多。当时我想,我没听说过别人这样做,但自那以后,我至少在一款 EA Sports 游戏中看到了这种类型的脏话管理。”

触屏开发

Hill 喜欢使用 XNA 4,但在 Windows* 8 上为 触屏 编程可能是一项挑战,因为随着行业转向 MonoGame*,内置的 TouchPanel 类往往支持不足。幸运的是,Hill 从他之前的游戏《Celerity*》中已经有了解决方案。“解决方案是包含 Windows7.Multitouch.dll,”Hill 指出。“不要被它的名字吓倒;它对 Windows 8 解决方案仍然非常有用。它提供了对低级触屏处理的访问,这对于速度和可靠性来说非常棒。虽然它支持 WM_GESTURE API 的包装版本,但我更喜欢直接使用 WM_TOUCH API。”

可以通过以下必要的 TouchHandler 实现对 TouchUp、TouchDown 和 TouchMove 事件的访问

var touchHandler = Factory.CreateHandler<TouchHandler>(game.Window.Handle);

Hill 还遇到了“粘滞触控”的问题。在某些情况下,抬起手指并不导致 TouchUp 事件。显然,这会造成严重问题,例如停止飞船开火或添加其他用户。解决方案被证明是“触控剔除”。

通过剔除,每次收到来自触控点的新信息时,倒计时就会重置。有效地,触控会超时。乍一看,这似乎会导致按下按钮的场合会简单地停止工作,但实际上,触屏的传感器分辨率足以记录微小的手指移动,即使用户认为自己没有移动。这些微小的移动会注册为 TouchMove 事件并重新启动倒计时。

学到的经验,给出的建议

《Hot Shots》之所以赢得了2013年英特尔应用创新大赛的全能一体机 (AIO) 类别奖项,有多种原因。显而易见,该游戏充分利用了大型触屏界面,但它以一种促进团队参与和互动的方式来实现这一点。《Hot Shots》传承了一些经典游戏的怀旧感,同时增加了多层图形魔力,使该应用程序既现代又充分利用了当前一代处理器提供的强大性能。视觉效果和配乐令人惊叹,也许最重要的是,《Hot Shots》直观地展示了未来的一体机系统如何能够在平放和直立状态下服务于一套全新的用途。

有时,编码不仅仅是指令。要完美地打造一款应用程序,有时程序员需要退一步思考范式,尤其是在涉及新的硬件功能时。“我们必须认识到,按钮和滚动条的旧交互隐喻在很多情况下都是次优交互,”Hill 说。“滑动手势如此简单,但又如此强大。想想看,在表面上随意拖动指尖比瞄准和点击要容易得多。成功的手势通常非常粗略和近似。用户需要的精度越低,他们就能去得越快。进行自己的分析。”为了进一步加强,Hill 建议交互设计师从 Josh Clark 的“按钮是一种技巧”的演讲开始。

有时,经验会让程序员在某些情况下违背传统观念。例如,Hill 指出,对于英特尔应用创新大赛2013等比赛,他不会使用单元测试。许多程序员认为单元测试对于保证质量至关重要。然而,虽然他承认在专业代码中需要单元测试,“……对我个人而言,在这样的比赛中,我认为‘就是编码’是一种净收益。”

Adam Hill 认为触屏和触觉技术有着光明的未来。他现在正致力于创办一家 公司,在 Windows 8 应用商店发布《Hot Shots》并推广平板电脑计算。联想的 Horizon 设备证明了这种外形现在已经可以以可负担的水平销售,这意味着现在是深入挖掘并探索我们想象力能将该平台带到多远的时候了。

使用的资源

在开发《Hot Shots》时,Adam Hill 使用了英特尔在 英特尔® 开发者专区 上的 Ultrabook™ 和平板电脑 Windows* 8 传感器开发指南。他还使用了 Visual Studio*Git/Bitbucket*Adobe Creative Suite*Stack Overflow。Hill 强烈推荐 MonoGame,它在低级图形和生产力之间取得了平衡。最后,Hill 使用 Farseer* Physics 来处理碰撞,尽管他定制了游戏的所有重力。

其他文章

Intel、Intel 徽标、Intel Core 和 Ultrabook 是 Intel Corporation 在美国和/或其他国家/地区的商标。
*其他名称和品牌可能被声明为他人的财产。
版权所有 © 2014。英特尔公司。保留所有权利。

© . All rights reserved.