C\#유 니 티 게임 개발 에서 다 중 스 레 드 프로 그래 밍 을 하 는 방법

8809 단어 C#다 중 스 레 드
그 전에 유 니 티 가 다 중 스 레 드 를 지원 하지 않 는 다 는 의혹 이 많 았 고,사실상 유 니 티 는 다 중 스 레 드 를 지원 했다.다 중 스 레 드 를 언급 하면 Unity 가 자주 사용 하 는 협 정 을 언급 해 야 하지만 협 정 은 진정한 다 중 스 레 드 가 아니다.협 정 은 어떤 조작 이 끝 난 후에 뒤의 코드 를 실행 하거나 제어 코드 가 특정한 시기 에 실행 된다 고 할 수 있다.다 중 스 레 드 는 Unity 렌 더 링 과 복잡 한 논리 연산 시 다 중 핵 CPU 를 효율적으로 사용 하여 프로그램 이 더욱 효율 적 으로 작 동 하도록 도와 준다.이 편 은 유 니 티 에서 다 중 스 레 드 를 어떻게 사용 하 는 지 를 소개 한다.
먼저 C\#에서 다 중 스 레 드 를 사용 하 는 라 이브 러 리 를 도입 합 니 다.

using System.Threading;

스 레 드 인 스 턴 스 를 만 드 는 네 가지 방식
1.스 레 드 실행 무 참 방법
구조 문법

//     Thread      。
// < param name="start">      .</ param>
public Thread(ThreadStart start)

start
형식:System.Threading.ThreadStart
이 스 레 드 를 실행 할 때 호출 할 방법 을 표시 하 는 ThreadStart 의뢰 입 니 다.

void Start()
{
 //        
 Thread thr = new Thread(Func_NoArguments);
 //    
 thr.Start();
}
// Function Of No Arguments.

void Func_NoArguments()
{
 Debug.Log("Run Func_NoArguments");
}

2.스 레 드 실행 에 참여 하 는 방법 이 있 습 니 다.
구조 문법

//     Thread      。
// < param name="start">      .< /param>
public Thread(ParameterizedThreadStart start)
start
형식:System.Threading.ParameterizedThreadStart
이 스 레 드 가 실 행 될 때 호출 할 방법 을 표시 하 는 의뢰
메모:매개 변 수 는 하나만 있 고 object 형식 이 어야 합 니 다.
실례

void Start()
{
 //        
 Thread thr = new Thread(Func_Arguments);
 //    ,    
 thr.Start("Lanou");
}
// Function Of Have Arguments.
void Func_Arguments(object data)
{
 Debug.Log("Run Func_Arguments, Data = " + data);
}
3.스 레 드 실행 무 참 방법,스 레 드 사용 할 최대 스 택 크기 제한
구조 문법

//     Thread      。
// < param name="start">      .< /param>
// < param name="maxStackSize">         .< /param>
public Thread(ThreadStart start,int maxStackSize)

start
형식:System.Threading.ThreadStart
이 스 레 드 를 실행 할 때 호출 할 방법 을 표시 하 는 ThreadStart 의뢰 입 니 다.
maxStackSize
형식:System.Int 32
스 레 드 에 사용 할 최대 스 택 크기(바이트 단위);0 이면 실행 가능 한 파일 헤더 에 지정 한 기본 최대 스 택 크기 를 사용 합 니 다.
중요 사항:일부 신뢰 받 는 코드 에 대해 max StackSize 가 기본 스 택 크기 보다 크 면 무시 합 니 다.이상 을 일 으 키 지 않다.

void Start()
{
 //        ,  256KB    
 Thread thr = new Thread(Func_NoArguments,262144);
 //    
 thr.Start();
}
// Function Of No Arguments.
void Func_NoArguments()
{
 Debug.Log("Run Func_NoArguments");
}

4.스 레 드 실행 에 참고 방법 이 있 고 스 레 드 가 사용 할 최대 스 택 크기 를 제한 합 니 다.
구조 문법

//     Thread      。
// < param name="start">      .< /param>
// < param name="maxStackSize">         .< /param>
public Thread(ParameterizedThreadStart start,int maxStackSize)
start
형식:System.Threading.ParameterizedThreadStart
이 스 레 드 가 실 행 될 때 호출 할 방법 을 표시 하 는 의뢰
메모:매개 변 수 는 하나만 있 고 object 형식 이 어야 합 니 다.
maxStackSize
형식:System.Int 32
스 레 드 에 사용 할 최대 스 택 크기(바이트 단위);0 이면 실행 가능 한 파일 헤더 에 지정 한 기본 최대 스 택 크기 를 사용 합 니 다.
중요 사항:일부 신뢰 받 는 코드 에 대해 max StackSize 가 기본 스 택 크기 보다 크 면 무시 합 니 다.이상 을 일 으 키 지 않다.
실례

void Start()
{
 //        ,  256KB    
 Thread thr = new Thread(Func_Arguments,262144);
 //    ,    
 thr.Start("Lanou");
}
// Function Of Have Arguments.
void Func_Arguments(object data)
{
 Debug.Log("Run Func_Arguments, Data = " + data);
}

시작 스 레 드(위 에서 사용)
무 참 시작

void Start()
{
 //        
 Thread thr = new Thread(Func_NoArguments);
 //    
 thr.Start();
}
// Function Of No Arguments.
void Func_NoArguments()
{
 Debug.Log("Run Func_NoArguments");
}
유 참 시동

void Start()
{
 //        
 Thread thr = new Thread(Func_Arguments);
 //    ,    
 thr.Start("Lanou");
}
// Function Of Have Arguments.
void Func_Arguments(object data)
{
 Debug.Log("Run Func_Arguments, Data = " + data);
}
상용 방법
1.Public static void Sleep(int milliseconds Timeout)은 현재 스 레 드 를 지정 한 밀리초 단위 로 걸 어 놓 습 니 다.
(1)millisecondsTimeout
형식:System.Int 32
스 레 드 의 밀리초 수 를 걸다.milliseconds Timeout 매개 변수 값 이 0 이면 이 스 레 드 는 시간 영화 의 나머지 부분 을 실행 할 준비 가 되 어 있 고 같은 우선 순위 가 있 는 스 레 드 에 양보 합 니 다.실행 할 준비 가 되 어 있 고 같은 우선 순위 가 있 는 다른 스 레 드 가 없 으 면 현재 스 레 드 의 실행 을 끊 지 않 습 니 다.
(2)public void Resume()
걸 려 있 는 스 레 드 를 계속 합 니 다.(타임 슬립
(3)public void Abort()
이 방법 을 호출 하 는 스 레 드 에서 ThreadAbortException 을 일 으 켜 이 스 레 드 를 종료 하 는 과정 을 시작 합 니 다.이 방법 을 사용 하면 보통 스 레 드 를 종료 합 니 다.
(4)public void Join()
스 레 드 가 종 료 될 때 까지 호출 스 레 드 를 막 고 표준 COM 과 SendMessage 전송 을 계속 수행 합 니 다.
(5)public enum ThreadPriority
Thread 의 스케줄 우선 순 위 를 지정 합 니 다.
2016421152923973.png (1248×630)
스 레 드 탱크 를 통 해 스 레 드 를 실행 합 니 다.
2.ThreadPool.QueueUserWorkItem 방법(WaitCallback)
public static bool QueueUserWorkItem(WaitCallback callBack)
callBack
형식:System.Threading.WaitCallback
실행 할 방법 을 표시 하 는 WaitCallback
반환 값
유형:System.Beaulean
이 방법 이 줄 을 서 는 데 성공 하면 true 입 니 다.이 작업 항목 을 줄 을 서지 못 하면 NotSupported Exception 이 발생 합 니 다.
Unity 다 중 스 레 드 사용 주의
변 수 는 모두 공 유 됩 니 다.(같은 메모리 주 소 를 가리 킬 수 있 습 니 다)
UnityEngine 의 API 는 스 레 드 에서 실 행 될 수 없습니다.
UnityEngine 이 정의 하 는 기본 구조(int,float,Struct 가 정의 하 는 데이터 형식)는 Vector 3(Struct)와 같은 스 레 드 에서 계산 할 수 있 지만 Texture2d(class,루트 부 류 는 Object)는 안 됩 니 다.
UnityEngine 이 정의 하 는 기본 형식의 함 수 는 스 레 드 에서 실 행 될 수 있 습 니 다.
Unity 다 중 스 레 드 플러그 인
LOOM Multi Threading Framework 1.7 
핵심 방법

// Unlike "StartMultithreadedWorkloadExecution", you will have to build your own IThreadWorkerObject.
 // Downside: It requires some extra work. Upside: you got more controll over what goes in and comes out
 // Infact: You can create you own polymorphed IThreadWorkerObject-array, each ellement being a completely different type. For example: the statemachines of enemies are IThreadWorkerObject's and the array contains completely different classes with enemies/AI-behaviours.
 // < param name="workerObjects">An array of IThreadWorkerObject objects to be handled by the threads. If you want multiple cores/threads to be active, make sure that the number of IThreadWorkerObject's proves matches/exeeds your preferred number maxWorkingThreads. < /param>
 // < param name="onComplete">Fired when all re-packaged workLoad-objects are finished computing< /param>
 // < param name="onPackageExecuted">Fires foreach finished re-packaged set of workLoad-object< /param>
 // < param name="maxThreads"> Lets you choose how many threads will be run simultaneously by the threadpool. Default: -1 == number of cores minus one, to make sure the MainThread has at least one core to run on. (quadcore == 1 core Mainthread, 3 cores used by the ThreadPoolScheduler)< /param>
 // < param name="scheduler">If Null, a new ThreadPoolScheduler will be instantiated.< /param>
 // < param name="safeMode">Executes all the computations within try-catch events, logging it the message + stacktrace< /param>
 // < returns>A ThreadPoolScheduler that handles all the repackaged workLoad-Objects< /returns>
 public static ThreadPoolScheduler StartMultithreadedWorkerObjects(IThreadWorkerObject[] workerObjects, ThreadPoolSchedulerEvent onCompleteCallBack, ThreadedWorkCompleteEvent onPackageExecuted = null, int maxThreads = -1, ThreadPoolScheduler scheduler = null, bool safeMode = true)
{
  if (scheduler == null)
  scheduler = CreateThreadPoolScheduler();

 scheduler.StartASyncThreads(workerObjects, onCompleteCallBack, onPackageExecuted, maxThreads, safeMode);
 return scheduler;
}

종결 어
유 니 티 는 다 중 스 레 드 를 사용 할 수 있 지만 제한 이 많아 유 니 티 엔진 API 를 사용 하지 않 은 상태 에서 다 중 스 레 드 를 사용 해 다 중 핵 CPU 사용률 을 높 일 수 있다.일반적으로 대량의 계산 이 필요 한 알고리즘 내용 을 다 중 스 레 드 에 배치 하여 실행 할 수 있 으 며 논리 적 프레임 워 크 를 포함 하여 다 중 스 레 드 에 넣 어 실행 할 수 있 습 니 다.이 편 은 이론 성 이 비교적 강해 서 후기 에 실전 형 문장 이 속속 발 표 될 것 이다.

좋은 웹페이지 즐겨찾기