Multithreading-No-Unity-Jobs-RU.md

January 12, 2026 · View on GitHub

Вы можете посмотреть пример реализации в Samples > CustomThreadSample.cs или Samples > CustomThreads.unity

Внимание! Эта часть еще не покрыта модульными тестами, хотя имеет внутренние проверки безопасности.

Warning

Внимание! Параллельное использование JobSystem и своей истемы потоков (в контексте BurstTrace) сейчас недопустимо из-за коллизии индексов! Я исправлю это в следующей версии, но если вам критична эта функция, создайте запрос: я добавлю её приоритетно.

Используйте специальный класс BurstTraceCustomThreads в пространстве имён Elfinik.BurstTrace.Internal

Вместо

using Elfinik.BurstTrace
...
traceHandle = TraceHandle.Capture();

Вы должны вызвать:

using Elfinik.BurstTrace.Internal
...
traceHandle = BurstTraceCustomThreads.Capture(threadIndex);
//or
traceHandle = BurstTraceCustomThreads.Capture(threadIndex, traceHandle);

Ваша главная задача: передать threadIndex. Это индекс вашего потока. В главном потоке он равен нулю. Как его получить — зависит от вашего фреймворка. Если вы запустите параллельно несколько задач и попробуете вызвать функцию с одинаковым индексом потока, это приведет к гонке и непредвиденным последствиям.

Важно: Значение threadIndex должно быть уникальным для каждого одновременно выполняемого потока/задачи, чтобы избежать состояния гонки (Race Condition).

Чтобы получить максимальное число потоков, вызовите

BurstTraceCustomThreads.GetMaxThreadsCount

Это значение отражает максимальную емкость системы для параллельных индексов, а не точное количество аппаратных потоков.

Максимальное значение threadIndex = BurstTraceCustomThreads.GetMaxThreadsCount - 1. Также оно равно JobsUtility.ThreadIndexCount. Обычно максимальное число потоков = 20, поэтому вы можете указать индекс от 0 до 20.

Если вы запускаете больше 20 параллельных заданий, вы можете написать разработчику, создав запрос на GitHub, уточнив ваш фреймворк и максимальное количество параллельных запусков.

Эта функция имеет внутреннюю проверку безопасности: если ваш индекс будет меньше нуля или больше или равен BurstTraceCustomThreads.GetMaxThreadsCount, вы получите исключение.

Внимание! Эта реализация не тестировалась со всеми фреймворками и может вызывать конфликт с системой безопасности Unity. Если вы столкнулись с какой-либо ошибкой, пожалуйста, создайте запрос на GitHub, указав ошибку, ваш фреймворк, и примерный код реализации!