SpriteKit中节点的最大数量

7

我正在制作一个使用瓦片地图的SpriteKit游戏。每个瓦片都是一个SKSprite节点。当我有大约800个瓦片时,没有任何问题。但是如果我尝试将地图大小增加到大约2000个瓦片,我的FPS从60降至20。屏幕上的瓦片节点数不会改变(约为80),只有不在屏幕上的节点数增加了。有什么想法可以解决这个问题吗?


Kobold Kit中的瓦片地图渲染器仅绘制可见的瓦片。http://koboldkit.com 你的地图有多大?有多少层?你对每个瓦片做些什么,还是它们只是静态精灵? - CodeSmile
这些瓷砖不是动态的,但它们具有物理体。这是一个挖掘游戏,所以“玩家”通过重力坐在这些瓷砖上,并在移动时从场景中移除它们。我希望地图宽约40个瓷砖,高约200个瓷砖。 - user1007895
1
创建了8000个物理体,难怪速度变慢。不过你并不需要物理引擎,一个简单的CGRectIntersect测试和速度积分就足够了。 - CodeSmile
他说得对,我在物理体方面的工作不多,但是是否可能仅将物理应用于靠近角色的瓷砖,而不是一次整个地图? - AwDogsGo2Heaven
您可以将物理体设置为非动态(将Dynamic设置为false),并在需要时通过开关打开Dynamic。这将减少FPS运行速度变慢的情况。动态有助于忽略应用于“地面”瓦片地图单元格的模拟。您可以在屏幕外有一个虚假的墙壁精灵,当它穿过时,Dynamic标志会被打开。在某些游戏中,最好只对关键元素使用物理效果,而不是整个游戏。您仍然可以检测到关闭Dynamic时的碰撞。我的当前游戏有1200个节点/ 60fps,并且并非所有元素都同时具有动态效果。 - Goodtime
2个回答

6

没有明确定义的节点最大数量。这取决于设备上可用的空闲内存量。例如,请考虑以下代码:

int NODE_LIMIT = 375000
....

    for (int i = 0; i<NODE_LIMIT; i++) {
        SKNode *node = [SKNode node];
        [self addChild:node];
    }

我可以在我的Sprite Kit游戏中创建375000个节点。但是,当我增加节点数量时,我的设备会因为内存不足而运行缓慢。您设备上的可用内存量将取决于多种因素。正如评论中提到的那样,您的帧速率变慢的原因是物理模拟会运行即使屏幕上没有可见的节点。 为了保持高帧速率,请删除不可见或不需要每帧模拟的物理体。您可以通过仅在可视部分添加精灵/物理体,并在它们不再可见时将其删除来实现此目的。

1
一个SKNode和一个SKSpriteNode之间有很大的区别,特别是它们的显示方式... - rezwits

0
地图瓦片不应放置在SKSpriteNode内部。
瓦片地图是一种特殊工具,可以创建背景而无需使用大量的节点数组。这样的数组可能会严重影响游戏性能。
根据苹果开发者论坛上的非官方帖子,它支持高达30,400,000个瓦片而不会出现性能问题。

https://developer.apple.com/forums/thread/102601


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