【发布时间】:2020-06-03 05:49:04
【问题描述】:
我正在创建一个以洞穴为主要环境的 3-D 游戏。洞穴由大量环形段组成,一个连接另一个,因此形成了一个目前很小的隧道系统。
如果玩家在洞穴内,则只有一小部分片段可见。我认为实际上隐藏不可见的部分可以节省大量的 gpu 时间,我需要其他对象,如建筑物或敌人。
所以我首先尝试做的是隐藏整个洞穴,然后通过将“node.isHidden”设置为真和假来取消隐藏可见部分。 通过它们的名称找到和访问特定的节点:“Node.childnode (withName: „XYZ003“, recursively: false).isHidden = true”(或 false)。
它可以在段不隐藏的情况下工作,但是一旦我尝试隐藏以前未隐藏的段,渲染器就会崩溃并出现 EXC_BAD_ACCESS。
对隐藏的对象进行隐藏(当然没用,但有助于理解问题)很好,取消隐藏未隐藏的片段也是如此。
根据另一个线程的提示,我将例程移到渲染器委托中,因此不会在错误的时间进行切换,而是在应该发生此类更改的阶段进行,但这没有帮助。 作为替代方案,我通过 SCNActions 进行了隐藏(和取消隐藏),但我收到了相同的结果,这真的让我感到困惑,因为这将是一种“官方方式”......
我还使用了“递归”布尔值,得到了相同的结果(适用于取消隐藏,在 isHidden = true 时崩溃)。
然后我尝试更改节点的不透明度或其他属性——效果很好。另一方面,尝试从父节点中删除节点也会导致上述崩溃。
我需要它来工作,因为旧硬件永远无法处理数千个节点(尝试这个,帧速率下降到 10fps,即使周围没有敌人)。一旦敌人出现,更新的硬件可能会崩溃......
我的想法是指针在某种程度上被第一次取消隐藏(以及因此 BAD_ACCESS 错误)弄乱了,所以可能是额外的绑定(通常在 spritekit-routines 中看到)或其他获取节点指针的方法可能是解决方案。另一方面,如果指针坏了,为什么我仍然可以访问所有其他属性?也许是子节点导致了问题 - 每个节点都有 20 个子节点,它们也应该改变可见性。
在我之前有没有人遇到过这种行为?我在谷歌搜索期间找不到任何东西......
【问题讨论】:
标签: properties scenekit scnnode scnscene