我将SKScenes用于主菜单的不同屏幕。这些屏幕中的每一个都相当复杂,具有许多元素。 因此,每当用户在这些屏幕之间移动时,在进入下一个场景或前一个场景之前会有1-2秒的延迟,因为我每次都会重新创建它们。
我是否应该在创建场景之后将场景存储在某些单例中,以便下次调用更快? 这样做好吗?不会太沉重记忆吗?
答案 0 :(得分:6)
一些优化提示:
1)你最大的记忆力将是图形。要控制此值,请将SKTexture对象与纹理图集一起使用。始终使用纹理图集,因为:
纹理图集可以提高内存使用率和渲染性能。例如,如果你有一个带有不同纹理的精灵的场景,Sprite Kit会为每个纹理执行一次绘图传递。但是,如果所有纹理都是从相同的纹理图集加载的,那么Sprite Kit可以在单个绘图传递中渲染精灵,并使用较少的内存来执行此操作。每当你拥有总是一起使用的纹理时,你应该将它们存储在地图集中。
2)根据等级创建纹理地图集,这样就不会消耗内存。换句话说,为级别1创建一个图集,为级别2创建另一个图集,依此类推。根据文件:
对于较大的游戏,您可能需要将纹理分割为关卡或主题。每个级别或主题的纹理都设计为适合特定的内存量。当玩家开始一个新关卡时,你会预加载该关卡的所有纹理对象。当玩家完成水平播放时,下一级别不需要的纹理将被丢弃。
3)如果您在不同场景中使用了大量相同的动画,则可以使用(SKSpriteNode)单例。例如,存在于所有级别中的敌人,其具有用于空闲,行走,跑步,跳跃,攻击等的动画......相同的单身人士可以为您的动画加载所有纹理alases。您还可以使用单例来存储所有游戏声音,从而进一步减少加载时间,但如果您有很多声音/音乐,请密切关注内存使用情况。
4)设置skView.ignoresSiblingOrder = YES;
也可以提高优化效率。根据文件:
默认值为NO,这意味着当多个节点共享相同的z位置时,这些节点将按确定的顺序进行排序和呈现。父母在他们的孩子面前呈现,兄弟姐妹从最年长到最年轻。当此属性设置为YES时,在确定渲染顺序时将忽略树中节点的位置。在相同z位置处的节点的渲染顺序是任意的,并且可以在每次渲染新帧时改变。当忽略兄弟顺序和父顺序时,Sprite Kit会应用其他优化来提高渲染性能。如果需要以特定和确定的顺序呈现节点,则必须设置这些节点的z位置。
5)如果您的图像不是绝对需要alpha,请不要将其包含在图像中。
6)如果您不再需要父节点,请从父节点中删除它们。还要确保删除对它们的任何引用,例如包含在任何数组中。其余的由SpriteKit处理,如文档中所述:
创建一个SKTexture对象并将其附加到sprite。只要精灵节点在场景中,该纹理对象就会自动加载纹理数据,是可见的,并且是渲染场景所必需的。稍后,如果精灵从场景中移除或不再可见,Sprite Kit可以删除纹理数据,如果它需要该内存用于其他目的。这种自动内存管理简化了但不会消除您在游戏中管理艺术资产所需的工作。
换句话说,通过删除对它的任何强引用来删除SKTexture对象,包括: