[Godot] PackedScene 의 문제점

progman·2023년 2월 1일
0

제목을 이렇게 썼지만 사실 PackedScene만의 문제는 아니다. 처음엔 PackedScene에 문제가 있는 줄 알았는데 알고보니 다른 이유가 있더라는 결론에 도달했다.

Shader Hiccup

고도의 export (PackedScene)을 즐겨썼는데 치명적인 문제가 발생했다. 그렇게 불러와진 PackedScene 리소스가 씬 내의 카메라 절두체에 담겨질 때 순간적인 프리징이 발생했다. 게이머가 매번 게임을 할 때마다 PackedScene 리소스에 대한 프리징이 잦으면 상당히 불쾌할 것이다.

이는 고도엔진이 PackedScene 내에 있는 머터리얼에 대해 프리로딩을 하지 않아 생기는 문제이다. 어떤 셰이더를 사용한 오브젝트가 카메라에 처음으로 비춰지는 순간 해당 셰이더에 대한 컴파일이 수행되고, 이 때 순간적인 프리징이 일어난다. 컴파일이 수행되고 나면 이후로는 해당 현상은 일어나지 않는다.

3.x에서는 근본적인 해결 불가, 4.x에서는 해결 가능

3.x에서는 안타깝게도 이에 대한 근본적인 해결방법은 없다. OpenGL이 On-Demand Compilation을 수행하기 때문이다. 따라서 직접 셰이더 프리로딩을 할 수 있는 방법이 없다. 고도엔진 내에서 직접 셰이더 프리로드를 하도록 코드를 짤 수도, 관련된 옵션도 없다. 셰이더 비동기 컴필레이션 옵션으로도 해결이 되지 않는다.

가장 단순한 방법으로는 처음부터 게임 내에서 사용할 머터리얼들을 미리 모두 뷰포트에 노출시키는 것. OpenGL 관점에선 전통적인 workaround이다.

4.x에서는 Vulkan 덕분에 고도 내에서 셰이더 캐싱 및 스레드 컴필레이션이 가능하다. 다만 직접 4.x를 써본 것은 아니기에 여기선 언급만 하겠다.

참고자료

레딧: PackedScene를 프리로드하려면 어떻게 해야 합니까
고도엔진 Q&A: 모든 셰이더가 프리캐싱 되려면 어떻게 해야합니까

profile
그저 개발중인 사람입니다.

0개의 댓글