ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1067)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (180)
      • Unreal (69)
      • Unity (100)
      • 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인칭 시점으로 써내려가는 글들

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

[Unity] Job 시스템 정의
게임엔진/Unity

[Unity] Job 시스템 정의

2023. 3. 23. 15:14

단일 작업 인터페이스 IJob

Job 시스템이 사용하는 자료구조 NativeContainer

Job 대기 핸들 (Handle)

동시에 여러개의 작업 IJobParallelFor

원리

멀티 스레딩 방식의 프로그래밍 기법이지만, 스레드를 별도로 생성하지 않는다.

유니티 내부에는 우리가 익숙하게 작업을 진행하는 메인 스레드와, CPU 코어 개수에 맞춰 월드의 변경사항을 적용하여 렌더링 할 준비를 해주는 작업자 스레드, 렌더링 과정을 처리하는 렌더 스레드가 존재한다. 이 중, 작업자 스레드에 작업을 지시할 수 있게끔 해준다.

장점과 단점

장점

  1. 빠르다.
  2. 메모리 절약된다.
  3. 유니티에서 제공하는 각종 스레드 안전장치를 사용할 수 있다.
  4. 유니티의 로직에 맞춰 돌아가므로 비교적 안정적인 프레임을 기대할 수 있다.
  5. 유니티가 관리하는 스레드이므로, 에러가 발생하면 유니티 콘솔을 통해 디버깅할 수 있다.
  6. 다수의 작은 작업을 처리하기에 용이하다.

단점

  1. 일반 멀티 스레드에서 무한 루프 발생 시 해당 스레드만 빠지는거와 달리, Job 시스템에서 발생되는 문제는 유니티 전체가 빠지게 된다.
  2. 데이터 관리를 유니티에서 제어하므로, 굉장히 한정적인 조건 내에서 스레드 간의 데이터 교환이 허용된다.
  3. 작업자 스레드라 멈추면 안된다 즉 System.Thread.Sleep에 대응되는 기능이 없다.
  4. 함부로 무거운 기능을 지시하기가 애매하다 그래서 커다란 작업을 분할하지 않은 채 하는건 비합리적이다.
  5. C/C++의 멀티 스레드와 비슷할 정도로 까다롭다.
  6. 스레드 작업과 달리 인터럽트 할 수 없다.
  7. 메인 스레드에서만 접근할 수 있는 데이터(Ex. Time 구조체 등)에 접근할 수 없다.

예제

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

public class Jobs_PingPong : MonoBehaviour
{
    public Transform[] transforms;
    TransformAccessArray _transformAccessArray;

    void Start()
    {
        _transformAccessArray = new TransformAccessArray(transforms);
    }

    public struct PingPongJob : IJobParallelForTransform
    {
        public float time;

        public void Execute(int index, TransformAccess transform)
        {
            Vector3 position = transform.position;
            position.y = Mathf.Sin(time);
            transform.position = position;
        }
    }

    private void Update()
    {
        var job  = new PingPongJob() { time = Time.time };
        var handler = job.Schedule(_transformAccessArray);
    }
}

출처 : https://m.blog.naver.com/canny708/221557618976

저작자표시 (새창열림)

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

[Unity] 이동, 회전, 크기변경 정리  (2) 2023.05.05
[Unity] 어드레서블 에셋(Addressable Asset)의 모든것  (0) 2023.04.02
[Unity] Job 시스템 이해 4, IJobParallelFor  (0) 2023.03.23
[Unity] Job 시스템 이해 3, JobHandle  (0) 2023.03.23
[Unity] SQL 데이터 베이스 연동 SQLite  (0) 2023.03.23
    '게임엔진/Unity' 카테고리의 다른 글
    • [Unity] 이동, 회전, 크기변경 정리
    • [Unity] 어드레서블 에셋(Addressable Asset)의 모든것
    • [Unity] Job 시스템 이해 4, IJobParallelFor
    • [Unity] Job 시스템 이해 3, JobHandle
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바