Что делать если завис шейдер?
Если зависла прога, то все понятно — ЦП на 100%, но мы можем грохнуть процесс из диспетчера задач.
А что делать если завис шейдер? Например, получился бесконечный цикл?
У меня в love2d весь комп тут же зависает наглухо, я даже до диспетчера задач добраться не могу. Потом каждые 4 секунды перезапускается драйвер видеокарты (монитор отключается и включается снова), картинка при этом не обновляется. Помогает только hard reset.
В Unity3D, насколько я знаю, движок сам грохает шейдер если он выполняется дольше 1 секунды (самому удалось там соорудить бесконечный цикл).
Вариант не делать бесконечных циклов (например делать счетчик кол-ва итераций, если больше 300 — выходим) — не предлагать. Меня интересует как выбраться из такой ситуации, а не создавать ее.
И еще интересно — бывали ли у вас подобные случаи и в каких движках что происходило. Как вам удавалось выбраться?
- 04 декабря 2018, 23:05
- 00
очень просто... не умею в шейдеры пока)
Предполагаю, что так же, как и при работе с другим железом при длительных задержках - отдельным потоком. (из одного вызывается шейдер, а другой убивает первый, если тот долго рисуется)
Правда, OpenGL, насколько мне известно, многопоточность не поддерживает, возможно, будет проще из второго потока завершить весь процесс...
Кстати, ещё лайфхак: если движок поддерживает билд в WebGL, то можно редактировать шейдер на лету из встроенного в браузер отладчика шейдеров. А потом понравившийся шейдер скопипастить в исходный код программы.
Не знал что такое бывает даже. о_О
Не использовал шейдеры в ловке, но на сколько я знаю там можно вести отладку шейдеров. И использовать библиотеки для отладки проекта - LoveDebug или что-то вроде этого...
И кстааати... https://thebookofshaders.com/ Там как раз хорошо расписаны моменты про "слепоту" и "память" потоков.