언리얼 오브젝트 관리 - 직렬화

Unreal 이론|2024. 9. 12. 17:24

[이득우의 언리얼 프로그래밍 수업의 정리]

 

직렬화(Serializaion)란?

  • 오브젝트나 연결된 오브젝트의 묶음(오브젝트 그래프)을 바이트 스트림으로 변환하는 과정.
    • 복잡한 데이터를 일렬로 세우기 때문에 직렬화
  • 거꾸로 복구시키는 과정도 포함
    • 시리얼라이제이션: 오브젝트 그래프에서 바이트 스트림으로
    • 디시리얼라이제이션: 바이트스트림에서 오브젝트 그래프로
  • 장점
    • 현재 프로그램의 상태를 저장하고 필요한 때 복원(게임의 저장)
    • 현재 객체의 정보를 클립보드에 복사해서 다른 프로그램에 전송
    • 네트워크를 통해 현재 프로그램의 상태를 다른 컴퓨터에 복원(멀티플레이어 게임)
    • 데이터 압축, 암호화 통해 데이터를 효율적이고 안전하게 보관

직렬화 구현시 고려할 점

  • 직접 구현할경우 다양한 상황 고려 필요
    • 데이터 레이아웃: 오브젝트가 소유한 다양한 데이터를 변환할것인가?
    • 이식성: 서로 다른 시스템에 전송해도 이식될 수 있는가? (예시: 운영체제마다 다른 빅엔디안, 리틀엔디안 차이)
    • 버전 관리: 새로운 기능이 추가될 때 이를 어떻게 확장하고 처리할것인가?
    • 성능: 네트웍 비용을 줄이기 위해 어떤 데이터 형식 사용?
    • 보안: 데이터 어떻게 안전하게 보호?
    • 에러 처리: 전송과정에서 문제 발생시 이를 어떻게 인식하고 처리할것인가?
  • 이런 상황 모두 감안해 직렬화 모델 만드는것 쉽지않다.

언리얼 엔진의 직렬화 시스템

  • UE엔진은 이런 상황을 모두 고려한 직렬화 시스템 자체 제공
  • FArchive 클래스와 연산자 제공
    • 아카이브 클래스 - FArchive
    • shift(<<) operator
  • 다양한 아카이브 클래스 제공
    • 메모리 아카이브(FMemoryReader, FMemoryWriter)
    • 파일 아카이브(FArchiveFileReaderGeneric, FArchiveFileWriterGeneric)
    • 기타 언리얼 오브젝트와 관련된 아카이브 클래스(FArchiveUObject)
  • Json 직렬화 기능: 별도 라이브러리 통해 제공
  • 장점
    • 텍스트지만 데이터 크기 가벼움
    • 읽기 편해서 데이터 보고 이해 가능
    • 사실상 웹 통신의 표준급으로 널리 사용됨
  • 단점
    • 지원하는 타입 몇개안됨
    • 텍스트 형식으로만 사용 가능
  • 언리얼 엔진의 Json -> JsonUtilities 라이브러리 활용

언리얼 스마트 포인터 라이브러리 개요

  • 일반 C++ 오브젝트의 포인터 문제 해결해주는 언리얼 엔진의 라이브러리
  • TUniquePtr(유니크 포인터)
    • 지정한 곳에서만 메모리 관리하는 포인터
    • 특정 오브젝트에게 명확하게 포인터 해지 권한 주고싶은 경우
    • delete 구문 없이 함수 실행 후 자동으로 소멸시키고 싶을 때
  • TSharedPtr(공유 포인터)
    • 더 이상 사용되지 않으면 자동으로 메모리 해지하는 포인터
    • 여러 로직에서 할당된 오브젝트가 공유해서 사용하는 경우
    • 다른 함수로부터 할당된 오브젝트를 Out으로 받는 경우
    • Null 일 수 있음
  • TSharedRef(공유 레퍼런스)
    • 공유포인터와 동일하지만 유효한 객체 항상 보장받는 레퍼런스
    • 여러 로직에서 할당된 오브젝트가 공유해서 사용하는 경우
    • Not Null 보장받으며 오브젝트 편리하게 사용하고 싶은 경우

댓글()