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 ++.
источник: blogs.unity3d.com