본문 바로가기

분류 전체보기

(57)
자체 게임 엔진 개발하기 (HopStep Engine) 게임 클라이언트 프로그래머로서, 자체 게임 엔진을 개발하는 것은 언제나 상상하던 일이 아닐까 싶다. 특히 언리얼 엔진을 사용하다보면 코드의 내부까지 모두 확인이 가능하다보니 "나도 해볼 수 있지 않을까?"하는 생각이 들게 된다. 물론 만들다보면 그리 긴 시간이 지나지 않아 그 생각이 틀렸다는 것은 알게 된다. 마침 POE 시즌도 끝냈고, 회사 내부의 세미나도 준비해두어야 할 것 같아서 쉬는 시간에 짬짬이 자체 게임 엔진을 개발중이다. 이름은 작은 규모의 개발을 경쾌하게 하자! 라는 의미로 HopStep 엔진이라고 지었다. https://github.com/highfence/HopStep GitHub - highfence/HopStep Contribute to highfence/HopStep develop..
Unreal의 스레드와 단일 스레드로 실행시키기 (-norenderthread) 언리얼은 두 개의 메인 스레드로 돌고 있는데, 하나는 우리가 아는 게임 스레드이고 나머지 하나는 한 틱 뒤에서 이 게임스레드를 뒤쫓고 있는 렌더 스레드이다. 게임 스레드가 월드의 변경점을 렌더 스레드에 반영시키기 위해서는 ENQUEUE_RENDER_THREAD라는 매크로를 통해 람다 함수로 이를 렌더 큐에 쌓아두는 방식으로 접근한다. void BeginInitResource(FRenderResource* Resource) { ENQUEUE_RENDER_COMMAND(InitCommand)( [Resource](FRHICommandListImmediate& RHICmdList) { Resource->InitResource(); }); } RenderResource.cpp에 정의되어있는 BeginInitRe..
UE4 -waitforattach int32 GuardedMain(const TCHAR* CmdLine) { #if !(UE_BULID_SHIPPING) if (FParse::Param(CmdLine, TEXT("waitforattach")) { while (!FPlatformMisc::IsDebuggerPresent()); UE_DEBUG_BREAK(); } #endif ... } 언리얼을 실행시킬 경우, 실행인자로 -waitforattach라는 파라미터를 넣어줄 수 있다. 파라미터 이름에서 쉽게 유추 가능한 기능인데, 해당 파라미터를 넣으면 언리얼은 엔진 실행을 wait하며 디버거가 붙기를 기다려 준다. 디버거가 붙었다면, UE_DEBUG_BREAK를 이용하여 디버거에 신호를 준다. 쿠킹 로직을 따라가보고 싶은 경우에 사용하면 상당히..
11.30 friends function Friend Functions in C++ | Use of Friend Function in C++ with Examples (mygreatlearning.com) Friend Functions in C++ | Use of Friend Function in C++ with Examples Friend Functions in C++: A friend function in C++ is defined as a function that can access private, protected, and public members of a class. www.mygreatlearning.com 언리얼의 FArchive 쪽을 보다가 friend 키워드가 function에 붙는 것을 보았다. 훑어보니 friend clas..
JetBrains의 새로운 IDE : Fleet JetBrains Fleet: 차세대 JetBrains IDE JetBrains Fleet: 차세대 JetBrains IDE www.jetbrains.com JetBrains에서 가벼운 에디터를 목표로 새로운 IDE를 출시했다. VS Code와 같은 포지션이라고 생각할 수 있을 것 같다. 리모트 실행이나 실시간 피어 프로그래밍 지원 같은 피쳐에 힘을 싣고 있는 것 같다. 현재는 오픈되어있지 않고, 테스트 참여 지원만 가능한 상황이다.
[Python] Slack sdk를 이용해서 Slack 메시지 보내기 from typing import Optional from slack_sdk import WebClient from slack_sdk.errors import SlackApiError class SlackNotifier: __latest_thread_identifier: float = None def __init__(self, token): try: self.__client = WebClient(token) except Exception as e: print(f"Slack notifier got an error : {e}") def notify(self, header_blocks: [str], show_msg: str, channel: str) -> bool: if not self.__client: re..
GetTypeHash의 구현 size_t GetTypeHash() const { static size_t UniquePointer; return reinterpret_cast(&UniquePointer); } 타입마다 스태틱 변수를 선언하고 이 값의 주소값을 반환하는 방식으로 짜여져 있다. FPrimitiveSceneProxy에 순수가상함수로 선언되어있어 구현 클래스에서 이를 구현해주어야 한다. 예제 코드 #include #define DECLARE_TYPEHASH \ size_t GetTypeHash() const \ { \ static size_t UniquePointer; \ return reinterpret_cast(&UniquePointer); \ } class A { public: DECLARE_TYPEHASH }; cl..
Rider의 Delegate subtractions warning public sealed class SomeViewClass { public void BindEvent() { GetModel()?.UpdateEvent += OnModelUpdated; } public void ReleaseEvent() { GetModel()?.UpdateEvent -= OnModelUpdated; } } 위와 같이 코드를 짜면 ReleaseEvent 부분에서 Rider의 경고가 뜬다. Delegate subtraction을 주의하라는 경고인데, 이게 왜 주의해야할 대상인지 몰라 Rider 도큐먼트를 찾아보았다. 찾아본 결과 당연히 저런식으로 사용하는 것 자체는 문제가 없고, Rider에서 경고하고 싶었던 것은 delegate subtraction에서 발생할 수 있는 미묘한 문제들이었..