6 месяцев назад
📱 Unity Jobs System: Параллельные вычисления и производительность 🦊 Привет, разработчики! В продолжение нашего разговора о нативных структурах данных (NativeArray, NativeList и других контейнерах, о которых мы говорили в прошлом посте), сегодня рассмотрим как использовать их вместе с Jobs System! Основные интерфейсы и их применение: 1️⃣ IJob Используется для одной тяжелой задачи, которую можно выполнить параллельно с основным потоком Идеален для сложных вычислений (физика, процедурная генерация) public struct ComplexCalculationJob : IJob { public float worldSize; public NativeArray<float> heightMap; public void Execute() { // Здесь может быть генерация процедурного ландшафта // или сложные физические расчеты for (int i = 0; i < heightMap.Length; i++) { heightMap[i] = CalculateHeight(i, worldSize); } } } // Использование: var job = new ComplexCalculationJob { worldSize = 1000f, heightMap = new NativeArray<float>(1024, Allocator.TempJob) }; var handle = job.Schedule(); // Запускаем асинхронно handle.Complete(); // Ждем завершения когда нужен результат 2️⃣ IJobParallelFor Для параллельной обработки массивов, где каждый элемент обрабатывается независимо Отлично подходит для обработки частиц, обновления состояний AI и т.д. public struct UpdateParticlesJob : IJobParallelFor { [ReadOnly] public NativeArray<Vector3> velocities; public NativeArray<Vector3> positions; public float deltaTime; public void Execute(int index) { // Каждая частица обновляется независимо positions[index] += velocities[index] * deltaTime; } } // Использование: var job = new UpdateParticlesJob { velocities = velocitiesArray, positions = positionsArray, deltaTime = Time.deltaTime }; var handle = job.Schedule(positions.Length, 64); // 64 - размер batch 3️⃣ IJobParallelForTransform Специально оптимизирован для работы с множеством Transform компонентов Unity автоматически применяет изменения после выполнения job public struct UpdateTransformsJob : IJobParallelForTransform { [ReadOnly] public NativeArray<Vector3> targetPositions; public float speed; public float deltaTime; public void Execute(int index, TransformAccess transform) { Vector3 currentPos = transform.position; Vector3 targetPos = targetPositions[index]; transform.position = Vector3.Lerp( currentPos, targetPos, speed * deltaTime ); } } // Использование: var transforms = new TransformAccessArray(objectTransforms); var job = new UpdateTransformsJob { targetPositions = positions, speed = 5f, deltaTime = Time.deltaTime }; var handle = job.Schedule(transforms); // Unity сам применит изменения ⚠️ Важные моменты: Jobs выполняются параллельно в отдельных потоках Используйте [ReadOnly] для данных, которые не будут изменяться TransformAccess в IJobParallelForTransform автоматически синхронизируется Не забывайте освобождать нативные контейнеры! #ЛисыПишутКод #GameDev #Unity3D #UnityTips #GameOptimization #ParallelComputing #UnityDevelopment #CodingFox #UnityJobSystem #GamePerformance
3 года назад
Параллельные вычисления: введение
Источник: Nuances of Programming Обычно дата-инженерам приходится получать данные из нескольких источников, а затем очищать их и агрегировать. Часто эти процессы необходимо применять на больших объемах данных. Сегодня мы рассмотрим одно из самых фундаментальных понятий в области вычислительных технологий и в частности дата-инженерии  —  параллельные вычисления. С их помощью современные приложения могут обрабатывать огромные объемы данных за относительно небольшие промежутки времени. Обсудим преимущества параллельных вычислений в целом, а также их недостатки...