由于validateIndexBuffer

时间:2018-06-07 11:47:40

标签: ios swift xcode sprite-kit skspritenode

我是SpriteKit世界的初学者,现在我通过SKWarpGeometryGrid做动画。当我有大量的 sourcePositions / destinationPositions它填满了我的缓冲区,我有下一次崩溃:validateIndexBuffer:131:断言失败`indexBufferOffset(0)+(indexCount(4704)* 2)必须是< = indexBuffer length。'

Sprite Kit app crashes when run on real device and plugged into computer

这个答案很有帮助,现在没有崩溃,但动画停止工作,图像不时从屏幕上消失。

调试器说了什么:

  

2018-06-07 14:27:27.102269 + 0300 LiveGram [15259:5348410]执行   由于执行期间的错误,命令缓冲区已中止。   丢弃(GPU错误/恢复的受害者)(IOAF代码5)2018-06-07   14:27:27.102352 + 0300 LiveGram [15259:5348410]执行命令   缓冲区由于执行期间的错误而中止。导致GPU挂起   错误(IOAF代码3)2018-06-07 14:27:27.102389 + 0300   LiveGram [15259:5348410]中止了命令缓冲区的执行   由于执行期间的错误。丢弃(GPU的受害者   错误/恢复)(IOAF代码5)2018-06-07 14:27:27.156201 + 0300   LiveGram [15259:5348410]中止了命令缓冲区的执行   由于执行期间的错误。丢弃(GPU的受害者   错误/恢复)(IOAF代码5)2018-06-07 14:27:27.156278 + 0300   LiveGram [15259:5348410]中止了命令缓冲区的执行   由于执行期间的错误。导致GPU挂起错误(IOAF代码3)   2018-06-07 14:27:27.156311 + 0300 LiveGram [15259:5348410]执行   由于执行期间的错误,命令缓冲区已中止。   丢弃(GPU错误/恢复的受害者)(IOAF代码5)2018-06-07   14:27:27.158508 + 0300 LiveGram [15259:5348408]执行命令   缓冲区由于执行期间的错误而中止。忽略(为   导致先前/过多的GPU错误)(IOAF代码4)2018-06-07   14:27:27.158586 + 0300 LiveGram [15259:5348408]执行命令   缓冲区由于执行期间的错误而中止。忽略(为   导致先前/过多的GPU错误)(IOAF代码4)2018-06-07   14:27:27.158613 + 0300 LiveGram [15259:5348408]执行命令   缓冲区由于执行期间的错误而中止。忽略(为   导致先前/过多的GPU错误)(IOAF代码4)

有人知道我做错了什么以及我该如何解决?

2 个答案:

答案 0 :(得分:0)

我遇到了这类问题而刚刚解决了这个问题。当您为硬件提供太多工作并且GPU无法如此快速地处理它时,就会发生这种情况。

你可以做些什么来避免崩溃是这样的: 在Xcode中: 1.Command +选项+ R 2.Options选项卡 3.将Metal API验证设置为已禁用

它应该可以防止应用程序崩溃,但问题仍然存在。

您接下来要做的是搜索代码以了解问题的确切位置。我'这样做了:

评论部分代码并运行应用以查看错误是否仍然存在,如下所示:

/* //Put this at the beginning

CODE
.
.
.
CODE
*/    //This at the end 

如果错误仍然存​​在,请取消注释此部分代码并对下一部分进行注释,直到您不再遇到问题为止。然后,您将继续评论您的代码,但在问题部分的小部分中,直到找到导致它的确切原因。

时会发生这种情况
addChild(This one needs hard GPU processing)

在我的情况下,我添加了一个LightNode。我的解决方案是创建一个SKAction:

let action =  SKAction.wait(forDuration: 1) //Try different time durations
scene.run(action, completion:
{
code that is causing the problem

})

通过这种方式,您可以分割所需的处理能力并中断硬件。

希望它有所帮助!

答案 1 :(得分:0)

SKAction.wait工作得很好,但就我而言,DispatchQueue.global().asyncAfter(deadline: .now() + 0.1)更加灵活并且工作得更好。

但是无论如何,这不是处理此错误的好选择,因为对于真正庞大的动画应用程序仍然会崩溃。