Shader 使用AppleTV remote时,SceneKit顶点着色器未正确更新

Shader 使用AppleTV remote时,SceneKit顶点着色器未正确更新,shader,scenekit,tvos,uniform,Shader,Scenekit,Tvos,Uniform,这可能是目前存在的最疯狂的技术问题,我不太希望找到解决方案,但无论如何我会尝试。也许有人会提出一个建议,我可以试试看,虽然我可能不会解释问题背后的原因,但无论如何我都可以解决它 我有一个为tvOS开发的SpriteKit游戏(Xcode 8.0,Mac OS 10.12),还有一个SK3DNode,它有一个三角形网格,它使用顶点着色器来移动顶点 顶点着色器有两个mat4制服(尽管这没有多大区别;即使我使用例如vec4制服,问题也会发生),我使用这些制服从当前场景的更新方法将数据从代码传递到着色器

这可能是目前存在的最疯狂的技术问题,我不太希望找到解决方案,但无论如何我会尝试。也许有人会提出一个建议,我可以试试看,虽然我可能不会解释问题背后的原因,但无论如何我都可以解决它

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

顶点着色器有两个mat4制服(尽管这没有多大区别;即使我使用例如vec4制服,问题也会发生),我使用这些制服从当前场景的更新方法将数据从代码传递到着色器。我正在使用三角形网格材质的[SCNMatary setValue:forKeyPath:]进行此操作

这项工作非常顺利,但有一种情况除外:当我使用AppleTV遥控器的触摸板时,更新这些制服的时间非常慢(比如在更新之间可能会有长达半秒的延迟)

请注意,我没有说游戏落后。甚至渲染三角形网格、顶点着色器或场景更新方法都会延迟。这是字面上和明确的更新新的价值观,以那些特定的制服,滞后,没有别的。而且只有在我使用AppleTV遥控器的触摸板时才明确

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

  • 我特别确信,落后的只是更新我制服的价值,而不是别的。例如,如果除了使用它们之外,我还使用系统提供的u_时间均匀性向顶点着色器中的顶点添加了一些移动,则效果很好。(换言之,u_时间制服更新得很好,每秒60次,但我的mat4制服没有更新,导致根据u_时间计算的移动完全平滑,而我制服上的额外移动确实滞后。)同样,屏幕上没有其他东西滞后

  • 是的,我设置这些制服值的更新方法每秒调用60次。我已经用系统的时钟检查过了。这里没有耽搁。这不像是系统跳过调用我的更新函数而导致的问题。它每秒被调用60次,我每次都在更新制服(使用[scnmatary setValue:forKeyPath:])。我已经彻底检查过了

  • 而且也不仅仅是一些跳过的帧。如前所述,我们谈论的是最多半秒甚至更多的延迟,最坏的情况下;而且经常反复地说。(当更新的值最终到达着色器本身时,它们会以相等的数量向前跳跃。)

  • 是的,只有当我使用AppleTV遥控器的触控板时才会发生。(我不确定在使用其按钮时是否会发生这种情况。可能会发生,但实际上不可能以足够快的速度按下按钮使其产生效果。滑过触摸板会导致系统连续不断地输入,而这就是发生的时候。)如果我不使用触摸板,制服会每秒更新60次,顶点的移动是平滑的

  • 这个问题不会发生在gamepad上。尽管gamepad的模拟棒会产生类似的输入流,但似乎不会产生相同的效果

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


当然,这里的问题是,由于游戏是用遥控器控制的,所以它基本上无法使用。顶点着色器无法正常工作。用触控板改变方向,网格变形开始疯狂地滞后。它不能用了。我不知道为什么会发生这种情况,也不知道如何修复它。

我怀疑当出现问题时,SpriteKit渲染线程的runloop正在“缓慢”运行。要确保场景基特更改“尽快”提交到渲染树,可以将更改包装到显式事务中:

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

// your changes

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


不过还是值得一提。

首先,这听起来像是一个很酷的效果,三角形的变形是游戏的一部分。有点像现代的Qix。或者别的什么,我想。第二,你能为iPad或iPhone制作它,然后用手指四处滑动,看看问题是否也存在。。。在这种情况下,它是“touchesMoved”中的内容。第三,您是否尝试过通过GCMicroGamepad将遥控器设置为gamepad,使其像gamepad一样工作?第四,你能播放一段视频吗?这看起来很有效!我以前曾尝试过SCNTransaction(因为SCNShadable的文档中提到过它),但没有设置AnimationDuration。那时候没用。但是,动画持续时间设置产生了所有不同。我认为这有点混乱(因为我们没有要求系统运行任何类型的动画),但如果它工作,它就工作。