Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Советы по работе с C# и устранение неполадок

При использовании системы заданий Unity C# убедитесь, что вы придерживаетесь следующего:

Не получать доступ к статическим данным из задания

Доступ к статическим данным из задания позволяет обойти все системы безопасности. Если вы обращаетесь к неправильным данным, вы можете привести к сбою Unity, часто неожиданным образом. Например, доступ к MonoBehaviour может привести к сбоям при перезагрузке домена.

Примечание. Из-за этого риска в будущих версиях Unity будет запрещен доступ к глобальным переменным из заданий, использующих статический анализ. Если вы получаете доступ к статическим данным внутри задания, вы должны ожидать, что ваш код сломается в будущих версиях Unity.

Очистить запланированные пакеты

Если вы хотите, чтобы ваши задания начали выполняться, вы можете сбросить запланированный пакет с помощью JobHandle.ScheduleBatchedJobs. Обратите внимание, что вызов этого метода может негативно сказаться на производительности. Если пакет не сбрасывается, планирование задерживается до тех пор, пока основной поток не дождется результата. Во всех остальных случаях используйте JobHandle.Complete для запуска процесса выполнения.

Примечание. В Entity Component System (ECS), пакет неявно очищается для вас, поэтому вызов JobHandle.ScheduleBatchedJobs не требуется.

Не пытайтесь обновить содержимое NativeContainer

Из-за отсутствия ref возвращает, невозможно напрямую изменить содержимое NativeContainer. Например, nativeArray[0]++; равносильно написанию var temp = nativeArray[0]; temp++;, который не обновляет значение в nativeArray.

Вместо этого вы должны скопировать данные из индекса во временную локальную копию, изменить эту копию и сохранить ее обратно, например:

MyStruct temp = myNativeArray[i]; temp.memberVariable = 0; myNativeArray[i] = temp;

Вызовите JobHandle.Complete, чтобы восстановить права собственности

Для отслеживания владения данными требуются зависимости
См. в Словарь
, чтобы выполнить их, прежде чем основной поток сможет их снова использовать. Недостаточно проверить JobHandle.IsCompleted. Вы должны вызвать метод JobHandle.Complete, чтобы восстановить владение типами NativeContainer в основном потоке. Вызов Complete также очищает состояние в системе безопасности. Если этого не сделать, произойдет утечка памяти. Этот процесс также применяется, если вы планируете новые задания для каждого кадра, который зависит от задания предыдущего кадра.

Использовать Schedule и Complete в основном потоке

Вы можете вызывать Schedule и Complete только из основного потока. Если одно задание зависит от другого, используйте JobHandle для управления зависимостями, а не планируйте задания внутри заданий.

Используйте расписание и выполняйте в нужное время

Вызовите Schedule для задания, как только у вас появятся необходимые данные, и не вызывайте для него Complete пока вам не нужны результаты. Хорошей практикой является планирование задания, которого вам не нужно ждать, когда оно не конкурирует с другими запущенными заданиями. Например, если у вас есть период между концом одного кадра и началом следующего кадра, когда никакие задания не выполняются, и допустима задержка в один кадр, вы можете запланировать задание ближе к концу кадра и использовать его результаты. в следующем кадре. В качестве альтернативы, если ваша игра насыщает этот период переключения другими заданиями, а где-то еще в кадре есть большой период недоиспользования, более эффективно вместо этого запланировать свое задание там.

Отметить типы NativeContainer как доступные только для чтения

Помните, что задания имеют доступ на чтение и запись к типам NativeContainer по умолчанию. При необходимости используйте атрибут [ReadOnly] для повышения производительности.

Проверка зависимостей данных

В Unity Profilerокно, которое поможет вам оптимизировать игру. Он показывает, сколько времени вы тратите на различные области вашей игры. Например, он может сообщать о проценте времени, затраченном на рендеринг, анимацию или игровую логику. Дополнительная информация
В окне Словарь
маркер «WaitForJobGroup» в основном потоке указывает, что Unity ожидает завершения задания в рабочем потоке. Этот маркер может означать, что вы где-то ввели зависимость от данных, которую вы должны разрешить. Найдите JobHandle.Complete, чтобы отследить, где у вас есть зависимости данных, которые заставляют основной поток ждать.

Отладка заданий

Задания имеют функцию Выполнить, которую можно использовать вместо Расписание для немедленного выполнения задания в основном потоке. Вы можете использовать это для целей отладки.

Не выделять управляемую память в заданиях

Выделение управляемой памяти в заданиях невероятно медленное, и задание не может использовать Unity Burst-компилятор для повышения производительности. Burst — это новая LLVM технология внутреннего компилятора, упрощающая работу. Он принимает задания C# и создает высокооптимизированный машинный код, используя преимущества конкретных возможностей вашей платформы.

Дополнительная информация

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3