UE5 29

[UE5] TearOff

[ UE5 : TearOff ] 특별한 경우에, 최적화를 위해 서버가 특정 액터를 복제하지 않도록 빠르게 분리시키는 것. 예를 들면, FPS 게임에서 적을 처치했을 때 특정 액터가 파괴되어 더 이상 게임에 영향을 미치지 않는 경우에 사용될 수 있다.그러니까 파괴된 건물의 잔해가 바닥에 떨어지거나 적 시체가 바닥에 쓰러져서 축 늘어지는 시뮬레이션을 진행한다면, 굳이 서버에서 해당 액터를 시뮬레이션해서 클라이언트에게 복제할 필요가 없다.이는 서버의 물리 시뮬레이션 연산 비용 + 복제 비용이 되기 때문이다.보통 이런 시체가 자연스럽게 쓰러지는 기능을 래그돌(Ragdoll)이라고 하는데, 해당 액터가 사망했을 경우 Ragdoll 된다는 것을 알리기 위해 TearOff를 클라이언트에게 마지막으로 알린 뒤, 서버에..

UE5/Network 2024.11.19

[NDC2022] SPICA 어디까지 왔나? 강연 필기

https://youtu.be/aulqNFU3gjo?si=-HB6y7jD5Rv2anvY  기존의 데디케이티드 서버구조에서, 조건에 따라 호스트 클라이언트를 선정하고, 몬스터의 연산량을 호스트에게 위임하여 연산량을 나누어 주도록 변경함으로써 최적화를 달성했다고 한다. 플러그인으로 기능을 구현하여 엔진 수정을 최소화하였으므로, 프로젝트 코드 / 버전 간의 코드 의존성도 거의 없게 되었다고 한다. 순서게임에 들어가서     1) 접속마주친 몬스터의     2) 위임공격을 피하고         3) 생성몬스터를 처리한다  4) 전투 1) 접속 - 홀펀칭(STUN)홀펀칭 : 포트가 열려있지 않은 상황에서 클라이언트가 연결을 시도할 때, 공유기가 있으면 해당 공유기로 인해서 패킷이 어디로 보내줄지 모르는 상태가 되..

UE5/Network 2024.11.13

[UE5] TWeakObjectPtr

[ UE5 : TWeakObjectPtr ] 언리얼 엔진에서 제공하는 스마트 포인터 중, GC와 관련된 기능을 하는 포인터.UPROPERTY() 를 통해 참조하면 강한 참조라 칭하는데, 참조되면 해당 메모리는 GC에 의해 해제되지 않는다.하지만 모든 UObject를 UPROPRETY()로 참조한다면, 잠깐 참조하고 생명 주기와 연관없어 필요하지 않는데도 많은 곳에서 참조되어 해제되지 않거나, 한 번에 엄청난 크기로 뭉쳐서 해제될 것이다.예를 들면, 두개의 오브젝트가 상호간에 UPROPERTY()로 참조하고 있다면, 둘 다 파괴되어야 같이 해제될 것이다.최악의 상황인 댕글링 포인터 문제는 생기지 않겠지만, GC 비용을 늘리게 되는 것.그래서 약하게 참조하는 것이고, TWeakObjectPtr로 쥐고 있어도..

UE5 2024.11.06

[UE5] CreateDefaultSubobject, NewObject, SpawnActor

To understand the difference between these functions, you need to remember that the object model in Unreal Engine is based on object prototypes, very much like in JavaScript. Each UClass is associated to a default instance of the associated UObject class, called the Class Default Object (CDO), which is allocated first and then constructed, only once, via the class constructor when the engine is ..

UE5 2024.11.03

[UE5] LineTrace Cost

[ Memo ]  [ jwatter에 따르면, ]The cost of a line trace depends not only on “is it a line trace,” but also on how long the line is (10 units is much cheaper than 10000 units!) and how many objects “could” be hit (approximately, how many objects are in the Axis-Aligned Bounding Box of the line.)LineTrace의 비용은 "라인 트레이스인지"뿐만 아니라 라인의 길이(10 단위가 10000 단위보다 훨씬 저렴합니다!) 및 얼마나 많은 개체가 "부딪힐 수 있는지"(대략적으로 라인의 AAB..

UE5 2024.10.18

[UE5] Animation Update in Server, Server side Rewind

[ 메모 ][ WIP  : 해당 게시글은 아직 연구중인 주제이므로 내용의 신뢰를 보장할 수 없고 임의 추가/삭제될 예정입니다. ] [ Overview ]FPS 게임이나 액션 게임에서, 캐릭터의 특정 애니메이션 프레임에서 공격 스킬이 실행되어야 하거나, 캐릭터의 히트박스를 기반으로 정교하게 피격 판정을 해야하는 경우가 있다.이 경우 피격 판정 당시의 캐릭터의 히트박스의 정보나, Montage의 AnimNotify를 기반으로 자주 판정하게 된다.그런데 언리얼엔진에선, 기본적으로 Server에서 AnimNotify 호출 또는 애니메이션의 업데이트가 원활하지 못하다.서버 입장에선 매 틱마다 캐릭터들의 본의 위치를 정교하게 업데이트 하거나 해당 프레임에서 AnimNotify를 호출하는 것이 비싼 연산이기 때문이다..

UE5/Network 2024.10.06

[UE5] SetPawn() : OnPossess in Client

[ UE5 OnPossess in Client ] 간혹 게임이 처음 시작될 때, Controller가 Pawn을 소유한 직후, 그러니까 Controller와 Pawn이 둘 다 유효한 가장 처음 시점이 필요할 때가 있다.OnPossess(APawn* InPawn)라고 간편한 함수가 직접적으로 존재하지만, 이는 서버에서만 호출된다.클라이언트, 또는 클라이언트와 서버 둘 다 간편하게 Init 할 수있는 함수가 없을까? [ AController::SetPawn(APawn* InPawn) ]이 함수는 서버, 클라이언트로 부터 전부 호출된다.그리고 virtual로 선언되어 있어 잘 사용하면 서버, 클라이언트 양측 케이스를 한 번에 핸들링가능하다는 뜻이다.기본적으로 서버에서는 OnPossess(), 클라이언트에서는 ..

UE5/Network 2024.09.28

Conditional Property Replication에 관한 짧은 분석

[ 짧은 메모 ] RepLayOut.cpp - 1525 CommentMost replication conditions don't actually effect whether or not we compare properties, because we share comparisons across connections, and typically only want to do one comparison per frame for all connections, when possible.  This means that we will end up performing the comparison, ignoring replication conditions, even if we might not have to send the pr..

UE5/Network 2024.09.15