gpt4 book ai didi

ios - 轻松/高效地检查/删除 SKScene 子画面?

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:08:10 27 4
gpt4 key购买 nike

使用 SpriteKit 开发 iOS 游戏。我的背景由 map block 组成(本质上是无限 map ,程序生成)。

我们的系统旨在管理 map 的“ block ”,我们只加载玩家附近的 block 。由于 SpriteKit 要求我们添加 SKSpriteNodes,因此我们无法完全控制“卸载”不再靠近玩家的 block /瓦片的 Sprite 。

我意识到 SpriteKit 实际上不会在屏幕外渲染东西,但如果我们不能删除不再需要的 Sprite ,或者检查是否已经添加了 block /图 block ,它会降低性能。

由于 SKNodes 不响应 isEqual:,我只看到两种方法:

  • 给每个 Sprite 一个名字和它们的 block /瓦片坐标,并在每次更新时检查这个名字
  • 维护一个单独的已加载图 block 数组并检查它

是否有任何更简单的方法来检查/删除是否已经添加了 Sprite ?也许 Sprite 名称的部分字符串匹配?

我不确定使用 SpriteKit 是否是最好的解决方案(Xcode 模拟器似乎以 30fps 拖拽,尚未在真实设备上进行测试)。我们最初是用 Java 构建这个游戏的,我们正在渲染我们自己的纹理 - 因此只有加载的内容可以手动输入到 opengl 中。

-(void) renderToScene:(SKScene *)scene {

for( Chunk *chunk in loadedChunks ){
for( Tile *tile in [chunk getTiles] ){

SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithTexture:tileTexture];
sprite.name = @"Tile";
sprite.position = CGPointMake(realX,realY);
[scene addChild:sprite];
}
}
}

最佳答案

实际上会扼杀帧率的是频繁创建和删除节点 - 您应该有一个可以重复使用而不是重新创建的 sprite 池。

在重复使用您不再需要的属性时,只需更新 Sprite 的纹理、位置和其他属性。一个常见的用例是有足够多的图 block 来跨越整个屏幕加上一行和一列,这样当整行或整列移出屏幕时,您可以根据 map 数据将其重新定位到具有新纹理的另一侧.

关于ios - 轻松/高效地检查/删除 SKScene 子画面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23509092/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com