유니티로 개발하다보면 어쩌다 Thread로 처리를 하면 좋을 때가 있습니다.
그런데 유니티는 기본으로 Thread를 지원하지 않아서 Thread에서 처리할 부분은 최소화 하는게 좋긴하죠.
어쨋든 Thread로 처리하는 방법을 설명 해드리겠습니다.
개발자들은 소스로 보는게 편하죠..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | using System.Threading; class ThreadManager : MonoBehaviour { private Thread thread = null; private object lockObject = new object(); // 임계영역 처리를 위한 오브젝트 생성 private static Queue<Task> TaskQueue = new Queue<Task>(); private class Task { public int type; // 작업 방식 public string data; } void Start() { if (thread == null) { thread = new Thread(RunThread); thread.Start(); } } void Update() { while (TaskQueue.Count > 0) { Task task; lock (lockObject) { task = TaskQueue.Dequeue(); } } } // 쓰레드 함수 구현 void RunThread() { while (true) { lock (lockObject) { // 처리 TaskQueue.Enqueue(new Task()); } } } } | cs |
첨언을 드리자면 실제로 멀티스레드로 동작하는 RunThread 함수 내에서 유니티에서 제공하는 기능을 실행하면 에러가 발생합니다. 유니티는 단일 스레드만 지원합니다.
서브 스레드에서 처리할 항목을 TaskQueue 객체에 넣습니다.
그리고나서 매 프레임당 호출되는 Update 함수에서 그 객체를 꺼냅니다.
Update 함수에서 바로 lock (lockObject) 로 동기화 처리를 하게 되면 굉장히 느려집니다.
lock 자체가 빨리 처리가 되는 기능이 아니기 때문에 작성하신 프레임이 굉장히 떨어지는걸 보실 수 있습니다.
그래서 queue 의 내용이 있을 경우에만 안의 내용을 꺼내와서 처리를 하면 됩니다.
댓글 없음:
댓글 쓰기