이번 프로젝트부터는 OpenGL 대신 Vulkan API를 사용하기로 했다. OpenGL과 Vulkan을 비교하며 어떤 차이가 있는지, 그리고 실제로 사용하면서 느낀 점들을 정리해보자.
둘의 차이를 쉽게 말하면, Vulkan은 개발자가 직접 해야 할 일이 많은 대신 성능에서 이득을 볼 수 있고, OpenGL은 자동으로 처리해주는 부분이 많아 개발 편의성이 높지만 그만큼 오버헤드가 있다. 아래의 간단한 비교를 통해 이를 확인해보자.
OpenGL
Vulkan
게임 엔진에서 성능은 매우 중요한 요소다. 그래서 우리는 자연스럽게 Vulkan을 선택하게 되었고, 이에 따른 공부를 진행해 Vulkan 튜토리얼을 완수했다. 그런데 여기서 또 다른 문제가 발생했다.
Vulkan의 장점에도 불구하고, 각 객체 간의 의존성이 너무 강해서 기능별 분리가 어렵다는 단점이 있다. 그래서 Vulkan 튜토리얼에서도 한 파일에 2000줄이 넘는 코드가 모여있다. 그대로 작업하기엔 너무 복잡하고 비효율적기 때문에, 바로 리팩토링을 진행했다.
최대한 기능별로 클래스를 나누려고 노력한 결과, 아래와 같은 구조를 만들었다.
class App
렌더링 컨텍스트를 관리하며 관련된 모든 객체들의 초기화와 렌더링 루프를 담당.
class VulkanInstance
class DeviceManager
class SwapChainManager
class CommandManager
class DescriptorPool
class SyncObject
class Renderer
class Model
class Mesh
비슷한 기능의 객체를 묶어 기능별로 나눈 덕분에 코드가 꽤 정돈되어 보였다. 하지만 작업을 진행하면서 몇 가지 한계가 보였다.
결론적으로, 보기에는 깔끔하지만 실사용에는 한계가 있는 리팩토링이었다. FT_Newton에서는 이 정도로도 충분했지만, 렌더링 엔진 파트를 담당하는 팀원 입장에서는 확장성이 더 중요하기 때문에 이 구조를 기반으로 다시 리팩토링 작업을 진행하고 있다.
이번 과제에서는 현재 리팩토링된 코드를 사용해 작업을 이어가고 있지만, 물리 엔진을 완성하고 렌더링 엔진과 합칠 때는 팀원이 새로 리팩토링한 Vulkan 코드를 사용할 예정이다.
FT_Newton: Narrow Phase / SAT vs GJK - (5) (0) | 2025.01.15 |
---|---|
FT_Newton: 『게임 물리 엔진 개발』 vs Box2D - (4) (0) | 2025.01.15 |
FT_Newton: Initialization, Integrate, Broad Phase - (3) (0) | 2025.01.10 |
FT_Newton: 물리 엔진 개요 - (2) (1) | 2025.01.10 |
FT_Newton: 나만의 물리 엔진 제작 - (0) (0) | 2025.01.06 |