街机表演信息#

../_images/flame-arrow.svg

游戏速度最慢的三个方面是碰撞检测、绘制基本性能和精灵绘制性能。

碰撞检测性能#

../_images/collision.svg

检测精灵之间的碰撞可能需要一段时间。如果你有一张有50,000个精灵组成的墙的地图,那么每一帧你必须进行50,000个检查。(O(N)运算,如果您熟悉 大O 表示法。)如果您的游戏包含多个需要检查碰撞的东西(敌人、子弹等)然后每个人都需要进行检查。这可能需要足够长的时间,一场比赛可能会在60 FPS以下开始放缓。

我们怎样才能加快速度呢?Arcade可以使用一种名为 空间散列

空间散列#

Arcade将屏幕划分为一个网格。我们跟踪每个精灵重叠的栅格位置,并将它们放在 哈希图 。对于每个网格位置,我们可以在一个快速的O(1)操作中快速拉取该网格中的精灵。当寻找与我们的目标精灵碰撞的精灵时,我们只在共享其网格位置时查看精灵。这可以将支票从50,000张减少到3或4张。

这是有缺点的。如果精灵移动,我们必须重新计算和重新计算它的位置。这需要时间。这并不意味着我们不能 ever 移动精灵!但这确实意味着我们必须在是否使用空间散列方面做出选择:

  • 只有几个精灵?不到100人?那么它太小了,你选什么都无关紧要。

  • 我们不需要检查与精灵列表的冲突吗?空间散列。

  • 我们的精灵列表中的所有精灵都会每一帧都移动吗?空间散列。

  • 精灵是平台吗?他们中的大多数都不动了?空间散列开始了。

Arcade默认为无空间哈希。可以通过以下方式打开空间散列:

self.my_sprite_list = arcade.SpriteList(use_spatial_hashing=True)

计算着色器#

目前在设计板上,是使用 计算着色器 在您的显卡上检测冲突。这具有空间散列的速度优势,而不会影响速度。

绘画基元表现#

绘制直线、矩形和圆形可能会很慢。每个绘图命令每秒被单独发送到图形卡60次。如果您绘制成百上千条线/框,则性能将非常糟糕。

如果您遇到这种情况,您可以通过使用 arcade.ShapeElement 列出批量处理绘图命令的位置。如果您可以将项目组合在一起,那么只需一个命令就可以绘制复杂的树。

有关详细信息,请参阅: ShapeElementList说明

精灵绘制性能#

精灵绘制是通过 arcade.SpriteList 班级。将精灵加载到图形卡并批量绘制。不会移动的精灵可以以令人难以置信的速度重新绘制。移动的精灵只需要更新它们的位置。使用Arcade绘制Sprite的速度令人难以置信,并且几乎不需要程序员的任何额外工作。

文本绘制性能#

Arcade‘s arcade.draw_text() 可能会很慢。要加快速度,请使用文本对象。看见 使用文本对象绘制