Как распараллелить цикл в Unity с помощью System.Threading? Суть задачи проста. У меня есть гигантский трёхмерный массив float4 (из библиотеки Unity.Mathematics), и есть цикл, который над каждым элементом этого массива производит расчёты, а результаты по порядку заносит в два листа. Я просто не смог разобраться в том, как с помощью System.Threading:
1) Разделить выполнение цикла поровну между потоками
2) Сохранить порядок следования результатов в листах

23 Янв 2021 в 19:47
141 +1
0
Ответы
1

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

Ниже приведён пример кода, который демонстрирует, как можно распараллелить цикл с помощью System.Threading и сохранить порядок следования результатов в листах:

using System.Collections.Generic;
using System.Threading;
using UnityEngine;
using Unity.Collections;
using Unity.Jobs;
using Unity.Mathematics;
public class ParallelLoop : MonoBehaviour
{
public int size = 1000;
private NativeArray<float4> dataArray;
private List<float> resultList1 = new List<float>();
private List<float> resultList2 = new List<float>();
void Start()
{
// Initialize the native array
dataArray = new NativeArray<float4>(size, Allocator.Persistent);
// Populate the data array with some values
for (int i = 0; i < size; i++)
{
dataArray[i] = new float4(i, i * 2, i * 3, i * 4);
}
// Create and start parallel threads
Thread thread1 = new Thread(() => ProcessData(0, size / 2));
Thread thread2 = new Thread(() => ProcessData(size / 2, size));
thread1.Start();
thread2.Start();
}
void ProcessData(int startIndex, int endIndex)
{
for (int i = startIndex; i < endIndex; i++)
{
// Perform calculations on each element
float result = math.length(dataArray[i]);
// Lock the resultList1 for thread safety
lock (resultList1)
{
resultList1.Add(result);
}
}
}
void OnDestroy()
{
// Dispose of the native array
if (dataArray.IsCreated)
{
dataArray.Dispose();
}
}
}

В этом примере цикл данных был разделен между двумя потоками, начальная и конечная точка цикла передается в функцию ProcessData. Результаты расчетов добавляются в списки resultList1 и resultList2, которые защищены блокировкой для обеспечения потокобезопасности.

Обратите внимание, что в Unity рекомендуется использовать библиотеку Unity.Mathematics для работы с векторами и матрицами, так как она оптимизирована для использования в игровых приложениях.

17 Апр 2024 в 21:11
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир