퍼포스에서 sync나 submit 작업 시 멀티 스레드로 동시에 여러 파일을 전송하면 성능을 향상할 수 있다.

 

해당 기능을 적용하려면 퍼포스 관리자 권한이 있어야 한다.

관리자라면 퍼포스 서버에 직접 들어갈 필요 없이 본인 PC에서 원격으로 설정할 수 있다.

 

먼저, 콘솔창을 연다.

현재 서버에 설정된 값을 보는 방법은 다음과 같다.

p4 configure show

 

서버의 병렬처리 기능을 켜고 싶다면 다음의 명령어를 쓰면 된다. (숫자는 스레드 개수인데 1보다 커야 한다)

p4 configure set net.parallel.max=4

참고로, 서버를 재시작할 필요 없이 바로 적용된다.

 

서버에 위의 옵션을 켜 놓으면 클라에서는 바로 멀티 스레드를 활용할 수 있다.

예를 들어 다음과 같이 사용하면 된다.

p4 sync --parallel=threads=4 ...
p4 submit --parallel=threads=4 ...

 

만약, 모든 클라에 기본으로 병렬 sync 옵션을 적용하고 싶으면, 다음의 변수를 추가로 설정하면 된다.

p4 configure set net.parallel.threads=4

 

submit에 대해서도 모든 클라에 기본으로 적용하고 싶으면, 다음의 변수를 설정하면 된다.

p4 configure set net.parallel.submit.threads=4

 

위의 모든 옵션을 적용했을 때 설정값은 다음과 같다. (p4 configure show 명령어 사용)

 

설정된 변수를 지우고 싶으면 unset 옵션을 써서 삭제하면 된다.

p4 configure unset net.parallel.max
p4 configure unset net.parallel.threads
p4 configure unset net.parallel.submit.threads

 

참고로 퍼포스 클라이언트 UI(p4v)에서는 병렬 서밋 옵션은 기본적으론 꺼져 있다.

 

참고 링크:

https://www.perforce.com/manuals/cmdref/Content/CmdRef/p4_sync.html#Parallel

 

p4 sync

p4 sync Copy the latest revision of all files from the depot to the client workspace, as mapped through the client view. If the file is already open in the client workspace, or if the latest revision of the file exists in the client workspace, it is not co

www.perforce.com

 

ps. 병렬처리 옵션을 켠다고 다 좋은 건 아니다. 싱글 스레드 방식의 p4v에서 sync 시에는 읽기 전용 속성이 풀린 파일을 찾아내 강제로 받을 것인가를 물어보는 팝업이 뜨지만, 병렬처리 시에는 이게 작동하지 않을 수 있다. 또, 많은 사람이 동시에 sync를 받으면 서버에 과부하가 걸리기도 한다.

서밋을 할 때도 여러 사람이 동시에 많은 파일을 서밋 하면 서버가 멈추는 경우가 생길 수 있다.

 

ps. 사실, 이런저런 문제점들 때문에 net.parallel.max 옵션만 설정하고, 빌드서버에서만 --parallel=threads 옵션을 넣어서 사용 중이다. 바이너리 파일을 서밋 할 때 zip으로 압축을 하는데, 멀티 스레드를 사용하지 않으면 많이 느리다.

보안 이슈 등으로 인해 젠킨스 플러그인들에 대한 업데이트가 필요하다는 경고가 떴다.

젠킨스 플러그인 들을 업데이트를 하려고 하니 에러가 난다.

 

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

대략 위와 같은 에러이다.

 

해결책 1.

젠킨스 관리의 플러그인 관리 페이지로 들어간다.

"고급" 탭을 누른다.

https를 http로 바꿔보자

업데이트 사이트에서 프로토콜이 https로 시작하고 있다면, http로 바꾼다.

Submit을 눌러서 적용한다.

 

그런데, 본인의 젠킨스는 위의 방법을 적용했더니, 플러그인이 한번에 딱 하나만 받아지는 문제가 발생했다.

하나 받고 재부팅하고, 하나 받고 재부팅하는 식으로 계속 반복을 해줘야 했다.

처음 하나만 받아진다. 매번 재부팅 필요

에러 내용도 처음에 얘기했던 것과 같은 인증 문제이다.

 

한참 구글링을 하다가 아래의 사이트에서 방법을 찾았다.

https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/SunCertPathBuilderException-fix-for-Jenkins-plugin-download

 

Fix SunCertPathBuilderException Jenkins plugin download error - Coffee Talk: Java, News, Stories and Opinions

As I continue to publish Maven, Git and Jenkins tutorials as part of TechTarget’s coverage of popular DevOps tools, occasionally as I work on examples I run into peculiar problems that are both difficult to diagnose and frustrating to fix. The random

www.theserverside.com

 

해결법2.

젠킨스 플러그인 중에 skip-certificate-check 라는 게 있다.

귀찮은 인증 검사를 스킵해 주는 플러그인

이걸 설치하고 재부팅을 한번 하자.

이후엔 잘 된다.

드디어 성공

UDataAsset을 상속 받아서 만든 클래스에

TArray<enum> 으로 정의된 멤버를 추가했다.

 

enum 에 들어간 내용은 enum class 이름 : uint8 이었다.

그런데, 파일로 저장하니 배열의 사이즈 * 8 바이트의 사이즈로 저장된다.

 

배열의 사이즈가 작으면 별 문제가 안될 수 있으나, 내가 만든 데이터 에셋은 4096*4096 사이즈이다.

즉, 원래는 16MB 정도면 충분한데, 130MB로 저장되었다.

 

혹시나 싶어 TArray<uint8>로 변환해서 저장하니 16MB가 나왔다.

 

좀 알아보니, 언리얼에서는 enum 타입을 저장하면 메타데이터 같은 걸 같이 저장하기 때문에 용량이 커진다고 한다.

그래서 대량의 데이터를 저장할 때는 enum 그대로 저장하는 것 보다는 기본 타입으로 변형해서 저장하는 게 좋다.

 

 

 

 

TArray(배열)에서 아이템 제거해야 되는 경우,

원래는 RemoveAt(위치 인덱스) 사용한다.

이때 내부적으로는 memcpy가 호출되고, 따라서 나머지 항목들의 순서는 유지된다.

 

하지만, 굉장히 많은 항목을 반복적으로 제거해야 되고,

항목들의 순서가 중요하지 않거나 혹은 후처리로 따로 정렬을 해도 되는 경우라면,

RemoveAtSwap을 쓰는 게 낫다.

 

나머지 항목을 전체를 옮기지 않고, 배열의 맨 마지막 항목만 지우려는 위치로 복사한다.

참고 링크 : https://docs.unrealengine.com/4.26/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/TArrays/

DefaultEngine.ini 파일에서 다음과 같이 추가한다.

 

[Core.Log]

Log[카테고리이름]=Verbose

UE4Editor-Cmd.exe를 실행할 때 -waitforattach 옵션을 추가해서 실행한다.

이후에 비주얼 스튜디오에서 UE4Editor-CMD 프로세스를 찾아서 어태치를 한다.

블루프린터의 "인터페이스"라는 클래스는 함수 정의만 할 수 있고 구현은 할 수 없는 껍데기 클래스이다. 이를 처음 접하면, c++의 pure virtual function만 모아 둔 클래스와 비슷하다고 생각할 수 있다. 즉, c++에서 다중 상속을 이용한 인터페이스 구현처럼 보이기는 하지만, 성격이 좀 다르다.

 

일단, 언리얼 엔진에서 인터페이스용 클래스는 c++과 달리 부모로서 추가되는 게 아니다. 블루 프린트 클래스에서 부모 클래스는 단 하나만 존재할 수 있다. 인터페이스를 추가하고자 할 때는, 클래스 속성에서 Interfaces 카테고리에서 Add를 해서 추가해야 한다.

 

인터페이스 함수를 호출하기 위해서는 캐스팅이 필요없다. 예를 들어, BP_Parent라는 부모 클래스가 있고, 이를 상속 받은 BP_Child 클래스가 있다. BP_Child 클래스는 BP_Interface라는 인터페이스를 추가했고, 함수부분을 구현했다.

 

인터페이스에서 정의된 함수를 호출하려고 보면, BP_Child 클래스 뿐 아니라 BP_Parent 클래스에 대해서도 함수 호출이 가능하다. 인터페이스 함수의 인자를 자세히 보면, 특정 클래스가 아니라 Object Refernece를 받는다. 즉, 아무 클래스에 대해서 호출이 가능하다. 그런데, 해당 인터페이스를 상속 받지 않은 클래스에서 어떻게 함수 호출이 가능할까? c++에서는 컴파일 에러가 날 상황인데, 언리얼에서는 어떻게 가능한가?

 

알고 보니, 인터페이스 함수 내부에서의 처리는 c++의 상속 개념이라기 보다는 메시지 함수와 비슷하다고 한다. 그래서, 어떤 클래스에 대해서도 호출이 가능하다. 해당 클래스에 인터페이스 함수가 구현되어 있으면 처리를 하지만, 구현되어 있지 않으면 조용히 실패를 한다고 한다. 즉, c++ 처럼 컴파일 에러가 발생하지 않기 때문에 주의가 필요하다.

 

윈도우 11을 설치했더니, 작업 표시줄이 이뻐지긴 했는데, 아이콘 그룹화 기능을 해제할 수 없어서 짜증이 났다.

그래서 찾아 봤더니 작업 표시줄을 윈도우10 상태로 복구하는 Explorer Patcher for Windows 11 이라는 툴을 누가 만들어 놨다.

 

아래의 사이트로 들어가서,

https://github.com/valinet/ExplorerPatcher#how-to

 

GitHub - valinet/ExplorerPatcher: This project aims to bring back a productive working environment on Windows 11

This project aims to bring back a productive working environment on Windows 11 - GitHub - valinet/ExplorerPatcher: This project aims to bring back a productive working environment on Windows 11

github.com

 

setup program을 다운로드 받아서 설치하면 바로 윈도우 10 스타일로 바뀐다.

 

이제, 작업표시줄의 그룹화 기능을 끌 수 있다.

 

참고로 이 툴에 대한 정보는 7+ Taskbar Tweaker 라는 툴을 제공하는 홈페이지에서 얻었다.

링크 : https://ramensoftware.com/7-taskbar-tweaker-on-windows-11-with-windows-10s-taskbar

 

7+ Taskbar Tweaker on Windows 11 with Windows 10’s taskbar - Ramen Software

Windows 11 was officially released two days ago, and here’s another post about 7+ Taskbar Tweaker’s compatibility with it. In short: Nothing changed regarding the tweaker’s compatibility with the new Windows 11 taskbar, and probably never will, but t

ramensoftware.com

7+ Taskbar Tweaker는 현재 윈도우 11과 호환이 되지 않는데, 새로운 버전이 나오기 까지는 시간이 꽤 걸릴 듯 하다.

 

그리고, Explorer Patcher for Windows 11이 설치된 상태에서도 윈도우 11 스타일로 복구도 가능한데, 작업 표시줄에서 마우스 오른쪽 버튼을 눌러서 '속성'을 누른 후,

 

Taskbar style에서 Windows 11을 누르고,

Restart File Explorer 글자를 한번 눌러 주면 적용이 된다.

언리얼 에디터에서 게임 플레이 종료하는 키는 기본으로 ESC로 설정되어 있다.

이를 다른 키로 바꾸고 싶은 경우가 있다.

Editor Preferences/Keyboard Shortcuts 메뉴를 선택한 다음, play world로 검색한다.

검색되어 나오는 항목들을 보면, 'stop (stop simulation)'이라는 게 보인다.

해당 항목의 단축키를 ESC에서 Shift+ESC 와 같은 다른 키로 바꾸면 된다.

 

 

배치파일의 if 문 안에서 다른 프로그램이나 배치파일 호출한 이후 에러 값을 확인해서 처리해야 할 경우가 있다.

@echo off
cd /d %~dp0

set TEST=true

if "%TEST%" == "true" (
    echo SubTest
    call SubTest.bat
    IF %ERRORLEVEL% NEQ 0 GOTO ERROR
)

echo success
exit /b 0

:ERROR
echo error
call 
exit /b 1

Test.bat 파일의 내용은 위와 같이 작성하고,

echo SubTest.bat returns error
exit /b 1

SubTest.bat는 위와 같이 작성하자.

 

Test.bat를 실행하면,

Error.bat returns error
success

이상하게도 성공이라고 뜬다.

 

이건 if 문 안에서는 변수값이 바로 변경되지 않는 배치파일의 고유의 오래된(?) 특성 때문인데, 이를 해결하는 방법은 크게 2가지가 있다.

 

1.if 문 안에는 코드를 작성하지 말고, goto 명령어를 이용해서 외부 코드 블록에서 작업을 처리하는 방법.

@echo off
cd /d %~dp0

set TEST=true

if not "%TEST%" == "true" (
	goto SKIP_SUBTEST
)

echo SubTest
call SubTest.bat
IF %ERRORLEVEL% NEQ 0 GOTO ERROR

:SKIP_SUBTEST

echo success
exit /b 0

:ERROR
echo error
call 
exit /b 1

2. setlocal enabledelayedexpansion를 정의하고, 느낌표 변수를 사용하는 방법

@echo off
cd /d %~dp0

setlocal enabledelayedexpansion

set TEST=true

if "%TEST%" == "true" (
	echo SubTest
	call SubTest.bat
	IF !ERRORLEVEL! NEQ 0 GOTO ERROR
)

echo success
exit /b 0

:ERROR
echo error
call 
exit /b 1

setlocal enabledelayedexpansion 이라는 걸 먼저 넣어 주고, % 대신 !를 사용한 변수를 사용하면 값을 정상적으로(?) 받아올 수 있다.

SubTest
SubTest.bat returns error
error

 

+ Recent posts