Множество мандельброта связное, это значит, что если граница какой-то фигуры принадлежит множеству мандельброта, то вся фигура принадлежит множеству мандельброта. Можно разделить экран на квадраты, посчитать границы каждого квадрата, если граница какого-то квадрата полностью содержится в множестве, то закрашиваем его полностью и не рассматриваем в следующих итерациях, далее делим оставшиеся квадраты на более мелкие. Повторяем, пока квадраты не станут 1х1. Очень хорошо увеличивает производительность.
Супер, спасибо) давно хотел ускорить на питоне расчет и по путешествовать в фрактальном мире, но знаний не хватало. СПАСИБО за новую мотивацию) Расскажи еще о себе, чем занимаешься и твой путь в программирование, думаю всем будет интересно)
Сам давно хотел сделать фрактал Мандельброта или множество Жюлиа на питоне с масштабируемостью и постоянным рендерингом, а тут вышел видос. Красивый код получился) Вот пара идей для проектов, было бы интересно увидеть их в твоем исполнении: - Система массового обслуживания с визуализацией - Моделирование перколяции в 2д и 3д. Выглядит очень красиво.
Раскраску мандельброта можно автоматически адаптировать, думаю даже объяснять не стоит, но например 1) красить в HSV, где H зациклен, а SV подбираются под требования. Кода минимум, но вырвиглазно 2) каждый цикл по градиенту спускаться по y ниже, а саму картинку по краям зациклить. Получится уникальная раскраска на долгие итерации вперёд 3) использовать динамическую нормализацию уровней, просто выбирая случайные пиксели на экране и смотреть на минимум и максимум, а потом сглаживать эти параметры
очень удивился, услышав голос. До этого смотрел видео под гугловскую озвучку, а оказалось, что у автора очень приятный голос, хороший тембр и отличная, грамотная речь
Только пожалуйста, не уходи на год, как в прошлый раз) и создай телеграмм канал где на голосование выставляй темы новых роликов или направлений для идей)
всё равно разница мала... наверное. По крайней мере я делал на С++ в связке сначала с SFML, а потом и голой OpenGL изменение титула (названия) окна. Было около 1-5 тысяч fps. Разницу не почувствовал. А ещё можно обновлять лишь только раз в несколько кадров, например раз в 10, тогда ещё больше разница уменьшиться.
Отличное видео. Небыло желания проводить вычисления на pytorch? Синтаксис у него практически такой-же как в numpy, но есть возможность отправлять массивы на вычисления в видеокарту.
Все запустилось и работает отлично! Но есть проблема, я копался в коде и менял числа, но что бы я не делал возникает такая проблема: с какого-то момента оно просто перестает рендерить само множество мандельброда и оно превращается в черные пиксели (на приближении) скорость рендера тоже изменял на большие числа и долго жал, но не помогает. В чем проблема?
Ваше утверждение по поводу модуля неправильное. Квадратный корень из -1 даёт модуль |i|, раскрывая который получаем два комплексных числа i и -i, то есть sqrt(-1) = | i | = i и -i, проверяем: (-i)**2 = -1 и i**2 = -1
только вот всё меньше это похоже на питон... все его преимущества в виде простаты разработки теряются, появляется типизация и прочие по мнению некоторых неприятные штуки. С тем же успехом можно на ассемблере написать настолько высокую абстракцию, что он станет питоном...
можно ли напиать программу увеличивающую скорость других программ путем внедрения или модификации если есть то буду тестить на "пенсиуме-кор-дуо" ради интереса максимума спасибо за видео!
очень медленный и не подходящий под такого рода задачи. А то что в видео не полная замена компилируемых ЯП, даже не близко. И дело даже не в скорости. Или ты хочешь сказать, что перегрузка операторов в С++, это фигня, лучше использовать недоязык модицикации питона для компиляции намбой
Сделай видео где ты будешь отвечать на вопросы, но через программу которую ты сделаешь сам, сначала когда ты ее запускаешь на экран выводится рандомный комментарий и ты говоришь ответ и так далее... Только он ещё будет проверять это вопрос или нет, допустим по знаку "?" или как нибудь по другому
@@StandaloneCoder А за какой промежуток времени реально так же научиться кодить ? Понимаю что тут сугубо индивидуально, и сколько времени сам уделяешь. Но вот вы как сильно зубрили, и как долго учили? Просто интересно
Numba только математические штуки ускоряет или условно там парсинг или генерация чего либо(какого-нибудь бесшовного мира в майнкрафте) тоже быстрее будет?)
Так устроен интерпретатор Python. Для него все типы переменных выясняются во время выполнения программы, а в компилируемых языках - типы переменных устанавливаются на этапе компиляции. Например, в Python одна и та же переменная во время исполнения программы может быть сначала списком, потом словарем, потом строкой и т.д.
Он и есть нормальный язык, просто его предназначение было иным, а библиотеками расширили спектр направлений. Есть библиотека для конвертации в С - там ваще всё летать будет, но это уже не то, что показано в ролике. Наверное ножом для резки хлеба неудобно разделывать гуся, не так ли?
@@Никитас-ч6и а чем они не нормальные? Просто на сегодня они не развиваются и имеют устаревшие возможности. Дело же не в языке, а в его реализации. На сегодня есть много языков, но они реализуются по разному из-за разных предназначений, соответственно имеют разные расширения в виде библиотеки или подобной технологии.
Сразу говорю я начинающий. Попытался запустить, выдало кучу ошибок. Я подправил код и остались вот эти ошибки, почему не хочет запускаться?: Exception has occurred: URLError During handling of the above exception, another exception occurred: File "C:\Users\incar\Downloads\Mandelbrot-set-Realtime-Viewer--main\main.py", line 20, in __init__ ti.init(arch=ti.cpu) File "C:\Users\incar\Downloads\Mandelbrot-set-Realtime-Viewer--main\main.py", line 100, in __init__ self.fractal = Fractal(self) File "C:\Users\incar\Downloads\Mandelbrot-set-Realtime-Viewer--main\main.py", line 114, in app = App()
i7 11700k, RTX 3060Ti OpenGL - 23 fps Vulcan - 55 fps CPU - 180 fps Cuda - 210 fps Cuda 1600x900 - 60 fps Похожие результаты были на 1060 и 3070 тут, в комментариях. Как я понял - это не проблема сложности вычислений, а проблема скорости работы с памятью. Скорость падает на 86 строке, где screen_array присваивается screen_field.to_numpy(). Если закомментировать перевод массива в нампай: Cuda на 800 - 500 fps Cuda 1600 - 160 fps Если просто пустой апдейт поставить: Cuda 800 - 700 fps Cuda 1600 - 160 fps Судя по всему, для большого разрешения уже упор происходит в blit.
@@StandaloneCoder Емнип, в PyGame есть GLSL и можно просто один раз закинуть в буфер шейдер и текстуру и получать Over9000 fps на обновлении. Или использовать PyOpenGL - мне кажется, там по-быстрее даже будет. Правда, тогда бы не получилось показать ускорений от Numpy и Numba, простоту Taichi и в целом тема сместилась бы с "как ускорить python" на "как выбирать язык под задачи, чтобы получать лучшую скорость".
Не понимаю разницу между 1) выучить компилируемый язык 2) разогнать питон до компилируемого языка Это звучит так, как будто - 3D принтер освоить тяжело, но он быстрый и печатает сложные формы - 3D ручку освоить просто, но работать ей медленно и ничего сложного не слепишь Твоё решение: взять 3-х осевой манипулятор, прикрепить туда 3D ручку с надеждой, что будет также легко, но ты получишь 3D принтер. Это так не работает... хочешь 3D принтер, бери 3D принтер, хочешь скорость/удобство отладки/библиотеки компилируемых ЯП, бери подходящий ЯП.
может просто писать на компилтруем языке, а не ускорять? все равно же как не прыгай раз в 10 будет медленние... А автор интересно в школе учился? Определённо нет Таких ляпов школьние не наделает
Тебя не остановить, столько роликов за короткий срок, круто) так держать)
Множество мандельброта связное, это значит, что если граница какой-то фигуры принадлежит множеству мандельброта, то вся фигура принадлежит множеству мандельброта. Можно разделить экран на квадраты, посчитать границы каждого квадрата, если граница какого-то квадрата полностью содержится в множестве, то закрашиваем его полностью и не рассматриваем в следующих итерациях, далее делим оставшиеся квадраты на более мелкие. Повторяем, пока квадраты не станут 1х1. Очень хорошо увеличивает производительность.
Супер, спасибо) давно хотел ускорить на питоне расчет и по путешествовать в фрактальном мире, но знаний не хватало. СПАСИБО за новую мотивацию) Расскажи еще о себе, чем занимаешься и твой путь в программирование, думаю всем будет интересно)
Всегда поражаюсь, когда на канале с, условно говоря, небольшим количеством подписчиков вижу такой офигенский контент. Спасибо огромное!))
Сам давно хотел сделать фрактал Мандельброта или множество Жюлиа на питоне с масштабируемостью и постоянным рендерингом, а тут вышел видос. Красивый код получился)
Вот пара идей для проектов, было бы интересно увидеть их в твоем исполнении:
- Система массового обслуживания с визуализацией
- Моделирование перколяции в 2д и 3д. Выглядит очень красиво.
Раскраску мандельброта можно автоматически адаптировать, думаю даже объяснять не стоит, но например
1) красить в HSV, где H зациклен, а SV подбираются под требования. Кода минимум, но вырвиглазно
2) каждый цикл по градиенту спускаться по y ниже, а саму картинку по краям зациклить. Получится уникальная раскраска на долгие итерации вперёд
3) использовать динамическую нормализацию уровней, просто выбирая случайные пиксели на экране и смотреть на минимум и максимум, а потом сглаживать эти параметры
Прекрасно, как всегда, правда, опять же, как всегда, сложно для понимания не на поверхностном уровне
Так надо быть программистом, чтобы понять.
@@ohnocoder так я не о коде, я о математической части
@@magicmc231 Понятно)))
@@magicmc231 и в чем сложность тут?) Или вы из тех погромистов, которые только скриптики горазды писать?
@@8nhuman8 в осознании того, как строится фрактал Мандельброта
Я вот вроде инженер и программирую немного, но это тот случай когда очень интересно но так и не понятно как рисуется фрактал Мандельброта.
Посмотри канал Оригинири, там есть понятное объяснение
@@baukaalimgazy2989 может онигири?
А зачем тебе этот сраный фрактал
Комплексные числа.
@@MAXFOLLch а зачем тебе этот сраный пайтон?
Класс, теперь благодаря тебе буду знать как ускорить код👍
Очень интересная тема! Решил проверить производительность на своём ПК (cpu - ryzen 5 2600 4 Ghz, gpu - gtx 1050 ti):
1) max_iter = 30: cpu ~ 160 fps, cuda ~ 220 fps, vulkan ~ 230 fps, opengl ~ 25 fps, metal ~ 160 fps
2) max_iter = 3000: cpu ~ 8.5 fps, cuda ~ 110 fps, vulkan ~ 140 fps, opengl ~ 23 fps, metal ~ 8.5 fps
res = 800, 450 в обоих случаях
Если не трудно, сделайте тест для res = 1600, 900
@@StandaloneCoder для res = 1600, 900:
1) max_iter = 30: cpu ~ 38, cuda ~ 59, vulkan ~ 57
2) max_iter = 3000: cpu ~ 2.1, cuda ~ 30, vulkan ~ 37
благодарю!
очень удивился, услышав голос. До этого смотрел видео под гугловскую озвучку, а оказалось, что у автора очень приятный голос, хороший тембр и отличная, грамотная речь
cpu: i5 4570; gpu: gtx1060 6gb
arch=cuda dtype=np.uint32 fps=158
archo=cuda dtype=np.uint8 fps=230
P.S. Спасибо за крутой ролик )
Хотелось бы увидеть курс по OpenCV на этом канале! :)
Только пожалуйста, не уходи на год, как в прошлый раз) и создай телеграмм канал где на голосование выставляй темы новых роликов или направлений для идей)
11:10 обойти проблему точности (не знаю есть ли альтернатива в numba) можно с помощью библиотеки decimal
Супер!
Только детально бы разжевать самый простой пример для новичков.
И дать дальнейшие пояснения для особо тупых, спасибо!
Я из тех для кого это просто набор букв..и ничего не понял но очень интересно..)
Как говорят ничего не понятно но очень интересно)
Как человек, который самостоятельно изучает python уже 19 дней, могу с уверенностью утверждать - это все очень интересно, но, пока, не понятно :-)
Я заметил, что изменения названия окна более затратное, чем отрисовка фпс с помощью font.render
всё равно разница мала... наверное.
По крайней мере я делал на С++ в связке сначала с SFML, а потом и голой OpenGL изменение титула (названия) окна. Было около 1-5 тысяч fps. Разницу не почувствовал.
А ещё можно обновлять лишь только раз в несколько кадров, например раз в 10, тогда ещё больше разница уменьшиться.
@@ATtiny13a-PU думаю медленная скорость установки заголовка окна в 90% зависит от библиотеки
@@lordorbit, а он обновляет каждый кадр? Мне кажется нет
@@ATtiny13a-PU 1:40
@@lordorbit, ну ладно, но думаю это решаемо, как я и сказал.
Очень круто! Про taichi не знал, теперь буду знать)
Отличное видео. Небыло желания проводить вычисления на pytorch? Синтаксис у него практически такой-же как в numpy, но есть возможность отправлять массивы на вычисления в видеокарту.
Я не понял зачем мне эта информация, но было круто!
жаль, перестал выпускать, но мне очень нравится математика в видео)
именно такие видео и мотивируют меня дальше изучать питон
Я пока понял только процентов 30 происходящего на экране. Но очень интересно
Посмотрю когда подучу змею и будет много времени
Не зря поставил лайк не глядя. )
Все запустилось и работает отлично! Но есть проблема, я копался в коде и менял числа, но что бы я не делал возникает такая проблема: с какого-то момента оно просто перестает рендерить само множество мандельброда и оно превращается в черные пиксели (на приближении) скорость рендера тоже изменял на большие числа и долго жал, но не помогает. В чем проблема?
2:05. Объяснение мнимой еденицы неправильное. i**2=-1,а то что там написано будет равно модулю - 1, то есть 1. |a|=(a**0.5)**2
Там всё верно
Ваше утверждение по поводу модуля неправильное. Квадратный корень из -1 даёт модуль |i|, раскрывая который получаем два комплексных числа i и -i, то есть
sqrt(-1) = | i | = i и -i, проверяем:
(-i)**2 = -1 и i**2 = -1
Шикарно! Спасибо!
Тот случай, когда я бы остановился на 0.25 FPS )))
круто! отличный codestyle
Скорость света
Класс
Честно говоря не думал, что на питоне такое возможно
только вот всё меньше это похоже на питон... все его преимущества в виде простаты разработки теряются, появляется типизация и прочие по мнению некоторых неприятные штуки. С тем же успехом можно на ассемблере написать настолько высокую абстракцию, что он станет питоном...
Музыка на фоне имба
Хорошее видео. Кстати, если не сложно, что за музыка на 6:22 и 8:03?
Очень красиво!!!
поясните, пожалуйста, как работает получение абсолютного комплексного числа через радиус я не очень догнал
Можно провести тест с GPU Google Colab, ну если дойдёт до этого можно сравнить с библиотекой JAX и ускорением на TPU
Большое спасибо за видеоролик!
Спасибо, было интересно!
почему-то удаляется комментарий. Я писал про библиотеку купай, Numpy вместе с Cuda. Стоит также её затестить. Или использовать pytorch тензоры на GPU
Ну скажи плиз какой голосовой двиг ты используешь для озвучки ?
Не, ну 0,25 кадров в секунду я считаю нормально! А то зажрались понимаешь в последнее время, 120 кадров им подавай во всех тайтлах.
можно ли напиать программу увеличивающую скорость других программ путем внедрения или модификации
если есть то буду тестить на "пенсиуме-кор-дуо" ради интереса максимума
спасибо за видео!
ловим лайк от СЕООНЛИ
Новое увлекательное видео! УРА!!! )))
Standalone посмотри nim-lang и nimpy, может понравится
а если использовать комбинацию python+numpy+numba+taichi что станет с FPS?
Я так понимаю нет смысла использовать таичи и намба всесте, они оба JIT
Давай, повтори ещё раз, что Питон медленный! :-D
пайтон медленный.
очень медленный и не подходящий под такого рода задачи. А то что в видео не полная замена компилируемых ЯП, даже не близко. И дело даже не в скорости.
Или ты хочешь сказать, что перегрузка операторов в С++, это фигня, лучше использовать недоязык модицикации питона для компиляции намбой
Что из этого надо добавить в другой код
Спасибо за видео!
Сделай видео где ты будешь отвечать на вопросы, но через программу которую ты сделаешь сам, сначала когда ты ее запускаешь на экран выводится рандомный комментарий и ты говоришь ответ и так далее... Только он ещё будет проверять это вопрос или нет, допустим по знаку "?" или как нибудь по другому
Однозначно подписываюсь)
Это прекрасно!
Что за музыка на 6:29
Но зачем рисовать каждый раз если можно нарисовать один раз , но когда изменишь положение или увеличение тогда ещё раз?
иначе никак
@@StandaloneCoder почему?
у тебя тогда будет рисоваться просто черный экран, который будет обновляться при перемещении.
а смысл? все равно ты не заметишь этого
Тогда будет просто зум, а не красивая картинка. Скачай фотку фрактала, и посмотри, что будт, если ты его увеличишь.
У меня у одного не получается скачать пайгейм и нампай, пишет invalid syntax?
Помогите плиз
Нужно это в консоли (cmd или powershell), а не в интерпретаторе питона вводить
А может СЕРВЕР для игры сделаете?
Интересно а можна все ето использовать вместе
Посоветуй пожалуйста Книги по питону, и по математике/алгебре/ высшей математике для чайников. Как ты учил все эти формулы?
Ответ прост - гуглил интересующую тему и самостоятельно изучал определенное направление, если не хватало знаний
@@StandaloneCoder А за какой промежуток времени реально так же научиться кодить ? Понимаю что тут сугубо индивидуально, и сколько времени сам уделяешь. Но вот вы как сильно зубрили, и как долго учили? Просто интересно
@@Amerando если тратить по несколько часов в день, то скорее всего за год уже выйдете на достойный уровень)
А есть смысл ускорять если потом скомпилировать pyInstaller-ом?
PyInstaller упаковывает, а не компилирует
Numba только математические штуки ускоряет или условно там парсинг или генерация чего либо(какого-нибудь бесшовного мира в майнкрафте) тоже быстрее будет?)
да, преимущественно работу с вычислениями - операции с массивами, там где куча итераций, вложенных циклов, тригонометрии, корней и т.п.
ООо ты замахнулся на многопоточность?)))))))))))))
0:19 А где в Python динамическая типизация?
Так устроен интерпретатор Python. Для него все типы переменных выясняются во время выполнения программы, а в компилируемых языках - типы переменных устанавливаются на этапе компиляции. Например, в Python одна и та же переменная во время исполнения программы может быть сначала списком, потом словарем, потом строкой и т.д.
@@StandaloneCoder разве это не явность/неявность?
@@vsweetbread Нет. Кстати в Python динамическую типизацию порой называют "утиной" типизацией
вау, очень круто!!
То есть, если запороться с библиотеками, то из питона получится почти нормальный язык. Ясно.
У питона есть динамическая типизация.
Он и есть нормальный язык, просто его предназначение было иным, а библиотеками расширили спектр направлений. Есть библиотека для конвертации в С - там ваще всё летать будет, но это уже не то, что показано в ролике. Наверное ножом для резки хлеба неудобно разделывать гуся, не так ли?
@@Divercant, ну тогда и Pascal с Алгязом нормальные, просто не так понятые.
@@Никитас-ч6и а чем они не нормальные? Просто на сегодня они не развиваются и имеют устаревшие возможности. Дело же не в языке, а в его реализации. На сегодня есть много языков, но они реализуются по разному из-за разных предназначений, соответственно имеют разные расширения в виде библиотеки или подобной технологии.
Сразу говорю я начинающий.
Попытался запустить, выдало кучу ошибок.
Я подправил код и остались вот эти ошибки, почему не хочет запускаться?:
Exception has occurred: URLError
During handling of the above exception, another exception occurred:
File "C:\Users\incar\Downloads\Mandelbrot-set-Realtime-Viewer--main\main.py", line 20, in __init__
ti.init(arch=ti.cpu)
File "C:\Users\incar\Downloads\Mandelbrot-set-Realtime-Viewer--main\main.py", line 100, in __init__
self.fractal = Fractal(self)
File "C:\Users\incar\Downloads\Mandelbrot-set-Realtime-Viewer--main\main.py", line 114, in
app = App()
В __init__ и тому подобных нужно 2 подчеркивания
не могу установить taichi (
Он вернулся!!!
Как сделать из питоновского файла exe-шник небольших размеров
почитай про pyistaller
Win 7 x64,
AMD FX(tm)-4350 Quad-Core processor 4.20 Ghz,
8 Gb RAM,
Nvidia GeForce GTX1660.
max_iter=30;
cuda: 84,
opengl: 22,
cpu: 54.
res=1600,900:
cpu: 10-11.
cuda: 20
opengl: 5
vulkan: 6.
стыдно должно быть таким компом пользоваться
@@AndrewOBannon почему 11-го когда есть 12-е?
Крутое видео!
Круто
maximum recursion depth exceeded in update self.render()
за taichi респект +
7:10 Пж, не делай такие громкие вставки
Живоооооооооооооооооооооооооооой
Очень годно
Здравствуйте, я не по тему😅
Вы делаете программирование за деньги есть одна объект
Блин, а можно такую же оптимизацию только на Майнкрафт?)
можешь скинуть гит
Ссылка на код в описании под видео
так к любому языку можно сделать быстрый вынос - не имеющий отношение к языку
Ответьте пожалуйста
Привет
HI
taichi - скорее всего "тай чи"
или "тай цзи"
Ай! Как же больно видеть математику sqrt(-1)=i.
Самые долгие вещи на планете: *показывает ЖИВЫХ существ*
i7 11700k, RTX 3060Ti
OpenGL - 23 fps
Vulcan - 55 fps
CPU - 180 fps
Cuda - 210 fps
Cuda 1600x900 - 60 fps
Похожие результаты были на 1060 и 3070 тут, в комментариях. Как я понял - это не проблема сложности вычислений, а проблема скорости работы с памятью. Скорость падает на 86 строке, где screen_array присваивается screen_field.to_numpy().
Если закомментировать перевод массива в нампай:
Cuda на 800 - 500 fps
Cuda 1600 - 160 fps
Если просто пустой апдейт поставить:
Cuda 800 - 700 fps
Cuda 1600 - 160 fps
Судя по всему, для большого разрешения уже упор происходит в blit.
да, проблема в пропускной способности при передаче из видеопамяти в системную озу
@@StandaloneCoder Емнип, в PyGame есть GLSL и можно просто один раз закинуть в буфер шейдер и текстуру и получать Over9000 fps на обновлении.
Или использовать PyOpenGL - мне кажется, там по-быстрее даже будет.
Правда, тогда бы не получилось показать ускорений от Numpy и Numba, простоту Taichi и в целом тема сместилась бы с "как ускорить python" на "как выбирать язык под задачи, чтобы получать лучшую скорость".
2560x1440, nvidia 3070, 20 fps)), но видюха загружается всего на 19%
а какая архитектура? ti.cuda или ti.vulkan?
@@StandaloneCoder cuda, она больше всего фпс выдала
@@ДмитрийЛысов-х1з если изменить тип данных на uint8 - должна еще больше выдать
Но это вообще не легко!!!! Аааааа
Лучше использовать pyglet.
Диз за резкие звуки..
Лучшее ускорение питона, это его перепись на с++
Не понимаю разницу между
1) выучить компилируемый язык
2) разогнать питон до компилируемого языка
Это звучит так, как будто
- 3D принтер освоить тяжело, но он быстрый и печатает сложные формы
- 3D ручку освоить просто, но работать ей медленно и ничего сложного не слепишь
Твоё решение: взять 3-х осевой манипулятор, прикрепить туда 3D ручку с надеждой, что будет также легко, но ты получишь 3D принтер.
Это так не работает... хочешь 3D принтер, бери 3D принтер, хочешь скорость/удобство отладки/библиотеки компилируемых ЯП, бери подходящий ЯП.
Критикуешь - предлагай.
@@artemTHISNAMEALREADYTAKEN Да.
@AlexSky-coder слишком расплывчато
Если между этими двумя вариантами действительно нет никакой разницы, почему бы не выбрать Python? :)
@@ИмяФамилия-о4т5р Лол, да, почему же?
а
может просто писать на компилтруем языке, а не ускорять? все равно же как не прыгай раз в 10 будет медленние...
А автор интересно в школе учился? Определённо нет
Таких ляпов школьние не наделает
синтезированный голос-фу
Ошибка:
taichi.lang.exception.InvalidOperationError: Please call init() first
Строка:
self.screen_field = ti.Vector.field(3, ti.uint8, (WID, HEI))