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

23 Янв 2021 в 19:47
105 +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 Апр в 21:11
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 83 948 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир