这可能是目前存在的最疯狂的技术问题,我不太希望得到解决办法,但我还是会尝试的。也许有人会有一个建议,我可以尝试,但也许不解释背后的原因,问题,可能会解决它无论如何。
我有一个SpriteKit游戏,我正在为tvOS开发(Xcode 8.0,MacOS10.12),还有一个SK3DNode,它有一个三角形网格,它使用顶点着色器移动顶点。
顶点着色器有几个mat4制服(尽管这并没有多大区别;即使我使用eg,问题也会发生。)vec4制服),用于将数据从代码传递到着色器,并从当前SKScene的更新方法中传递。我使用的是这个三角形网格的SCNMaterial setValue:forKeyPath:。
这很好,而且很顺利,除非有一件事情发生:当我使用AppleTV遥控器的触屏时,更新这些制服的延迟非常严重(就像更新之间可能会有长达半秒的延迟)。
请注意,我没有说游戏滞后。或者甚至渲染三角形网格、顶点着色器或SKScene更新方法都会滞后。这是字面上和明确地更新新的价值观到那些特殊的制服滞后,没有其他。而且只有当我使用AppleTV遥控器的触摸屏时,才能显式地使用。
是的,这个问题是绝对疯狂的。要理解为什么这是绝对疯狂的,请注意:
我怀疑SCNMaterial并没有用它从setValue:forKeyPath: method中获得的值更新制服,因为远程的触控板发生了一些变化。我不知道是什么或为什么,这是一个完全疯狂的问题。
当然,这里的问题是,由于游戏是由遥控器控制的,所以它基本上无法使用。顶点着色器不能正常工作。用触控板改变方向,网格失真开始像mad一样滞后。它无法使用。我不知道为什么会发生这种事,也不知道如何解决。
发布于 2016-09-29 13:58:06
我怀疑当您的问题发生时,SpriteKit呈现线程的运行循环正在“缓慢”运行。要确保将SceneKit更改“尽快”提交到呈现树,可以将更改包装在显式事务中:
[SCNTransaction begin];
[SCNTransaction setAnimationDuration:0];
// your changes
[SCNTransaction commit];
请注意,在编写“SceneKit”应用程序并直接处理SceneKit的回调时,这样做是不必要的。因为SceneKit将确保在SceneKit回调结束时提交您的更改。但是在这里,您将修改SpriteKit的游戏循环中的SceneKit模型。
不过,这是值得一试的。
https://stackoverflow.com/questions/39743955
复制相似问题