Unity е изключително популярен двигател за игри, особено заради изчерпателните и лесни за използване инструменти за редактиране.
Двигателят обаче трябва да следва еволюцията на машините: в продължение на десет години процесорите не се увеличават по честота, а по брой ядра. С други думи, За да използват новата налична производителност, игрите трябва да изпълняват своя код на различни ядра, през различни нишки.
Въпреки това, от момента, в който технологията е налична, малко игри са наистина успешни. Всъщност проблемите при писането на такъв код са многобройни.
За да се избегнат тези недостатъци, е възможно да се спазват някои правила. Това е една от причините Unity да работи върху нов компилатор в C #, наречен Burst с което, ако тези правила не се спазват, ще възникне грешка при компилацията.
За да постигнете това, кодът трябва да бъде написан като сбор от задачи, които трябва да бъдат изпълнени. Всяка от тези задачи извършва някои трансформации на данните.
Програмистът трябва да посочи областите памет, до които има достъп само за четене, и тези, в които иска да чете и записва данни- Компилаторът ще се погрижи да не използвате нищо извън тези декларации.
След това планировчикът определя най-добрия начин за изпълнение на тези задачи в реално време с тази допълнителна информация: можете да сте сигурни, че никоя задача няма да записва данни, където някой друг се опитва да чете или пише например.
Burst има за цел не само да улесни паралелното програмиране: той се използва и в най-критичните части (от гледна точка на изпълнението) на кода на Unity.
Досега те бяха написани на C ++, но настоящите компилатори не са напълно задоволителни.
Всъщност, ако разработчикът иска да се векторизира цикъл, те нямат гаранция, че компилаторът ще го направи, поради добавяне между два вектора, например, компилаторът трябва официално да докаже, че във всички възможни и възможни случаи двата вектора не съответстват на едни и същи адреси в паметта).
Защо Burst, а не съществуващ компилатор?
Изпълнението е критична точка, ако цикълът не е векторизиран, това е реален проблем, който трябва да бъде решен бързо.
Освен това, генерираният двоичен файл трябва да бъде безопасен, предвид грешките в препълването на буфера и опасните препратки трябва да бъдат открити възможно най-скоро, с действителни съобщения за грешки, а не с недефинирано поведение (което причинява много проблеми със сигурността).
Изправени пред тези повишени нужди, все още трябва да изберете езика за въвеждане на този компилатор- Вариант или подмножество на C, C ++, C # или нов език?
Новият език не е добър вариант, тъй като отначало избягвате да обучавате хора с този нов инструмент.
C # има предпочитание от гледна точка на потребителите, Тъй като той вече се използва от игралния механизъм, той ще бъде кодиран на същия език като игрите.
Освен това, C # вече има много голяма екосистема, напротив, C ++ все още страда от своето C наследство, с не винаги очевидни включвания, които трябва да бъдат определени и огромно време за компилиране, недостатъци, които C ++ 20 частично поправя, въпреки манията си за производителност.
Решението беше взето да продължи с C #, но чрез премахване на редица елементи, затрудняващи изпълнението, като стандартната библиотека, предимно събиране на боклук и разрешения.
Burst всъщност не работи като пълен компилатор, тъй като не взема голямо количество код като вход, а само входната точка към решаващ цикъл.
Той просто го компилира като функция, както и всичко, което извиква. Нивото на оптимизация е изключително високо: тъй като Burst се фокусира върху определени части от кода, може да отнеме време.
Първата итерация на Burst с HPC # и системата за задачи дойде с Unity 2018.1.
Генерираният код понякога е по-бърз от предишната версия на C ++, понякога по-бавен, но разработчиците се доверяват, че винаги ще постигнат поне същото ниво на производителност като C ++.
Fuente: blogs.unity3d.com