본문 바로가기
Unity Study/UNITY DOTS

UnityDOTS 공부하기 2일차

by 백삼_zif 2024. 2. 4.
반응형

안녕하세요 백삼개일의 지프입니다. 오늘은 본격적으로 DOTS에 대해서 공부를 진행해 보려고 합니다.

공부할 자료를 찾아보려다 우선은 유니티 공식 튜토리얼을 따라서 공부를 진행해 보려고 합니다.

 

<유니티 튜토리얼 콘텐츠>
https://learn.unity.com/tutorial/part-1-understand-data-oriented-design?uv=2022.3&courseId=60132919edbc2a56f9d439c3#639aed80edbc2a6721c462b7

 

Part 1: Understand data-oriented design - Unity Learn

In this section of the DOTS Best Practices guide, you will: Learn how data-oriented design (DOD) differs from object-oriented programming. Find links to a number of written and video primers introducing DOD concepts Learn some key principles to remember wh

learn.unity.com

1. DOD의 이해

Data Oriented Design 은 지금까지 유니티에서 사용해오던 OOP와는 많이 다른 특징을 가지고 있습니다.
오브젝트 중심의 사고에서는 오브젝트 내의 동작들이나, 변수들은 해당 오브젝트 내에 담겨있어야 하고, 이러한 방식은 캡슐화와 은닉 상속이라는 많은 개념들을 필요로 했습니다. 다만 이러한 방식으로 동작하는 것은 사람에게는 당장 빠르게 이해될 수 있다는 장점이 있으나, 컴퓨터의 연산에 입장에서 본다면 효율적인 방식은 아니라고 합니다.
컴퓨터의 성능을 좀더 잘 활용 하기 위해서 만들어진 방식이 DOD이며, 이는 같은 처리를 필요로 하는 데이터들을 배열로 관리하고 이를 반복연산을 통하여 처리하므로서, 캐시적중을 높이고 컴퓨터의 활용을 높일 수 있다고 합니다.

2. 참고할 영상들

아래의 영상들은 왜 DOD가 필요한지에 대한 설명을 정말 간단하게 설명해주고 있습니다. 전공자 분들이라면 이미 다 알고 계실지도 모르지만, 비전공자로서 코딩공부를 시작하신 분들이라면 정말 큰 도움이 될 수 있으니 꼭 한번은 보시는걸 추천드려요!

 

https://www.youtube.com/watch?v=rtAlC5J1U40

<캐시>

https://www.youtube.com/watch?v=WDIkqP4JbkE

http://youtube.com/watch?v=4_smHyqgDTU&feature=youtu.be

https://gdcvault.com/play/1022248/SIMD-at-Insomniac-Games-How

 

SIMD at Insomniac Games: How We Do the Shuffle

Insomniac Games' core team has plenty of experience with SIMD across various architectures, and they are now applying that knowledge to SSE and AVX. This talk is a deep dive into how that team squeezed the most out of SIMD on modern x86 processors...

gdcvault.com

2.1 CPU

컴퓨터는 연산을하는 부분인 CPU와 메모리칩인 RAM이 있다고 합니다. CPU는 1초에 수십억개의 연산을 처리할 수 있는 능력을 가지고 있고, 전기신호는 빛의 속도로 전달이 되나, CPU와 RAM과의 거리는 몇 CM정도의 거리가 떨어져 있으므로, RAM에서 데이터를 불러와 해당 데이터를 가지고 CPU가 연산을 하는 과정에서 CPU는 데이터가 로드되기까지 연산을 기다려야 하는 과정이 발생한다고 합니다.
이를 막기위해서 고안해 낸 것이 캐시메모리이며 이는 CPU내에도 작게나마 메모리칩을 넣어두는 개념이며, 이를 통하여 메모리에서 데이터를 불러올때 해당 데이터의 주변의 데이터를 덩어리채 불러온다고 합니다. 컴퓨터 연산의 경우 다음 연산에 필요한 데이터가 해당 메모리 근처에 있을 확률이 높기 때문인데, 이때 다음에 필요한 데이터가 캐시안에 존재하는 경우를 '캐시적중'이라 부르고, 없는 경우를 '캐시미스'라고 부른다고 합니다. 캐시 적중이 일어나면 우리는 RAM에서 데이터를 불러오는 시간을 절약할 수 있고, 이는 성능향상으로 이어집니다. (아마도 우리가 앞으로 할 DOD의 경우에도 같은 연산을 필요로 하는 데이터들을 배열로서 모아놓으려는 이유가 캐시적중을 높이려는 이유에서 라고 생각되네요.)

다음으로는 CPU의 InstructionPipeLine이라는 개념입니다. 명령어 파이프라인이라는 것인데, 우리가 컴퓨터 연산을 하는 과정에 있어서는 Fetch - Decode - Excute 라는 사이클을 반복해서 수행한다고 합니다. 쉽게 예를들어 빨래를 하는 과정에서 세탁 - 건조 사이클이 있다고 가정해 봅니다. 우리는 (세탁 (a)) -> (건조 (a)) -> (세탁 (b)) -> (건조 (b)) 를 반복해서 수행할 수도 있지만, 이를 좀더 효율적으로 하기 위해선 (세탁 (a)) -> (건조 (a) + 세탁 (b)) -> (건조 (b) + 세탁 (c)) 과 같이 건조와 동시에 다음 세탁물을 세탁할 수 있습니다. 이러한 것이 명령어 파이프라인의 개념입니다. Fetch와 Decode와 Excute는 각각 다른 위치에서 일어나는 연산과정으로서, Excute과정에서 다음 코드를 Decode하고, 동시에 다다음 코드를 Fetch 하는 방식으로 3개의 과정을 동시에 진행시키면 성능이 3배 좋아질 수 있다는 개념입니다. 다만, 여기에서 데이터들이 데이터간에 의존성이 있는 경우에는 문제가 발생할 수 있습니다. ( 나중에 Data Defendency 에 대해서 좀더 다룰 기회가 있을거 같네요)

2.2 캐시메모리

이부분에 대한 설명은 제가 해드리기 어려운 내용이 너무 많아서 영상을 보시기를 권장드리겠습니다. ㅠㅠ
캐시 메모리가 주메모리에 성능이 어떻게 좋은지, 우리는 설계를 할때 캐시를 왜 고려해야하는지, 캐시 친화적인 데이터는 어떤식으로 구성되어야 하는지에 대한 내용이 있습니다.

3. Unity DOTS 샘플 예제

아래의 깃허브 주소에는 ECS 샘플 예제에 대한 자료가 있습니다.

https://github.com/Unity-Technologies/EntityComponentSystemSamples

 

GitHub - Unity-Technologies/EntityComponentSystemSamples

Contribute to Unity-Technologies/EntityComponentSystemSamples development by creating an account on GitHub.

github.com

 

다음 시간에는 해당 UnityDOTS 샘플예제를 따라서 직접 프로젝트를 만들고 해당 프로젝트 내에서 직접 코딩을 하는 내용으로 찾아뵙겠습니다. 

 

반응형

'Unity Study > UNITY DOTS' 카테고리의 다른 글

Unity DOTS 공부하기 1일차  (0) 2024.02.03