使用 AppleTV 遥控器时,SceneKit 顶点着色器制服无法正确更新

SceneKit vertex shader uniforms not updating properly when AppleTV remote is used

这可能是现存最疯狂的技术问题,我对获得解决方案的希望不大,但无论如何我都会尝试。也许有人可能会建议我尝试一下,虽然可能没有解释问题背后的原因,但无论如何都可以解决它。

我有一个正在为电视开发的 SpriteKit 游戏OS(Xcode 8.0,Mac OS 10.12),我有一个 SK3DNode,它有一个三角形网格,它使用顶点着色器来移动顶点。

顶点着色器有几个 mat4 制服(尽管这没有太大区别;即使我使用例如 vec4 制服也会出现问题),我用它来传递代码中的数据到着色器,从当前 SKScene 的更新方法。为此,我正在使用三角形网格 material 的 [SCNMaterial setValue:forKeyPath:]。

这运行良好且流畅,除非发生一件事:当我使用 AppleTV 遥控器的触摸板时,更新这些制服非常滞后(就像更新之间可能有半秒的延迟)。

请注意,我并不是说游戏滞后。或者甚至渲染三角形网格、顶点着色器或 SKScene 更新方法也会滞后。从字面上和明确的角度来看,这是对那些滞后的特定制服的新价值观的更新,没有别的。并且仅在我使用 AppleTV 遥控器的触摸板时明确显示。

是的,这个问题绝对是疯了。要理解为什么它绝对疯狂,请注意:

我怀疑,当遥控器的触控板出现问题时,SCNMaterial 并没有使用从其 setValue:forKeyPath: 方法中获得的值更新制服。我一点也不知道是什么或为什么,这是一个完全疯狂的问题。

当然这里的问题是,由于游戏是用遥控器控制的,所以基本不能用。顶点着色器无法正常工作。使用触控板改变方向,网格变形开始像疯了一样滞后。这是无法使用的。我不知道为什么会这样,也不知道如何解决。

我怀疑你的问题出现时SpriteKit渲染线程的runloop是运行 "slowly"。为确保您的 SceneKit 更改已提交 'asap' 到渲染树,您可以将更改包装在显式事务中:

[SCNTransaction begin];
[SCNTransaction setAnimationDuration:0];

// your changes

[SCNTransaction commit];

请注意,当您编写 'SceneKit' 应用程序并直接处理 SceneKit 的回调时,没有必要这样做。因为 SceneKit 将确保在 SceneKit 回调结束时提交您的更改。但是在这里你是从 SpriteKit 的游戏循环中修改 SceneKit 的模型。

尽管提交错误还是值得的。