Google Cloud Platform

SnackLabChat 프로젝트 생성

DedicatedServer용 VM 인스턴스(가상서버) 생성

ssh key 생성 PuttyGen 을 사용.

메타데이터 > SSH 키 > “수정” 버튼 클릭 후 PuttyGen 에서 생성한 PublicKey 를 등록.

WinSCP 를 이용. 서버접속 완료.

4.20.3 소스 버전으로 fps example 데디케이티드 서버 테스트 빌드

WinSCP 로 구글 클라우드 의 VM에 접속된 상태.

ThirdPerson sample 프로젝트 리눅스 서버 빌드 및 서버에 실행

언리얼 엔진 사용시 include Windows.h 선언시 TEXT 매크로 충돌.

 

Waring 메세지

1>C:\Program Files (x86)\Windows Kits\8.1\include\um\winnt.h(536): warning C4005: 'TEXT': macro redefinition
1>  c:\program files\epic games\ue_4.19\engine\source\runtime\core\public\HAL/Platform.h(854): note: see previous definition of 'TEXT'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\winnt.h(17005): warning C4668: '_APISET_RTLSUPPORT_VER' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\winnt.h(536): warning C4005: 'TEXT': macro redefinition
1>  c:\program files\epic games\ue_4.19\engine\source\runtime\core\public\HAL/Platform.h(854): note: see previous definition of 'TEXT'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\interlockedapi.h(73): warning C4668: '_APISET_INTERLOCKED_VER' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\winnt.h(17005): warning C4668: '_APISET_RTLSUPPORT_VER' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\processthreadsapi.h(1170): warning C4668: '_WIN32_WINNT_WINTHRESHOLD' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\securitybaseapi.h(357): warning C4668: '_APISET_SECURITYBASE_VER' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\securitybaseapi.h(472): warning C4668: '_APISET_SECURITYBASE_VER' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\securitybaseapi.h(1302): warning C4668: '_APISET_SECURITYBASE_VER' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\interlockedapi.h(73): warning C4668: '_APISET_INTERLOCKED_VER' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\processthreadsapi.h(1170): warning C4668: '_WIN32_WINNT_WINTHRESHOLD' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\winbase.h(8618): warning C4668: 'NTDDI_WIN7SP1' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\securitybaseapi.h(357): warning C4668: '_APISET_SECURITYBASE_VER' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\securitybaseapi.h(472): warning C4668: '_APISET_SECURITYBASE_VER' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\securitybaseapi.h(1302): warning C4668: '_APISET_SECURITYBASE_VER' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
1>C:\Program Files (x86)\Windows Kits\8.1\include\um\winbase.h(8618): warning C4668: 'NTDDI_WIN7SP1' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'

Warning 안뜨게 하기.

// 언리얼 엔진에서도 Windows.h를 사용 하기때문에 TEXT 메크로 및 관련 부분의 처리를 PreWindowsApi.h 를 통해서 처리 하고 있었음.
// 그러므로 Windows.h 를 include 하는 부분의 상단에 PreWindowsApi.h 를 include 선언 해서 사용 하면 Waring을 안 볼 수 있다.
#include "PreWindowsApi.h" // winnt.h(536): warning C4005: 'TEXT': macro redefinition
#include 

[UE4] ImposterBaker + HLOD 적용

Imposter Baker

3D오브젝트를 평면, 반원, 구의 형태로 캡쳐 하여 스프라이트 형식의 텍스쳐를 생성 하여 기존의 단순한 2D 기반의 빌보드의 형태 ( 트레디셔널 방식 ) 에서 부터 3D 처럼 생긴 빌보드 ( 옥타헤드럴 방식 ) 의 기능을 제공.

기존의 빌보드는 단순히 랜더링하는 오브젝트를 바라보는 수준이었지만, 임포스터베이커는 진화한 형태의 빌보드라 할 수 있다.

HLOD  – Hierarchical Level of Detail

HLOD는 월드에 배치 되어있는 오브젝트를 (보통은 카메라의) 거리에 따라 디테일을 틀리게 설정해주는 기법. 멀리있을때는 낮은 디테일의 리소스로 가까이 있어서 자세히 봐야 할때는 높은 디테일의 리소스 ( 메시, 텍스쳐, 그림자, 라이트 등) 로 변경.

거리별 mesh actor 들을 하나로 묶어서 드로우 콜을 줄여주는 등의 기능을 간단한 설정으로 최적화를 할수 있도록 도와주는 기능이다.

장점

이 두가지를 섞어서 사용하면 매우 많은 드로우콜과 메시들의 트라이앵글수를 감소 시킬 수 있으며, 더불어 메시 액터들의 LOD 로우폴리로 설정한 메시들 보다 (훨씬) 더 나은 디테일을 가져 갈 수도 있다.

자세한 내용은 아래의 유튜브 링크를 통해 확인.

프로젝트 테스트하면서 확인 된 이슈들

언리얼엔진 4.19 에서는 임포스터 베이커는 적용이 되지만, 임포스터 베이커를 적용시킨 액터를 HLOD 와 같이 사용 하는것은 안된다.

  • Actor 의 HLOD 항목중에 “Use MaxLOD as Imposter” 항목이 엔진에 적용이 되어 있지 않기 때문에, 임포스터가 적용된 액터들을 HLOD 의 프록시 메시로 생성 시, 임포스터가 적용된 오브젝트가 보이는것이 아니고 떨렁 매시 한조각만 보이게 되는것을 확인 할 수 있다.

언리얼엔진 4.20  사용시 임포스터베이커를 사용시 블루프린트의 노드를 수정해야한다.

  • “BP_Generate_ImposterSprites” 블루프린트를 열어보면, Construction Script 안의 Scene Capture Setup 항목 에서SceneCaptureComponent2D 의 StaticMeshActor 변수를 초기화 부분을 보면, 기전에는 그냥 변수를 끌어와서 거기다가 배열을 생성해서 넣게 되어 있는데, 이 부분이 엔진 버전업이 되면서, Array에서 제공하는 SetElem 함수로 액터를 넣게 변경이 되었다.
  • 특정 조건에서 “Use MaxLOD as Imposter” 항목이 체크 되었을때 0을 나누기 했다는 에러 메세지와 함께 에디터가 종료되는 증상이 있어서 확인 중.

테스트 중인 영상과 사용방법에 대한 이슈

배경 어셋들을 임포스터화 시킨다음에 HLOD 로 묶어서 사용 하는 것으로 생각 하고 있었지만, 그게 아니고 HLOD로 만들어진 클러스터의 오브젝트 들에 대한 것들을 임포스터 화 해서 사용하는 것 같다. 현재 아래의 영상은 HLOD로 클러스터로 묶어서 나온 액터들을 임포스터 화 해서 빌드 한후 드로우 콜과 트라이앵글 수를 체크해 보았다. 만약 이런 방식이라면 관리 와 수정등등이 매우 복잡해서 쓰기가 꺼려질것 같은데, 좀더 체크 해 보아야 할 듯 하다.

  • 드로우콜 수
  • 트라이앵글 수

다음목표

    1. 캐릭터와 에니메이션에 관련된 최적화에 대한 고민
    2. 그외의 최적화에 관련된 고민

유튜브링크 : 옥타헤드럴 임포스터 & HLOD 섹션 부터 시작 – 포트나이트 모바일 아트 최적화

임포스터 및 HLOD 설정 가이드

  • 사용엔진버전 : 언리얼 4.20.2 버전
  • 사용플러그인 : 임포스터 베이커

숏코딩 분석

프로그래머스> [Level1] 두정수 사이의 합 문제를 작성 후

다른 사람은 어떻게 풀었는지 궁금해져서 다른 사람들의 풀이를 확인 하는 곳으로 이동하여, 가장 처음의 풀이의 조건처리 하는 부분을 보았더니 단 2줄.. 처음엔 이게 뭔가..

  1. 뚫어지게 보고,
  2. 비트연산 해보고,
  3. 팀장 아저씨한테 물어보고,
  4. 숏코딩 코드를 분리해 본 후.

숏코딩이 뭔지 찾아보니.. 가독성과 효율은 다 필요없고, 그냥 짧은 타이핑(…)을 목적으로 하고 있었네요. 덕분에 흥미가 자극되어져서 재밋게 문제를 풀어 보았습니다.

  • 문제 설명
    • 두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
  • 제한 조건
    • a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
    • a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
    • a와 b의 대소관계는 정해져있지 않습니다.
#include vector

using namespace std;

long long solution(int a, int b)
{
    long long answer = 0;
    if (a > b) a ^= b ^= a ^= b;
    answer = (long long)b * -~b / 2 - (long long)a * ~-a / 2;
    return answer;
}

계속 읽기 “숏코딩 분석”

[Level1] 연속된 같은 숫자 제거

프로그래머스> [Level1] 같은 숫자는 싫어

#include vector

using namespace std;

vector solution(vector arr)
{
    vector answer;

    int prev = arr[0];
    answer.push_back(arr[0]);

    for (int i = 1; i  제네릭 unique 알고리즘을 이용 중복값 제거"]
#include vector
#include algorithm
#include iostream
#include iterator

using namespace std;

vector solution(vector arr)
{
    vector answer = arr;

    // 문제가 쏘팅 안해도 되는거네.
    //sort(answer.begin(), answer.end());

    // 중복 제거.
    vector::iterator newIntVector;
    newIntVector = unique(answer.begin(), answer.end());

    // 끝부분을 제거.
    answer.erase(newIntVector, answer.end());

    return answer;
}

Git 원격저장소에 Push 후 GitLab CI Runner 를 통한 빌드 자동화

“Git 원격 레포지토리 설정 및 SourceTree 를 사용하여 UE4 프로젝트 Push” 포스팅 에서 사용한 샘플 프로젝트 – Example.7z 안 의 .gitlab-ci.yml 은 GitLab CI 의설정 파일이고, 열어보면 설정된 러너태그인 “windowbuildpc” 일 때만 GitLab CI Pipeline의 Job이 실행 되도록 설정이 되어 있다.

다음목표

  1. GitLab 공식 사이트에서 CI 설정 하는 방법 추가.
    1. 공식 사이트의 GitLab CI 샘플 원격 레포지토리 링크
  2. CI 설정을 원하는 테스트 및 자동화된 배포 환경을 구성.
  3. .gitlab-ci.yml 설정법에 대한 깊은 이해.

GitLab Runner 설정 및 CI 설정 법

계속 읽기 “Git 원격저장소에 Push 후 GitLab CI Runner 를 통한 빌드 자동화”

Git 원격 레포지토리 설정 및 SourceTree 를 사용하여 UE4 프로젝트 Push

git을 사용할때 대표적이고 편한 툴로 ‘SourceTree’ 를 꼽을 수 있으니, 깃 클라이언트 툴은 정했고 이걸 이용해서 원격 레포지토리에 연동을 해놓은 뒤 기존에 만들어 놓은 언리얼 프로젝트를 Push 하는 방식으로 진행.

다음목표

  1. Git 원격저장소에 Push 후 GitLab CI pipeline 을 통한 빌드 자동화 – 완료

원격 레포지토리의 설정 및 프로젝트의 Push 가이드

  • 언리얼샘플프로젝트(4.19.2) 파일 링크 : Example.7z

계속 읽기 “Git 원격 레포지토리 설정 및 SourceTree 를 사용하여 UE4 프로젝트 Push”