[UE5] 언리얼의 Multi-threading
·
게임개발/Unreal Engine
게임 개발을 하다보면 성능 최적화는 피할 수 없는 문제다.대부분의 작업이 메인 스레드에서 돌아갈 때, 이를 여러 쓰레드에 병렬로 부담을 분산시키면 많은 최적화를 이뤄낼 수 있다.게임 개발에서 중요한 언리얼 엔진 5의 멀티스레딩 시스템에 대해 정리해보려 한다. 1. Multi-threading이란? 멀티스레딩은 프로세스 내에서 여러 실행 흐름을 만들어 CPU 자원을 최대한 활용하는 기술이다.메인 스레드(Game Thread)의 부하를 분산해서 여러 코어에서 동시에 연산을 수행한다.물리적으로 여러 코어에서 동시에 작업을 처리할 수 있다하지만 스레드 생성과 컨텍스트 스위칭에도 비용이 든다작업 단위가 너무 작으면 오히려 단일 스레드보다 느려질 수 있다 2. 동기화 프리미티브멀티스레드 환경에서 여러 스레드가 같은..
[C++] const 정리 (+constexpr이란?)
·
언어/C,C++
C++ 코딩을 하다보면 안전성을 위해 쓰이는 코드가 있다. 값이 바뀌지 않으며 고정되는 상수로 만드는 키워드, 바로 const다 const는 보통 변수 이름 앞에 쓰여 해당 변수의 값을 바꿀 수 없게 만들어준다.const float FRAME_RATE = 60f; 단순하게 쓰면 저정도이지만, const는 함수와 포인터 등 다양한 곳에 쓰일 수 있다. 오늘은 const와 C++11부터 도입된 constexpr에 대해 자세히 알아보자. 1. 함수의 반환 타입 앞에 붙는 constconst [type] Function()가장 기본적인 형태로, 함수의 반환값(Return Value)을 상수로 만들겠다는 의미다.const int GetSomeValue() { return 10;}// 사실 기본 자료형(int..
[Unity] Debug.Log 커스터마이징
·
게임개발/Unity
유니티에서 가장 자주 쓰이는 함수가 뭘까? 개인적으로는 Debug.Log가 아닐까 생각한다.코드가 잘 돌아가는지, 값이 올바른지 등을 확인하기 위해 보통 Debug.Log로 메세지를 출력한다.Debug 종류는 Log, LogWarning, LogError 3가지로 각 상황에 따라 적절하게 사용한다. 그런데 이 Debug.Log에 내가 원하는 방식으로 수정할 수 있으면 좋지 않을까?예를 들어, Debug.Log를 호출한 클래스의 이름을 자동으로 메세지에 넣어 출력하게 해준다거나 Editor에서만 Debug.Log를 호출하도록 바꾸는 등 말이다. 1. 호출한 클래스 출력하기어떤 함수를 호출했을 때 해당 클래스의 이름을 출력하는 방법에는 여러가지가 있다.가장 간단한 방법은 호출하는 함수에서 this.Get..
[Unity] 안쓰는 함수 멋지게 표현하기 (System.Obsolete)
·
게임개발/Unity
Unity 뿐만 아니라 다른 모든 프로그래밍에서 함수나 클래스를 만들었다가 버리는 경우가 흔하다.보통 주석처리 하거나 아예 지워버리긴 하지만, 다른 사람들과 협업할 때 무작정 없애면 혼란이 생길 수가 있다.또한 이전 버전을 사용하는 사람에게 새로운 함수나 클래스로 변경하라는 메세지가 필요할 때도 있다. 이를 위해 Unity에서는 더 이상 사용하지 않는 함수나 클래스에 Obsolete 키워드를 넣어 해당 함수나 클래스가 더 이상 권장되지 않음을 표시할 수 있다. 0. System.ObsoleteObsolete 키워드는 선언 바로 윗 부분에 [System.Obsolete]를 적어 적용할 수 있다. 형태는 총 3가지가 존재한다.[System.Obsolete]: 기본 형태. 해당 메서드나 클래스가 권장되지 않음..
[Unity] NetworkVariable, INetworkSerializable Synchronization Problem
·
게임개발/Unity
유니티에서 넷코드는 멀티플레이 관련 기능을 제공하는 유용한 API다. 하지만, 그만큼 사용하기 어려우며 문제가 생기는 순간 디버깅 지옥이 펼쳐진다. 최근 NewtorkVariable과 INetworkSerializable을 사용해 변수 동기화를 진행하는데, 클라와 서버 간의 데이터가 동기화되지 않는 문제가 발생하였다. NetworkVariable의 ReadPermission을 Owner로 설정하고 NetworkSerialize 인터페이스 함수를 철저히 구현했는데도 도저히 동기화는 되지 않았다.//... in Test.csNetworkVariable testNet = new NetworkVariable(new TestNetClass(), NetworkVariableWritePermission.Everyon..
[Unity] StopCoroutine, 코루틴 중지시키기
·
게임개발/Unity
Unity의 코루틴은 비동기 처리를 위해 자주 사용된다. StartCoroutine을 통해 실행하면 유니티에서 알아서 비동기로 해준다.물론 코루틴은 메인 스레드에서 돌아가며, 멀티 스레딩이 아니라는 점을 유의해야한다. 자세한 내용은 #1, #2StartCoroutine(Susume()); 그런데, 실행한 코루틴을 다시 중지하려면 어떻게 해야할까? 1. StopCoroutine from inside먼저, 코루틴 내부에서 탈출하는 방법이 있다. 코루틴 함수에서 yield break를 하게 되면 함수에서 return하는 것과 같이 바로 빠져나올 수가 있다.IEnumerator CoroutineTest(){ while (true) { yield break; // 코루틴 종료 }}2. St..