Spritekit游戏在iPad模拟器上经历了显着的延迟

问题描述 投票:0回答:1

背景:我是一名高中计算机科学老师,我想提出一个引人入胜/有趣的作业,测试我的学生的编程知识。我很少有使用SpriteKit编程iOS游戏的经验,但我认为这将是一种在竞争激烈的环境中集成许多课程概念的有趣方式。

游戏:每个学生都将在一场面对面的战斗中相互比赛,在那里他们需要编制一艘能够移动并向他们的敌人发射导弹的宇宙飞船的人工智能。每个玩家从20点开始,每当他们被导弹击中时,他们的总数减少一,直到玩家达到零并且游戏结束。每个玩家只获得10枚导弹,因此他们必须明智地使用它们。如果导弹超出视线边界或者击中另一个对手,导弹会补充。

问题:我连续几年完成了这项任务,每年只做了很小的改动。然而,今年测试期间,一旦游戏开始,游戏将降至9fps左右。显然,这会消除游戏的大部分乐趣,并且由于滞后而使调试变得痛苦。

代码结构

节点只有几个SKLabelNode用于显示玩家姓名和分数。宇宙飞船都是节点,它们每个都包含10个导弹的阵列,这些导弹也是节点。宇宙飞船和导弹都有自己独特的类,定义了它们的属性和行为。还使用了背景图像。总共只有24个对象被添加到GameScene中,而且这种对象永远不会改变。

  1. 初始视图控制器(PlayerPickerViewController) - 这允许用户选择谁是玩家1和玩家2.然后选择要使用的(学生)类的名称以及他们的太空船的图像。有一个结构,每个宇宙飞船都有一个静态对象,因此可以在不同的类中访问它们。
  2. 游戏的视图控制器(GameViewController) - 这需要GameScene并让它显示在这个视图控制器中
  3. 游戏场景(GameScene) - 处理游戏的所有初始设置,包括创建变量和向视图添加节点。
  4. 宇宙飞船和导弹类 - 它们处理定义宇宙飞船和导弹行为(即运动,射击,大小等)的方法和属性。学生不得修改此代码,以便他们在相同的游戏条件下工作。
  5. 学生课程(“他们的姓氏”.swift)在这个课程中,学生必须编写两个函数(一个用于player1,一个用于player2)。这是学生定义移动和射击策略的地方。每一帧,调用适当的函数来移动玩家。当在PlayerPickerViewController中选择玩家时,游戏了解每个框架需要调用哪个学生类(基于他们的名称和类名称完全相同)。

当我在我的个人MacBook Pro上构建和测试游戏时,游戏按预期运行(没有延迟)。但是,每个学生都在使用以下规格的Mac上工作:

  • iMac(21.5英寸,2013年末)
  • 处理器2.9 GHz Intel Core i5
  • 内存8 GB 1600 MHz DDR3
  • 显卡NVIDIA GeForce GT 750M 1024 MB

在我看来,即使计算机变得越来越老,它们仍然能够处理这种只有20多个节点的游戏的简单化。

改变模拟器会有所不同(即iPad Pro 12.9英寸第3代到第6代iPad)吗?

我感谢你能给我的任何帮助,以解决这个滞后问题。谢谢。

如果您有兴趣查看代码以及类如何相互交互,那么这里是游戏的链接。 The GAME这不是最新版本,但它与学生目前使用的版本非常相似。

ios swift sprite-kit skspritenode
1个回答
1
投票

首先在设备上运行游戏以缩小问题范围并确保问题出在模拟器上。

在其中一台iMac上使用Instruments配置您的游戏。这会让你看到是什么导致帧率如此之低。

在Xcode中选择产品>配置文件以在仪器中配置您的项目。从模板列表中选择Time Profiler工具。以下文章显示了如何使用Time Profiler工具:

Finding the Slow Spots in Your Code with the Time Profiler Instrument

由于你的学生必须在他们的Mac上测试游戏,另一种方法是制作游戏的Mac版本。游戏在Mac上比iOS模拟器本地运行得更好。 SpriteKit代码在Mac和iOS上都是相同的。主要区别在于处理Mac上的鼠标事件而不是iOS上的触摸事件。 Xcode有一个跨平台的游戏项目模板,可以让你制作一个在Mac和iOS上运行的游戏。

© www.soinside.com 2019 - 2024. All rights reserved.