ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1066)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (179)
      • Unreal (69)
      • Unity (99)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (346)
      • C++ (167)
      • C# (88)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • C++
  • 유니티
  • C
  • 알고리즘
  • 포인터
  • 언리얼
  • SQL
  • 티스토리챌린지
  • c#
  • 배열
  • 오블완
  • 그래픽스
  • 클래스
  • 파이썬
  • 프로그래머스
  • string
  • Unity
  • 문자열
  • 함수
  • 백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

게임엔진/Unity

[Unity] Job 시스템 이해 4, IJobParallelFor

2023. 3. 23. 10:32

▶ IJob이 단일 작업자 스레드에서 Execute()가 한번 처리되었다면, IJobParallerFor는 사용 가능한 모든 작업자 스레드에서 Execute()가 실행 횟수 만큼 나뉘어서 실행된다.

 

▶ IJobParallelFor는 Execute()의 로직은 동일하지만 특정 Index의 매개 변수가 다를 때 사용하면 유용하다. 같은 로직을 여러번 수행할 때 묶음으로 처리함으로써 성능 향상의 도움이 된다.

[JobProducerType( typeof( IJobParallelForExtensions.ParallelForJobStruct<> ) )]
public interface IJobParallelFor
{
	//
	// 요약:
	//     Implement this method to perform work against a specific iteration index.
	//
	// 매개 변수:
	//   index:
	//     The index of the Parallel for loop at which to perform work.
	void Execute(int index);
}

▶ IJob과 달리 Execute에 Index가 추가되었는데, 해당 Index로 Job의 데이터 리스트에서 가져올 데이터를 확인할 수 있다.

using UnityEngine;
using Unity.Jobs;
using Unity.Collections;

public class JobSample : MonoBehaviour
{
	/// <summary>
	/// Excute의 Index를 result 배열에 넣어주는 단순한 예제
	/// </summary>
	struct JobParallel : IJobParallelFor
	{
		public NativeArray<int> result;

		public void Execute(int index)
		{
			result[index] = index;
		}
	}

	// Job을 실행할 횟수
	int count = 10000;
	// 하나의 작업자 스레드당 설정할 Job의 개수
	// 작업자 스레드가 3개인 경우 10000개의 Job을 10개씩 나누어 3개의 작업자 스레드에 나눈다. 
	// 10000/10 = 1000, 1000/3 = 333 개 묶음으로 나뉨
	int batchCount = 10;

	void Start()
	{
		NativeArray<int> result = new NativeArray<int>( count, Allocator.TempJob );

		JobParallel jobParallel = new JobParallel();
		jobParallel.result = result;

		// count, batchCount에 따라 작업자 스레드에 Job이 나뉘게 된다.
		JobHandle handle = jobParallel.Schedule( count, batchCount );

		handle.Complete();
		result.Dispose();
	}
}

▶ IJob이 한번에 여러개의 작업자 스레드에서 실행된다는 것 외에는 기본적인 개념은 IJob과 동일하다.

 

▶ IJobParallelFor를 확장하여, 한번에 여러개의 Transform을 처리하는 Job을 만들 수 있는 IJobParallelForTransform도 있다. IJobParallelForTransform를 사용하려면 using UnityEngine.Jobs 을 선언해야한다.

 

▶ PackageManager에서 Jobs Preview Package를 Import하면 IJobParallelFor의 확장형 인터페이스를 추가로 사용할 수 있다.

: PreviewPackage이기 때문에 해당 확장형 인터페이스를 사용하기 보다는 기존의 IJobParallelFor를 사용하는 것이 현재로써는 더 좋다.

 

출처 : https://everyday-devup.tistory.com/100

저작자표시 (새창열림)

'게임엔진 > Unity' 카테고리의 다른 글

[Unity] 어드레서블 에셋(Addressable Asset)의 모든것  (0) 2023.04.02
[Unity] Job 시스템 정의  (0) 2023.03.23
[Unity] Job 시스템 이해 3, JobHandle  (0) 2023.03.23
[Unity] SQL 데이터 베이스 연동 SQLite  (0) 2023.03.23
[Unity] 에디터에서만 사용할 수 있는 커스텀 코루틴  (0) 2023.02.17
    '게임엔진/Unity' 카테고리의 다른 글
    • [Unity] 어드레서블 에셋(Addressable Asset)의 모든것
    • [Unity] Job 시스템 정의
    • [Unity] Job 시스템 이해 3, JobHandle
    • [Unity] SQL 데이터 베이스 연동 SQLite
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바