유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/pdf/d2t5s1.pdf목차 3...

59

Upload: others

Post on 06-Jun-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —
Page 2: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

유니티에서시뮬레이션게임연산분산하기

Page 3: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

목차

3

— Dojagi : The Korean Pottery

— What kind of Problems.

— How to Solve it.

— Multi Threading on Unity

— C# Thread

— Job System

— Compute Shader

Page 4: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

4

발표자소개

3년차프로그래머.

2017. 7월부터

유티플러스인터랙티브클라이언트

프로그래머.

Page 5: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Dojagi: The Korean Pottery

5

VR 도자기시뮬레이션

도자기를만드는게임. Available Platform

Available Device

여기에수식을입력하십시오.

Page 6: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

어떤이야기들을하나요?

6

유니티로 VR 시뮬레이션게임을개발하면서발생한많은

CPU부하.

CPU부하를해결하기위한Multithreading과 ComputeShader.

Page 7: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

도자기를플레이하기위한사양

7

스팀에게시되어있는도자기의최소사양/권장사양

Page 8: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

How to make pottery

8

Page 9: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

도장찍기(Stamping)그림그리기(Drawing)성형(Shaping)

How to make pottery

9

Page 10: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Shaping

10

• 도자기하나에 1.5 ~ 2.5만개의

vertex를가진모델.

• 손과 vertex간의거리에따라

점토가빚어짐.

• vertex의밀도가너무떨어지지

않도록 vertex간의간격을유지.

Page 11: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

11

CPU연산의단순화.

• 비대칭성형을포기를통해

손과의연산, Vertex간의연산

횟수를대폭감소.

• 연산결과로나온반경과높이

값을각 Vertex에반영.

어느정도개선되는정도...

Shaping

Page 12: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

12

그릴곳의 UV데이터를구해서해당

위치에브러쉬를찍어주는간단한

방식.

평면에그림그리기에적합한방식.

Drawing / Stamping

Page 13: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

13

Plane에서 Cylinder로변경하면

왜곡되는부분이생김. 특히

바닥면이나위쪽면.

Drawing / Stamping

Page 14: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Sutherland-Hodgman Clipping Algorithm을

통해다양한형태에서도왜곡되지않도록,

실제닿는곳에서그려지도록수정.

14

범위안에들어가는모든 Triangle에대한

연산으로기존방식에비해많은연산을

필요로함.

Drawing / Stamping

Page 15: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Drawing(Engraving)

15

그림그리기를기능을활용한

조각하기기능.

그림그리기기능으로 Height Map을

생성하고 Normal Map으로변환하기.

Page 16: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

HeightMap에서 NormalMap으로변환하기

16

• CPU로연산하기.

• Shader로처리하기.

조각하는중 Height Map의변경

사항이바로적용되어야하며, 제작된

도자기의모델링데이터로추출이

가능해야한다.

처음부터이런기준이있었던것은

아니다. 만들고보니...

Page 17: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

많은연산을제한된시간내에처리하려면...

한정된시간내에 CPU가할수있는일의

양은정해져있다.

게임엔진은내가만든스크립트만연산하는

것이아니기때문에그시간마저도 100%

활용할수없는상태.

CPU부하로인해프레임드랍이발생할경우

로직을최적화해야한다라는건당연.

그런데로직을최적화이후에도프레임

드랍이있다면?

Page 18: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread

컴퓨터에는여러개의일꾼이존재.

유니티에서는많은연산을처리하도록하기위한 DOTS(Job

System, Entity Component System, Burst Compiler)가일부

나왔거나나올예정.

2017.2버전사용중, Job System을제대로모르는상태에서

사용하기가힘들었음.

JobHandle.Complete() – 해당핸들에할당된작업이완료될

때까지기다리고작업이완료된것을확인하여할당된

메모리의소유권을얻어올수있도록하는함수.

함수를부르는시점에서작업을시작되는문제.

유니티의잡시스템문서의 “C# 잡시스템팁및문제

해결”에서 “예약된배치를플러시하기” 참고.

Unite 2016 Keynote from Youtube

Page 19: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread

Dojagi : The Korean Pottery에는 Job

System을적용하지않았음.

C#의 Thread를이용해서하나의연산과정을

다른 Thread에서처리.

Page 20: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

MultiThread주의사항

Main Thread가아닌 Thread에서는할수없는

것들이많음.

여러 Thread에서접근하게되면오른쪽그림과

같은문제가엔진크래시나오동작을발생시킬

가능성이크기때문.

되도록 Thread들이같은메모리에접근하지

않도록하는것이속도면에서도안정성면에서도

좋음.

같은메모리에동시접근을방지하기위해

lock을걸거나한번의 cpu명령으로읽기, 연산,

쓰기가가능한 atomic연산을사용하여문제

방지가능.

결과가 6이나오길원하지만원하는것과전혀다른결과가나온다.

Page 21: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread

연관성이없는연산을분리하여별도의

Thread로돌리는부분은크게걱정할필요가

없음.

Work1과 2가종속적인관계를가진상태라면

아래그래프와같은결과가나올수도있음.

성공적인 Thread연산.

하지만Work2가 Work1의결과를이용한연산을해야한다면...?

Page 22: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread

Main Thread가하는일은 Script Update만

있는것이아님. Child Thread는 Main

Thread가다른일을하는동안에도계속연산을

할수있음.

대신 Work2의연산결과는다음프레임에 Main

Thread에서처리하여적용.

각 Work가독립적이거나매프레임 Work1을

수행해야되는것이아니라면 Child Thread는

더지연된연산을해도될것임.

한프레임지연하여연산을적용하여 cpu time을개선한모습.

Page 23: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread

Render를위한작업에부하를주기위해 Asset Store에서 Windridge City Asset을받아서테스트를

진행.

Page 24: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread Profiling Tip

Unity Profiler에내가별도로생성한 Thread에

대해서도 Profiling이가능한기능이추가됨.

2017.2 버전에는존재하지않음.

Graph를캡쳐하기위해서 2019.1 버전을사용하다가

발견.

/* Custom Thread Profiling */

using UnityEngine.Profiling;

void ExecuteOnChildThread(){

Profiler.BeginThreadProfiling(”ThreadGroupName”,“ThreadName”);

Profiler.EndThreadProfiling();}

Page 25: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread - Before

임의로생성한의미없는배열을초기화하고값을더하는작업을두가지생성.

Main Thread에서 모든것을처리하는모습.

Script에서 약 22ms의 시간을 소모하고

있다.

Page 26: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread - Before

임의로생성한의미없는배열을초기화하고값을더하는작업을두가지생성.

Main Thread에서 모든것을처리하는모습.

Script에서 약 22ms의 시간을 소모하고

있다.

Page 27: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread - After

임의로생성한의미없는배열을

초기화하고값을더하는작업을

두가지생성.

별도의 Thread를 생성해서 무거운 연산을

한프레임 지연 연산하고 있음.

Page 28: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread - After

임의로생성한의미없는배열을

초기화하고값을더하는작업을

두가지생성.

별도의 Thread를 생성해서 무거운 연산을

한프레임 지연 연산하고 있음.

Page 29: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread

같은 연산을 Job System의 IJobParellelFor로

만들어서 연산시킨 Graph

Page 30: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread code example

123456789

10111213141516171819202122232425

//Variablesenum ThreadState{

None,NotInitialized,Working,Waiting,

}

ThreadState MainThreadState = ThreadState.None;ThreadState ChildThreadState = ThreadState.None;

//using System.ThreadingEventWaitHandle MainThreadWait = new EventWaitHandle(true, EventResetMode.ManualReset);EventWaitHandle ChildThreadWait = new EventWaitHandle(true, EventResetMode.ManualReset);

Thread ChildThread = null;

bool isDestroying = false;

void OnDestroy(){

isDestroying = true;}

30

Page 31: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread code example

123456789

10111213141516171819202122232425

//Initializevoid Awake(){

MainThreadState = ThreadState.Working;ChildThreadState = ThreadState.NotInitialized;ChildThread = new Thread(ChildUpdate);ChildThread.Start();

}

31

Page 32: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread code example

123456789

10111213141516171819202122232425

//Main Thread Updatevoid Update(){

if (ChildThreadState == ThreadState.Working){ //ChildThread가 작업중이라면 MainThread는 대기.MainThreadState = ThreadState.Waiting;//ChildThread가 이 시점에 MainThreadState에 접근한다면 Deadlock 상태에 빠짐.MainThreadWait.WaitOne();

}

Postprocess();

MainThreadWait.Reset();

MainThreadState = ThreadState.Working;//ChildWork의 후처리와 준비. ReadyforChildWork();

if (ChildThreadState == ThreadState.Wait){ChildThreadWait.Set();

}//ChildWork와는 별개로 진행될 작업.DoingSomethingOnMainThread();

}

32

Page 33: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

C# Thread code example

123456789

10111213141516171819202122232425

//Child Thread Updatevoid ChildUpdate(){

ChildThreadWait.Reset();ChildThreadState = ThreadState.Waiting;

while(!isDestroying){ChildThreadWait.WaitOne();ChildThreadWait.Reset();

ChildThreadState = ThreadState.Working;

DoSomethingOnChildThread();

ChildThreadState = ThreadState.Waiting;//MainThread가 이 부분을 지난 후 wait상태로 변한다면 교착상태에 빠질 수 있다.if (MainThreadState == ThreadState.Waiting){MainThreadWait.Set();

}}

}

33

Page 34: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

i7-8700K

병렬연산성능비교

34

GTX 1660ti

Page 35: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Compute Shader

35

Page 36: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Steam Hardware&Software Survey : April 2019DirectX 사용가능한시스템을가지고있는

유저들에대한통계에따르면약 95퍼센트

정도의유저는 DX11이상버전이돌아가는

하드웨어를가지고있다.

36

Page 37: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Compute Shader

37

GPU의 Streaming Multiprocessor 구조Compute Shader의 ThreadGroup 구조

Page 38: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Compute Shader Code Sample

123456789

10111213141516171819202122232425

//Compute Shader Code#pragma kernel CSMain

RWTexture2D<float4> Result;

[numthreads(8,8,1)]void CSMain(uint3 id : SV_DispatchThreadID){

Result[id.xy] = float4(id.x & id.y, (id.x & 15)/15.0, (id.y & 15)/15.0, 0.0);}

38

Page 39: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Compute Shader Code Sample

123456789

1011121314

39

//Compute Shader Code#pragma kernel CSMain VALUE=15#pragma kernel OtherMain VALUE=31

RWTexture2D<float4> Result;

[numthreads(8,8,1)]void CSMain(uint3 id : SV_DispatchThreadID){

Result[id.xy] = float4(id.x & id.y, (id.x & VALUE)/15.0, (id.y & VALUE)/15.0, 0.0);}[numthreads(8,8,1)]void OtherMain(uint3 id : SV_DispatchThreadID)...

어떤함수가연산에사용될지커널을정의하는부분.

하나의파일에여러개의커널을사용할수도있으며, 각커널별로매크로를 define 할수도있음.

Page 40: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Compute Shader Code Sample

40

//Compute Shader Code#pragma kernel CSMain

int width;Int height;RWTexture2D<float4> Result;

[numthreads(8,8,1)]void CSMain(uint3 id : SV_DispatchThreadID){

Result[id.xy] = float4(id.x & id.y, (id.x & 15)/15.0, (id.y & 15)/15.0, 0.0);}

기본적인타입들(int N, float N 등)

Texture2D, Texture3D –읽기가능한텍스쳐데이터.

RWTexture2D, RWTexture3D –읽기/쓰기가가능한텍스쳐데이터.

StructuredBuffer<T> –데이터읽기가능RWStructuredBuffer<T> –데이터읽기/쓰기가능AppendStructuredBuffer<T> –지정된크기내에서데이터를 push 할수있음.

ConsumeStructuredBuffer<T> –반대로데이터를 pop하는것만가능함.

123456789

1011121314

Page 41: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Compute Shader Code Sample

41

//Compute Shader Code#pragma kernel CSMain

RWTexture2D<float4> Result;

[numthreads(8,8,1)]void CSMain(uint3 id : SV_DispatchThreadID){

Result[id.xy] = float4(id.x & id.y, (id.x & 15)/15.0, (id.y & 15)/15.0, 0.0);}

123456789

10

연산을수행할 thread의개수를 3차원으로지정.

ThreadGroup당 8 * 8 * 1 = 64 의 thread 개수를가짐.

차례대로 X, Y, Z라고한다면DirectX11 기준으로 Thread Group당 Thread 개수 :

X * Y * Z <= 1024

X, Y <= 1024

Z <= 64

Page 42: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Compute Shader Code Sample

42

//Compute Shader Code#pragma kernel CSMain

RWTexture2D<float4> Result;

[numthreads(8,8,1)]void CSMain(uint3 id : SV_DispatchThreadID){

Result[id.xy] = float4(id.x & id.y, (id.x & 15)/15.0, (id.y & 15)/15.0, 0.0);}

123456789

10

SV_GroupThreadID – Thread Group내에서 Thread Index(uint3)

SV_GroupID – ThreadGroup의 Index(uint3)

SV_DispatchThreadID –모든 Thread에걸친 ThreadIndex(uint3)

SV_GroupIndex – Thread Group내에서 Thread Index(uint)

각 thread를구분하여각기다른데이터로연산을할수있도록하는부분.

Page 43: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Compute Shader Code Sample

43

//C Sharp Code for Execute Compute Shaderpublic ComputeShader myComputeShader;int kernel;RenderTexture rt;

void Awake(){

rt = new RenderTexture(1024, 1024, 0, Format);rt.enableRandomWrite = true;rt.Create();

kernel = myComputeShader.FindKernel(“CSMain”);myComputeShader.SetTexture(kernel, “Result”, rt);

myComputeShader.Dispatch(kernel, rt.width / 8, rt.height/ 8, 1);}

앞서보여준 Compute Shader가 GPU에서실행될수있도록하기위한부분.

코드의목적에맞게초기화시점과 Compute

Shader의실행시점은조절될필요가있음.

123456789

1011121314151617181920

Page 44: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Compute Shader Code Sample

44

//C Sharp Code for Execute Compute Shaderpublic ComputeShader myComputeShader;int kernel;RenderTexture rt;

void Awake(){

rt = new RenderTexture(1024, 1024, 0, RenderTextureFormat.ARGB32);

rt.enableRandomWrite = true;rt.Create();

kernel = myComputeShader.FindKernel(“CSMain”);myComputeShader.SetTexture(kernel, “Result”, rt);

myComputeShader.Dispatch(kernel, rt.width / 8, rt.height/ 8, 1);}

123456789

1011121314151617181920

Page 45: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Compute Shader Code Sample

45

//C Sharp Code for Execute Compute Shaderpublic ComputeShader myComputeShader;int kernel;RenderTexture rt;

void Awake(){

rt = new RenderTexture(1024, 1024, 0, RenderTextureFormat.ARGB32);

rt.enableRandomWrite = true;rt.Create();

kernel = myComputeShader.FindKernel(“CSMain”);myComputeShader.SetTexture(kernel, “Result”, rt);

myComputeShader.Dispatch(kernel, rt.width / 8, rt.height/ 8, 1);}

Compute shader에서사용될 Texture를생성함.

SystemInfo.SupportsRenderTextureFormat함수를통해현재플랫폼과 GPU에서지원하는포맷인지체크가능.

Texture에데이터를쓸것이기때문에RandomWrite가가능한 RenderTexture를생성.

123456789

1011121314151617181920

Page 46: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Compute Shader Code Sample

46

//C Sharp Code for Execute Compute Shaderpublic ComputeShader myComputeShader;int kernel;RenderTexture rt;

void Awake(){

rt = new RenderTexture(1024, 1024, 0, RenderTextureFormat.ARGB32);

rt.enableRandomWrite = true;rt.Create();

kernel = myComputeShader.FindKernel(“CSMain”);myComputeShader.SetTexture(kernel, “Result”, rt);

myComputeShader.Dispatch(kernel, rt.width / 8, rt.height/ 8, 1);}

123456789

1011121314151617181920

Page 47: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Compute Shader Code Sample

47

//C Sharp Code for Execute Compute Shaderpublic ComputeShader myComputeShader;int kernel;RenderTexture rt;

void Awake(){

rt = new RenderTexture(1024, 1024, 0 , RenderTextureFormat.ARGB32);

rt.enableRandomWrite = true;rt.Create();

kernel = myComputeShader.FindKernel(“CSMain”);myComputeShader.SetTexture(kernel, “Result”, rt);

myComputeShader.Dispatch(kernel, rt.width / 8, rt.height/ 8, 1);}

123456789

1011121314151617181920

Page 48: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Height To Normal

48

Page 49: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —
Page 50: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —
Page 51: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —
Page 52: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

여기에수식을입력하십시오. 𝑥2 + 𝑦2 = 1

Page 53: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Compute Shader Code Sample

53

//Height to Normal in CPUVoid Update(){

...for (int i = 0; i < heights.Length; i++){int row = i % 1024;int col = i / 1024;

int right = col * 1024 + Mathf.Min(row + 1, 1023);int left = col * 1024 + Mathf.Max(row – 1, 0);int up = Mathf.Min(col + 1, 1023) * 1024 + row;int down = Mathf.Max(col – 1, 0) * 1024 + row

normal[i].r = 0.5f + (heights[right].r – heights[left].r) * 10.0f;normal[i].g = 0.5f + (heights[up].r – heights[down].r) * 10.0f;normal[i].b = 1.0f;normal[i].a = 1.0f;

}...

}

123456789

101112131415161718192021

Page 54: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Compute Shader Code Sample

54

//Compute Shader Code#pragma kernel CSHeightToNormal

Texture2D<float4> HeightRT;RWTexture2D<float4> NormalRT;

[numthreads(32,32,1)]void CSHeightToNormal(uint3 id : SV_DispatchThreadID){

uint4 horizontal = clamp(uint4(id.x + 1, id.y, id.x – 1, id.y), 0, 1024);uint4 vertical = clamp(uint4(id.x, id.y + 1, id.x, id.y - 1), 0, 1024);

float Xdiff = 0.5 + (HeightRT[horizontal.xy].r – HeightRT[horizontal.zw].r) * 10.0;float Ydiff = 0.5 + (HeightRT[vertical.xy].r – HeightRT[vertical.zw].r) * 10.0;

NormalRT[id.xy] = float4(Xdiff, Ydiff, 1.0, 1.0);}

123456789

101112131415161718

Page 55: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Height to Normal

1024*1024 해상도를가진 Height Map

● 약 100만개의각 Pixel에대한연산

Page 56: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

발표를마치며

Page 57: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Reference

57

Unity Job System Document – C# 잡 시스템 팁 및 문제 해결

https://docs.unity3d.com/kr/2018.2/Manual/JobSystemTroubleshooting.html

Richard Meredith의 Simple Multithreading for Unity

http://www.richardmeredith.net/2017/07/simple-multithreading-for-unity/

Limitation of atomic operation

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

Microsoft Docs – Compute Shader Overview

https://docs.microsoft.com/en-us/windows/desktop/direct3d11/direct3d-11-advanced-stages-

compute-shader

Compute Shader – Lou Kramer, AMD

https://youtu.be/0DLOJPSxJEg

Page 58: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Reference

58

Compute Shader Tutorial– vincent lorant blog

http://www.vincentlorant.com/blog/compute-shaders/introduction

고정석님의 ComputeShader관련글

https://blog.naver.com/tigerjk0409/221411401463

https://blog.naver.com/tigerjk0409/221412318400

https://blog.naver.com/tigerjk0409/221412320578

https://blog.naver.com/tigerjk0409/221414270819

Page 59: 유니티에서시뮬레이션 게임연산분산하기uniteseoul.com/2019/PDF/D2T5S1.pdf목차 3 — Dojagi : The Korean Pottery — What kind of Problems. — How to Solve it. —

Q&A