OnlineSystemNull 을 데디 서버에서 사용하는 경우 OnlineAsyncTaskThreadNull 이 돌고 있는데 코드에서 사용하는 곳이 없었다. 엔진 코드를 뜯어 고쳐서 Thread 가 생성되지 않게 할 수도 있지만 설정만으로 cpu 를 덜 사용하게 할 수는 있다.

// FOnlineAsyncTaskManager::Run

do 
{
// Wait for a trigger event to start work
WorkEvent->Wait(PollingInterval);
if (!bRequestingExit)
{
Tick();
}
}

OnlineAsyncTaskThreadNull 은 PollingInterval 마다 sleep 하는 구조다. PollingInterval 의 기본값은 50ms 인데 -1(INFINITI) 값을 주면 Queue 에 작업을 줄 때 까지 Sleep 시킬 수 있다.

// FOnlineAsyncTaskManager::Init

if (GConfig->GetInt(TEXT("OnlineSubsystem"), TEXT("PollingIntervalInMs"), PollingConfig, GEngineIni))
{
PollingInterval = (uint32)PollingConfig;
}

초기화 코드를 보면 Engine.ini 에서 설정 가능하다.

[OnlineSubsystem]
PollingIntervalMs=-1

위와 같은 섹션을 추가 혹은 수정하면 된다. PollingIntervalMs 는 int 로 읽어서 unsigned int 로 변환된다.

bash : if

해본 것/팁과 정보 2019.04.01 00:00 posted by 이밋

학교 졸업하고는 linux 를 써본 적이 없으니 얼마만에 써보는 지 모르겠다. if 문에서 계속 오류가 발생해서 뭔가 싶었는데 공백 문제였다. 

if [ conditions ]

if 다음에 공백 있고 '[', ']' 와 조건 사이에도 공백이 반드시 있어야 하네 -ㅁ-

출처 : https://stackoverflow.com/questions/16034749/if-elif-else-statement-issues-in-bash

UE4 에서 RPC가 구현된 class 는 Actor 와 ActorComponent 로 보입니다. Actor 의 멤버로 UObject 를 상속받은 class 는 RPC 함수들이 있어도 동작하지 않습니다. 

UObject 를 상속받은 클래스에는 IsSupportedForNetworking, IsNameStableForNetworking, CallRemoteFunction, GetFunctionCallspace 구현이 필요합니다.

cf. Outer class 가 APlayerController 라고 가정합니다. 통신이 가능한 Actor 면 상관없습니다.

class UMyObject : public UObject
{

virtual bool IsSupportedForNetworking() const override
{
return true;
}

virtual bool IsNameStableForNetworking() const override
{
return true;
}

virtual bool CallRemoteFunction(UFunction* Function, void* Parameters, FOutParmRec* OutParms, FFrame* Stack) override
{

if (auto MyOwner = GetOuterAPlayerController())
{
UNetDriver* NetDriver = MyOwner->GetNetDriver();
if (NetDriver)
{
NetDriver->ProcessRemoteFunction(MyOwner, Function, Parameters, OutParms, Stack, this);
return true;
}
}
return false;
}

virtual int32 GetFunctionCallspace(UFunction* Function, void* Parameters, FFrame* Stack) override
{
auto MyOwner = GetOuterAPlayerController();
return (MyOwner ? MyOwner->GetFunctionCallspace(Function, Parameters, Stack) : FunctionCallspace::Local);
}

} // UMyObject

추가로 Actor 의 Subobject 는 1단계만 허용되는 것 같습니다.

참고 : https://answers.unrealengine.com/questions/435733/rpc-doesnt-work-on-repicated-uobject.html


git 을 오랜만에 사용하는데 아래와 같은 오류 메시지가 발생했다.

remote: HTTP Basic: Access denied
fatal: Authentication failed for 'https://gitlab.com/myname/myproject'

전에 git 명령어로 설정한 데이터가 있는데 문제를 일으키는 상황같아 보였다. TortoiseGit 에서 Authentication data 를 Clear 해서는 초기화되지 않았다.

인증 관련 데이터를 초기화하기 위해서는 아래와 같이 처리하면 된다.

  • 관리자 권한으로 명령창을 연다.
  • 'git config --system --unset credential.helper' 를 실행한다.
  • global 영역 설정이 문제를 일으킬 수 있으니 'git config --global --unset credential.helper' 를 실행한다. 

출처 : https://stackoverflow.com/questions/47860772/gitlab-remote-http-basic-access-denied-and-fatal-authentication

소프트웨어 kvm 인 Input Director 를 사용하고 있는데 윈도우즈 10 설치 후 slave pc 가 로그인 전에 인식이 안되는 문제가 있었다. 빠른 부팅 모드가 문제를 일으키나 보다.

참고 : https://groups.google.com/forum/#!msg/input-director/Vazvfi1hryg/fYSWqJWVFAAJ

  • '제어판 > 하드웨어 및 소리 > 전원 옵션'에서 '전원 단추 작동 설정' 을 클릭
  • '현재 사용할 수 없는 설정 변경' 클릭
  • '빠른 시작 켜기' 를 체크 해제하니 잘 동작했다.
출처 : https://www.howtogeek.com/243901/the-pros-and-cons-of-windows-10s-fast-startup-mode/


언리얼 기본 옵션은 1파일로 데이터와 설정 파일이 패킹된다. 프로젝트가 커지면 수십 GB가 되기도 한다. 원활한 패치/배포를 위해 파일을 적당히 분리할 필요가 있다.

UE4는 Chunk 를 이용해 패킹 데이터를 분리할 수 있다. 특정 폴더만 분리하고 싶다면 먼저 특정 폴더에 PrimaryAssetLabel 클래스의 데이터 애셋을 생성한다.

애셋 이름은 다른 PrimaryAssetLabel 애셋과 겹치지 않아야 한다.

Chunk ID 를 겹치지 않게 1 이상의 값으로 설정하고 Label Assets in My Directory를 체크한다. Label Assets in My Directory 를 체크하면 애셋이 위치한 폴더 아래 폴더까지 한 Chunk 로 묶인다. 특정 애셋이나 특정 블루프린트 기준으로 묶을 수도 있다.

그리고 패키지 세팅에서 Packaging > Generate Chunks 를 체크한다.

패키징을 하면 해당 폴더의 데이터가 chunk0 pak 파일로 분리된 것을 확인할 수 있다. 설정하지 않은 나머지 파일은 0 파일로 패킹된다.

현재 프로젝트의 chunk 설정을 확인하고 싶으면 개발자 툴 > 애셋 검토 창을 이용하면 된다.

프라이머리 애셋 타입 추가 버튼을 누르면 목록이 아래에 나타난다.

Chunk 는 쿠킹 전에는 보이지 않는다. Windows 용 콘텐츠 쿠킹을 하거나 실제 패키징을 하면 청크 추가 버튼을 눌러 Chunk 목록을 대략적으로 확인할 수 있다. 

만약 갱신되지 않으면 에디터를 재시작하면 제대로 보이기도 한다. 

엔진 : 4.20.3

참고 : http://api.unrealengine.com/KOR/Engine/Basics/AssetsAndPackages/AssetManagement/CookingAndChunking/index.html

윈도우즈 10 에서 플러그인이나 젠킨스 업데이트 후 재기동이 안되는 문제가 있다. 아래 그룹 설정 활성화가 필요하다.

1. gpedit.msc 를 실행해 로컬 그룹 정책 편집기를 엽니다.

2. '로컬 컴퓨터 정책 > 컴퓨터 구성 > 관리 템플릿 > 시스템 > 사용자 프로필 > 사용자 로그오프 시 사용자 레지스트리를 강제로 언로드하지 않음' 을 사용으로 바꿉니다.

출처 : https://issues.jenkins-ci.org/browse/JENKINS-50219

P.S. 윈도우즈 8 이후로는 그룹 정책 편집기가 기본적으로 설치되지 않을 수 있다. 아래 URL 을 참고해서 설치하자.

https://www.technipages.com/windows-install-group-policy-management-console

UE4 : UCLASS - Within

해본 것/팁과 정보 2018.12.18 00:00 posted by 이밋

UCLASS(Within=PlayerController, config=Input, transient)
class ENGINE_API UPlayerInput : public UObject
{
GENERATED_BODY()


UCLASS 에 Within 이라는 키워드가 있다. 이 클래스를 생성, 보유할 수 있는 클래스를 제한하는 지정자다.

void UPlayerInput::FlushPressedKeys()
{
APlayerController* PlayerController = GetOuterAPlayerController();


GetOuterAPlayerController() 함수 구현이 궁금해서 헤더 파일을 다 뒤져봤지만 찾을 수가 없어서 차이점을 검색해보다 발견하게 되었다.

DECLARE_WITHIN(APlayerController)

Within 지정자를 사용하면 자동생성되는 코드에 위와 같은 매크로가 추가된다.

#define DECLARE_WITHIN_INTERNAL( TWithinClass, bCanUseOnCDO ) \
/** The required type of this object's outer ({{ typedef-type }}) */ \
typedef class TWithinClass WithinClass;  \
TWithinClass* GetOuter##TWithinClass() const { return (ensure(bCanUseOnCDO || !HasAnyFlags(RF_ClassDefaultObject)) ? (TWithinClass*)GetOuter() : nullptr); }


#define DECLARE_WITHIN( TWithinClass ) \
DECLARE_WITHIN_INTERNAL( TWithinClass, false )

위와 같은 매크로로 GetOuterAPlayerController 코드가 추가되는 구조였다.

참고 : [UE4]  클래스 및 UCLASS 주요 지정자

애셋이나 모듈 정리하다 보면 특정 클래스를 상속받은 BP 클래스를 찾고 싶을 경우가 있다. BP 클래스의 경우 레퍼런스 뷰어로 찾을 수 있는데 상속받은 부모가 네이티브 클래스일 경우 난감했다.

블루프린트 전체 찾기를 하다보면 검색어 문법이 있을 것 같았다. Content Browser > Advanced Search Syntax 에 따르면 아래와 같은 식으로 ParentClass 를 가진 객체를 검색할 수 있었다.

ParentClass:[ParentClass 이름]

예를 들어 아래와 같이 Actor 클래스를 상속받은 애셋들을 찾고 싶을 때 Type:Actor 라고 치면 안보인다.

ParentClass:Actor 라고 입력해야 보인다.

Detail 정보는 모두 필터로 사용할 수 있는 것 같다. AND, OR 같은 연산자도 지원한다.

지난 번에 애셋 정리할 때 알았으면 더 쉽게 처리할 수 있었을텐데 :)

출처 : https://docs.unrealengine.com/en-us/Editor/Content/Browser/AdvancedSearchSyntax

엔진버전 : 4.20.3

명령창에서 'slmgr /dlv' 입력 후 제품 키 채널 내용을 확인하면 된다.

출처 : http://damoa-nawa.tistory.com/100