갤럭시 아이폰 게임 성능 최적화 차이가 발생하는 이유는? Vulkan 불칸, Metal 메탈, OpenGL 차이 정리

최근 고사양 게임 리뷰를 하다 보면 굉장히 자주 들리는 이야기들이 있습니다. 바로 “왜 아이폰 최적화 게임만 리뷰하시나요”, 아니면 “게임사들이 아이폰만 편애해서 최적화를 잘 해줘요”, “GPU 성능은 갤럭시 쪽이 더 좋은데 테스트 결과가 잘못된 것 아닌가요?” 같은 말들인데요.

특히 최근에는 이제 갤럭시와 아이폰의 AP 하드웨어 종합 성능이 거의 비슷해졌고, 내년 갤럭시에 들어갈 가능성이 높은 스냅드래곤 8 Gen 3 같은 경우에는 그래픽 벤치마크 점수로 A17을 찍어누르는데

실제로 게임을 돌리면 아이폰보다 전기를 약 1.4배 정도 더 먹고 프레임이 비슷하거나, 프레임이 높게 나올 때에도 전기를 약 1.4배 정도 더 먹는 모습을 보여주고는 합니다.

나중에 게임 업데이트를 하면 전력 소모량 차이에 변화가 생길 수는 있지만, 40%나 차이가 나는 간격을 완전히 메우기는 어렵지 않을까 싶고요

안드로이드 풀옵션 + 레이트레이싱 ON, iOS 최하옵 + 레이트레이싱 ON, iOS 풀옵션 + 레이트레이싱 ON

그리고 호요버스 게임은 (원신, 붕괴 스타레일) 그나마 안드로이드 버전이 iOS와 너무 심각한 차이가 나지는 않게 어느 정도 신경을 써주는 편인데

퀄컴이랑 협업해서 레이트레이싱을 넣어준 워썬더 모바일 같은 사례를 보면 iOS 최하옵과 8Gen2 탑재 안드로이드 풀옵션이 거의 비슷한 그래픽을 보이기도 합니다.

결론부터 말씀드리자면 이런 현상이 발생하는 이유는 iOS를 사용하는 아이폰과 갤럭시를 포함해서 안드로이드를 사용하는 스마트폰들의 최적화 난이도 자체가 다르기 때문입니다.

우리가 게임을 플레이할 때, CPU와 GPU 뿐만 아니라 그래픽스 API라고 하는 소프트웨어도 성능에 굉장히 큰 영향을 끼치는데요.

비유하자면 CPU와 GPU가 좋은 붓과 팔레트 같은 도구라면 그래픽스 API는 그 도구를 어떻게 사용할지를 정해준다고 생각하시면 되겠습니다.

모바일 환경에서 가장 많이 쓰이는 것은 안드로이드는 OpenGL과 Vulkan, iOS는 Metal 인데요.

(* 정확하게는 변형이 된 OpenGL ES (OpenGL for Embedded Systems) 버전이지만 본문에서는 편의상 OpenGL이라고 하겠습니다.)

일단 OpenGL의 경우에는 근본적으로 초기 버전이 나온지 30년이 넘은 워낙 오래된 API다 보니까 효율성이 다소 떨어지는 모습을 보이고요

특히 CPU 멀티코어 사용 부분에서 상당히 약한 모습을 보이는데 이것 때문에 최신 스마트폰들의 멀티코어 CPU를 효율적으로 사용하기가 어렵습니다.

그래서 애플은 OpenGL을 버리고 Metal을 개발했고요, 추가적으로 OpenGL 공식 지원 종료라는 초강수를 두면서 Metal을 팍팍 밀어주기 시작했습니다.

덕분에 지금 iOS는 Metal이 기본 API고요, Metal은 애플 디바이스에서만 사용되는 방식인 만큼 괜찮은 최적화와 적당한 개발 난이도를 보여주는데요.

그리고 OpenGL을 관리하고 있는 크로노스 그룹에서는 Vulkan을 내놓았습니다.

이거는 진짜 이론상 정말 좋은 API긴 한데, 문제가 여기서는 자동으로 뭔가를 해주는 부분이 OpenGL보다 훨씬 적고 세부적인 구현을 Vulkan을 사용하는 개발자에게 거의 다 떠넘기는 문제가 존재합니다.

오죽하면 엔비디아 공식 문서에서도 Vulkan 너무 복잡하니까 잘 모르겠으면 그냥 OpenGL을 사용하는 편이 낫다고 말할 정도인데요.

추가적으로 리니지2 레볼루션조차 개발 난이도 문제로 인해서 Vulkan 지원을 하다가 포기한 사례가 있을 정도입니다.

이것도 쉽게 비유를 해서 말하자면 “밥을 먹는다” 라는 명령을 내린다고 쳤을 때 OpenGL은 적당히 알아서 밥을 먹을 수 있지만 그 방식이 비효율적이고, Metal은 정해진 밥상에서만 밥을 먹으니까 꽤 효율적으로 알아서 밥을 먹고

Vulkan은 이론상 정말 효율적으로 밥을 먹을 수는 있는데, 코드를 잘못 짜면 오히려 밥을 더 비효율적으로 먹거나 혹은 아예 못 먹을 수도 있고, 최악의 경우에는 밥상을 엎어버릴 수도 있습니다. (심각한 버그 발생)

따라서 개발에 시간과 비용, 인력을 무제한으로 사용해서 이상적인 최적화 진행이 가능하면 무조건 Vulkan을 사용하는 것이 맞지만

뭔가를 개발할 때 사용할 수 있는 시간과 인력에는 한계가 있기 때문에 게임을 개발할 때 무조건 Vulkan을 사용하기가 굉장히 힘든 상황이고요

추가적으로 프로그램이라는 것이 한번 만들어 놓으면 와 코드 다 짰다 끝! 이게 아니라, 나중에 예상치 못한 버그가 나오면 그것도 잡고 추가 기능을 업데이트로 넣는다던지 하는 식으로 끊임없이 유지 보수를 하게 되는데

Vulkan의 경우에는 잠재적으로 버그가 발생할 확률이 높고 뭔가를 시도할 때마다 만져야 하는 코드의 양이 너무 방대하다 보니까, 유지 보수 측면에서도 너무 큰 비용이 발생하는 문제가 존재합니다.

그리고 또 하나 더. 유니티 엔진같은 상용 엔진의 경우에는 클릭 몇 번 하면 Vulkan으로 변경 가능한데, 왜 원신같은 유니티 게임에서는 OpenGL을 사용하냐? 라는 이야기도 나오는데요.

그 이유는 크게 두 가지가 있는데, 하나는 대형 게임사들은 유니티를 그냥 쓰는게 아니라 자신들이 필요한 기능을 구현하기 위해 고가의 요금제에 가입해서 자체적으로 튜닝이 가능한 버전의 유니티를 사용하는 경우가 많기 때문입니다.

한마디로 원신에서 쓰는 엔진은 베이스는 유니티지만 실제로는 원하는 기능을 구현하기 위해서 소스코드를 튜닝한 원신만을 위한 변형 유니티를 사용할 가능성이 상당히 높은데, 이로 인해 생각만큼 간단하게 Vulkan으로 넘어가기 힘들 수 있습니다.

또한 일반적인 유니티에서도 Vulkan을 적용해서 빌드를 하면 크래시 빈도가 증가하거나, 경우에 따라서는 오히려 성능이 떨어지는 경우도 있어서 무조건 해당 옵션을 켜서 사용하기가 힘든 상황입니다.

추가적으로 갤럭시가 게임 최적화에 신경을 안 써서 아니면 게임사가 갤럭시랑 협업을 안 하거나 극단적으로는 애플이랑만 협업해서 게임 성능 차이가 난다는 이야기도 들리던데

최근 제가 꿈속에서(?) 게임 개발자 조상님을 직접 만나서 들은 이야기를 해드리자면, 삼성전자에서도 갤럭시에서 게임 잘 돌아가게 하려고 어느 정도 규모가 있는 게임에는 따로 담당자를 배정해 준다고 하셨고요

추가적으로 OpenGL을 Vulkan으로 변환해줄 수 있는 시스템을 만들기도 하는 등 이래저래 게임 최적화에 신경을 쓰고 있는 상황이긴 합니다.

다만 이렇게 해도 iOS만큼의 게임 퍼포먼스가 나오지 않는다면 그 이유는 Metal만큼 강력한 API가 없는 안드로이드의 한계라고 봐야 하는 상황이고요

안드로이드 진영은 퀄컴이 각성하면서 이제 도구 자체는 많이 좋아졌는데, 도구를 쓰는 방식이 (API) 너무 비효율적이라서 종합적인 게임 성능이 아이폰에 밀리는 상황이 계속될 수 있습니다.

특히 아이폰은 Metal을 기반으로 콘솔게임도 폰에서 돌리기 시작한 만큼, 이제 게임 퍼포먼스는 스마트폰 제조사뿐만 아니 구글에서도 좀 어떻게 대응책을 마련해야 하지 않을까 싶습니다.