我是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)
有人知道我做错了什么以及我该如何解决?
答案 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)
更加灵活并且工作得更好。
但是无论如何,这不是处理此错误的好选择,因为对于真正庞大的动画应用程序仍然会崩溃。