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, указав ошибку, ваш фреймворк, и примерный код реализации!