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