작업(Task) 시스템
•
관련 소스 파일
◦
GameFramework/Base/TaskPool/ITaskAgent.cs
◦
GameFramework/Base/TaskPool/TaskBase.cs
◦
GameFramework/Base/TaskPool/TaskInfo.cs
◦
GameFramework/Base/TaskPool/TaskPool.cs
◦
GameFramework/Download/DownloadManager.DownloadTask.cs
◦
GameFramework/Resource/ResourceManager.ResourceLoader.LoadResourceTaskBase.cs
◦
GameFramework/WebRequest/WebRequestManager.WebRequestTask.cs
GameFramework의 작업(Task) 시스템은 유연한, 우선순위 기반의 비동기 처리 메커니즘을 제공한다. 이 시스템은 리소스 로딩, 파일 다운로드, 웹 요청과 같은 다양한 모듈에서 비차단(non-blocking) 방식으로 작업을 수행할 수 있도록 지원하는 기반 시스템으로, 메인 애플리케이션의 흐름에 영향을 주지 않는다.
이벤트 기반 통신에 대해서는 Event System을, 객체 재사용 전략에 대해서는 Object Pooling을 참고하라.
개요 (Overview)
작업 시스템은 풀(pool) 기반 아키텍처로 설계되었으며, 작업 에이전트(task agent)를 통해 작업 실행을 효율적으로 관리한다.
작업은 우선순위 큐에 정리되며, 우선순위 값이 높은 작업이 먼저 실행된다.
출처:
GameFramework/Base/TaskPool/TaskPool.cs L16-443
핵심 구성 요소 (Core Components)
TaskBase
TaskBase는 시스템 내 모든 작업의 추상 기본 클래스이다.
이는 객체 풀링(Object Pooling)을 위한 IReference 인터페이스를 구현하며, 모든 작업이 공유하는 핵심 속성을 정의한다.
주요 속성:
•
SerialId: 작업의 고유 식별자
•
Tag: 작업 분류를 위한 선택적 문자열 식별자
•
Priority: 숫자 기반의 우선순위 값 (높을수록 우선순위 ↑)
•
UserData: 작업과 연관된 사용자 정의 데이터
•
Done: 작업이 완료되었는지를 나타내는 플래그
출처:
GameFramework/Base/TaskPool/TaskBase.cs L13-137
TaskPool
TaskPool<T>는 작업 시스템의 핵심 구성 요소이다. 이 풀은 다음을 관리한다:
•
Free agents: 사용 가능한 에이전트
•
Working agents: 현재 작업을 처리 중인 에이전트
•
Waiting tasks: 우선순위에 따라 대기 중인 작업
작업 풀은 작업 우선순위 관리, 에이전트 할당, 작업 라이프사이클 관리를 담당한다.
출처:
GameFramework/Base/TaskPool/TaskPool.cs L16-443
ITaskAgent
ITaskAgent<T>는 작업 에이전트의 계약을 정의하는 인터페이스다.
작업 에이전트는 작업 풀에 의해 할당된 작업을 실제로 실행하는 책임을 가진다.
출처:
GameFramework/Base/TaskPool/ITaskAgent.cs L14-53
TaskInfo
TaskInfo는 특정 작업의 정보를 나타내는 구조체이다. 실제 작업 객체에 접근하지 않고도 작업 상태와 세부 정보를 조회할 수 있다.
속성:
•
IsValid: 작업 정보가 유효한지 여부
•
SerialId: 작업의 고유 식별자
•
Tag: 작업 카테고리 식별자
•
Priority: 숫자 기반의 우선순위 값
•
UserData: 사용자 정의 데이터
•
Status: 현재 상태 (Todo, Doing, Done)
•
Description: 작업 설명 문자열
출처:
GameFramework/Base/TaskPool/TaskInfo.cs L16-153
작업 라이프사이클 (Task Lifecycle)
1. 작업 생성 및 추가
작업은 TaskBase를 상속하여 생성되며, TaskPool에 추가된다.
작업이 추가될 때, 우선순위 값에 따라 대기 목록에 삽입된다.
출처:
GameFramework/Base/TaskPool/TaskPool.cs L257-278
2. 작업 실행
업데이트 주기 동안, TaskPool은 실행 중인 작업과 대기 작업을 모두 처리한다.
출처:
GameFramework/Base/TaskPool/TaskPool.cs L96-107, L391-442
3. 작업 완료
작업은 Done 속성을 true로 설정하여 완료됨을 알린다.
작업 풀은 업데이트 주기에서 이를 감지하고, 해당 에이전트를 free pool로 반환한다.
작업 상태 (Task Status)
작업은 TaskStatus 열거형으로 표현되는 세 가지 상태 중 하나에 속한다:
상태 | 설명 |
Todo | 작업이 큐에서 대기 중 |
Doing | 작업이 현재 처리 중 |
Done | 작업이 완료됨 |
또한, 작업 에이전트가 작업 시작 시 반환하는 StartTaskStatus는 즉각적인 시작 결과를 나타낸다:
상태 | 설명 |
CanResume | 작업이 성공적으로 시작되어 이어서 진행 가능 |
HasToWait | 작업이 시작되었으나 대기해야 함 |
Done | 작업이 즉시 완료됨 |
UnknownError | 작업 시작 실패 |
출처:
GameFramework/Base/TaskPool/TaskPool.cs L423-438
구체적인 작업 구현 (Concrete Task Implementations)
프레임워크에는 다음과 같은 특정 목적의 작업 구현이 포함되어 있다:
Download Tasks
DownloadManager에서 파일을 비동기 다운로드하는 데 사용된다.
출처:
GameFramework/Download/DownloadManager.DownloadTask.cs L15-141
Web Request Tasks
WebRequestManager에서 HTTP 요청을 관리하는 데 사용된다.
출처:
GameFramework/WebRequest/WebRequestManager.WebRequestTask.cs L15-119
Resource Loading Tasks
ResourceManager에서 게임 에셋을 로드하고 관리하는 데 사용된다.
출처:
GameFramework/Resource/ResourceManager.ResourceLoader.LoadResourceTaskBase.cs L17-172
작업 시스템 통합 (Task System Integration)
작업 시스템은 프레임워크 내 여러 주요 구성 요소에서 사용된다:
•
TaskPool.cs L16-443
•
DownloadTask.cs L15-141
•
WebRequestTask.cs L15-119
•
LoadResourceTaskBase.cs L17-172
작업 우선순위 (Task Prioritization)
작업이 대기열에 추가될 때, 우선순위 내림차순으로 삽입된다.
따라서 우선순위가 높은 작업이 먼저 실행된다.
출처:
GameFramework/Base/TaskPool/TaskPool.cs L257-278
작업 관리 연산 (Task Management Operations)
작업 시스템은 작업 라이프사이클 동안 다음과 같은 연산을 지원한다:
연산 | 설명 |
AddTask | 작업을 우선순위에 맞게 대기열에 추가 |
RemoveTask | Serial ID로 특정 작업 제거 |
RemoveTasks | 특정 태그를 가진 모든 작업 제거 |
RemoveAllTasks | 시스템의 모든 작업 제거 |
GetTaskInfo | 특정 작업의 정보 조회 |
GetTaskInfos | 특정 태그를 가진 모든 작업의 정보 조회 |
GetAllTaskInfos | 모든 작업의 정보 조회 |
AddAgent | 작업 에이전트를 풀에 추가 |
출처:
GameFramework/Base/TaskPool/TaskPool.cs L142-389