Анимация SpriteKit падает из-за validateIndexBuffer - PullRequest
0 голосов
/ 07 июня 2018

Я новичок в мире SpriteKit, и сейчас я делаю анимацию через SKWarpGeometryGrid.Когда у меня есть большое количество sourcePositions / destinationPositions, оно заполняет мой буфер, и у меня возникает следующий сбой: validateIndexBuffer: 131: сбойное утверждение `indexBufferOffset (0) + (indexCount (4704) * 2) должно быть <= indexBuffer length. '</p>

Приложение Sprite Kit аварийно завершает работу при запуске на реальном устройстве и подключении к компьютеру

Этот ответ был полезен, и сейчас не происходит сбой, но анимация перестала работать, и изображение исчезловремя от времени.

Что говорит отладчик:

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] Выполнение буфера команд было прервано из-за ошибки во время выполнения.Вызвана ошибка зависания графического процессора (код IOAF 3) 2018-06-07 14: 27: 27.102389 + 0300 LiveGram [15259: 5348410] Выполнение буфера команд было прервано из-за ошибки во время выполнения.Отклонено (жертва ошибки / восстановления графического процессора) (код 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] Выполнение буфера команд было прервано из-за ошибки во время выполнения.Вызвана ошибка зависания графического процессора (код IOAF 3) 2018-06-07 14: 27: 27.156311 + 0300 LiveGram [15259: 5348410] Выполнение буфера команд было прервано из-за ошибки во время выполнения.Отклонено (жертва ошибки / восстановления графического процессора) (код IOAF 5) 2018-06-07 14: 27: 27.158508 + 0300 LiveGram [15259: 5348408] Выполнение буфера команд было прервано из-за ошибки во время выполнения.Игнорируется (из-за возникновения предыдущих / чрезмерных ошибок графического процессора) (код IOAF 4) 2018-06-07 14: 27: 27.158586 + 0300 LiveGram [15259: 5348408] Выполнение буфера команд было прервано из-за ошибки во время выполнения.Игнорируется (из-за предыдущих или чрезмерных ошибок графического процессора) (код IOAF 4) 2018-06-07 14: 27: 27.158613 + 0300 LiveGram [15259: 5348408] Выполнение буфера команд было прервано из-за ошибки во время выполнения.Проигнорировано (для того, чтобы вызвать предыдущие / чрезмерные ошибки GPU) (код IOAF 4)

Кто-нибудь знает, что я делаю неправильно и как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

SKAction.wait работает хорошо, но в моем случае DispatchQueue.global().asyncAfter(deadline: .now() + 0.1) более гибок и работает лучше.

Но в любом случае это не хороший выбор для обработки этой ошибки, потому что для действительно огромного анимационного приложения все равно происходит сбой.

0 голосов
/ 13 июня 2018

У меня был такой тип проблемы, и я просто решил ее.Это происходит, когда вы слишком много работаете с оборудованием, а графический процессор не может обработать его так быстро.

Чтобы избежать сбоев, вы можете сделать следующее: В Xcode: 1.Command + Option + R 2. Вкладка «Опции»3. Установите для проверки правильности API Metal значение

Это должно предотвратить сбой приложения, но проблема все еще существует.

Далее вы можете выполнить поиск по коду, чтобы точно определить, в чем именно проблема.Я сделал так:

Прокомментируйте части вашего кода и запустите приложение, чтобы увидеть, есть ли ошибка, например:

/* //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

})

Таким образом, вы разделяете необходимую вычислительную мощность и даете перерыв аппаратному обеспечению.

Надеюсь, это поможет!

...