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

时间:2016-09-28 09:52:39

标签: shader scenekit tvos uniform

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

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

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

除非发生一件事情,否则这种方法运作良好且流畅:当我使用AppleTV遥控器的触控板时,更新这些制服的效果非常差(比如更新之间可能会有半秒钟的延迟)。

请注意,我没有说游戏滞后。或者甚至渲染三角形网格,顶点着色器或SKScene更新方法都滞后。从字面上和明确地说,将新价值更新为那些落后的特殊制服,没有别的。只有当我使用AppleTV遥控器的触控板时才明确。

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

  • 我已经更加确定什么是滞后只是更新我的制服的价值,而没有别的。例如,如果除了使用它们之外,我还使用系统提供的u_time制服向顶点着色器中的顶点添加一些移动,这样可以正常工作。 (换句话说,u_time制服正好更新,每秒60次,但是我的mat4制服没有,导致从u_time计算的运动完全平滑,而我身上的制服的额外运动真的是滞后的。)同样,屏幕上没有别的东西是滞后的。

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

  • 它不仅仅是这里和那里的几个跳帧。如前所述,我们谈论的是延迟时间长达半秒甚至更多,最糟糕的是;并经常反复这样做。 (当更新的值最终到达着色器本身时,更新的值会超过等量。)

  • 是的,只有在我使用AppleTV遥控器的触控板时才会发生这种情况。 (我不确定它是否会在使用按钮时发生。它可能是,但它在物理上不可能足够快地按下它们以产生效果。在触控板上滑动会导致连续的输入流系统及其发生时的情况。)如果我不使用触控板,则制服每秒更新60次,顶点移动平稳。

  • 游戏手柄不会出现此问题。尽管游戏手柄的模拟摇杆会产生类似的输入流,但它似乎并没有产生同样的效果。

我怀疑,不知何故,SCNMaterial没有使用它的setValue:forKeyPath:方法获取的值来更新制服,当遥控器的触控板出现问题时。我不知道为什么或为什么会这么做,这是一个完全疯狂的问题。

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

1 个答案:

答案 0 :(得分:0)

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

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

// your changes

[SCNTransaction commit];

请注意,当您编写“SceneKit”应用并直接处理SceneKit的回调时,不必执行此操作。因为SceneKit将确保在SceneKit回调结束时提交您的更改。但是你在这里从SpriteKit的游戏循环中修改SceneKit的模型。

虽然值得提交一个错误。