Skip to content
This repository was archived by the owner on Jul 12, 2022. It is now read-only.

PresentationManager

Syadeu edited this page Oct 21, 2021 · 14 revisions

Namespace: Syadeu.Presentation
File: PresentationManager.cs

[StaticManagerIntializeOnLoad]
public sealed class PresentationManager : StaticDataManager<PresentationManager>

Presentation 시스템의 시동 객체입니다.

Inheritance: StaticDataManager<T> -> PresentationManager

Overview

  • 게임을 보다 효과적인 방법으로 설계하기 위해 새로이 탄생한 시스템입니다.

Remarks

Presentation 시스템은 별도의 Simulation 이 존재하지 않습니다. Unity에서 이미 Simluate 된 결과를 사용하여 게임에 보다 더 효과적으로 보여주기 위한 용도이지, 물리 연산과 같은 높은 레벨의 연산을 처리하도록 디자인되지 않았습니다.

Description

UnityEngine 은 OOP (Object Oriented Programing) 으로, GameObject 하나하나가 각각의 독립성을 가지도록 설계되었습니다. 같은 기능을 공유하여도 객체 지향이라는 설계로 인해 중복 연산등의 불필요한 연산 작업을 하는 특성상, 오브젝트의 개수가 많아질 수록 전체 시스템 성능이 비례하여 낮아지게되는 단점을 가지고 있습니다.

Presentation 시스템은 새로운 방법을 제시합니다. OOP 와 DOP (Data Oriented Programing) 를 절반씩 섞은 방식으로, UnityEngine 의 코어는 그대로 사용하되, 사용한 UnityEngine 의 모든 객체를 재사용하도록하고, 동일한 연산은 한번에 수행하도록 말이죠.

GameObjectProxySystem (이하 프록시 시스템)과 RecycleableMonobehaviour 는 이러한 설계 철학에 따릅니다. Proxy pattern 으로 EntitySystem 을 통해 생성된 모든 UnityEngine.Object 들을 재사용하도록합니다. 프록시 시스템은 완전한 DOP 설계 철학을 따르며 (프록시 데이터는 전부 NativeProxyData 내부 배열의 ProxyTransformData 형태로 저장됩니다), UnityEngine 과 EntitySystem 의 연결을 보장해주는 역할을 합니다. 또한, 모든 데이터 연산은 필요할 때에만 실행되며, Unity.Jobs, Burst 컴파일러를 통해 병렬 연산처리되어 결과값만 Unity 스레드에서 처리함으로서 성능을 극대화하였습니다.

프록시 시스템 내부에서는 RenderSystem 과 연결되어 화면상에 해당 Entity<T> 가 보여지고 있는지 여부를 체크하여 프록시가 필요한지 아닌지를 판단하고, 자동으로 해당 Entity 에 프록시를 할당합니다. 사용자가 프록시를 컨트롤할 수 있도록 일종의 ID 인 ProxyTransform 을 반환합니다. 프록시 시스템은 매우 큰 데이터 chunk(50만+ 의 객체) 를 처리할 수 있도록 설계되었기에 각 프록시들을 Cluster analysis, 클러스터 분석 중 partitioning 을 사용한 Cluster<T> 를 사용하여 정렬합니다.

아래는 Presentation System 의 Flow 를 다이어그램으로 설명합니다.

PresentationManager 는 각 PresentationSystemGroup<T> 에 대해 CoreSystem 의 Background 스레드로 연속적인 동기 작업을 수행합니다. 각 스레드의 현재 단계에 맞춰서 가장 느리게 완료되는 스레드에 맞춰 기다렸다가 다음 단계를 실행합니다. 예를 들어, OnPresentation() 과 OnPresentationAsync() 작업은 동시에 시작하고, 두 작업이 모두 끝날때까지 기다린 후 다음 단계인 AfterPresentation(), AfterPresentationAsync() 을 동시에 시작합니다. Presentation 시스템은 얼마나 효율적으로 작업을 3단계에 걸쳐 분산한 작업을 하느냐에 초점이 맞춰져있습니다. Unity.Jobs 와 같이 비동기 연산을 실행하고, 다음 사이클의 같은 지점전에 완료할 수 있도록 작업을 분산하여야 할 것 입니다. PresentationManager 는 지정한 위치에 도달할때까지 해당 작업을 완료하지 못하면 Unity 스레드의 자원으로 작업을 완료합니다(Unity.Jobs.JobHandle.Complete() 를 참조하세요). 시스템 내에서 Unity.Jobs 를 사용하는 방법은 PresentationSystemEntity<T> 를 참조하세요.

Examples

사용자가 PresentationManager 로 직접 시스템에 간섭하는 방법은 없습니다. PresentationSystem<T>, PresentationSystemGroup<T> 을 참조하세요.


Internal Static Methods

Name Description
RegisterSystem(Type, SceneReference, param Type[]) 시스템을 등록합니다.
RegisterRequestSystem<T, TA>(Action<TA>) PresentationSystemEntity<T> 에서 요청한 RequestSystem<TA>(System.Action<TA>) 의 작업을 수행합니다.

Internal Methods

Name Description
StartPresentation(Hash) 해당 그룹을 실행합니다.
StopPresentation(Hash) 해당 그룹을 정지합니다.
- Interfaces
- Enums
- Attributes
- Abstract Classes
- Classes
- Structs
- Exceptions

- Syadeu.Presentation
- Syadeu.Collections
- Syadeu.Collections.Converters
- Syadeu.Collections.Proxy
- Syadeu.Presentation.Proxy
- Syadeu.Presentation.Internal
- Syadeu.Presentation.Entities
- Syadeu.Presentation.Attributes
- Syadeu.Presentation.Components
- Syadeu.Presentation.Actions
- Syadeu.Presentation.Render
  • CameraData
  • CameraFrustum
  • IntersectionType
  • RenderSystem
  • WorldCanvasSystem
- Syadeu.Presentation.Data
  • DataContainerSystem
  • DataObjectBase
  • EntityAnimationClipEventData
- Syadeu.Presentation.Events

Clone this wiki locally