본문 바로가기
게임개발/가마수트라

심층 분석: 스프레이로 완전히 칠해진 월드 최적화하기 [Bombing!! 2: A Graffiti Paradise]

by 아수랑 2023. 12. 20.
728x90
분야: 게임 기획 / 13분 읽기
작성자: Devon Wiersma


"모든 곳에 페인트를 칠하는 것은 기술적으로 비용이 많이 드는 작업이며, 프로젝트의 목표에 완전히 집중하지 않으면 달성하기가 매우 어려울 수 있습니다."


게임 개발자 심층 분석은 비디오 게임의 특정 디자인, 아트 또는 기술적 특징을 조명하여 단순해 보이는 근본적인 디자인 결정이 실제로는 전혀 간단하지 않다는 것을 보여주기 위해 진행 중인 시리즈입니다.

이번 에피소드에서는 인디 개발자인 Devon Wiersma가 업그레이드된 Bombing!! 2의 업그레이드된 비주얼과 플레이어가 게임 내 모든 표면에 그림을 그릴 수 있으면서도 원활하게 실행되도록 하기 위해 진행한 최적화 프로세스를 소개합니다.

 

 

안녕하세요! 저는 1인 인디 게임 개발자인 데본 위어스마입니다. 저는 약 5년 전부터 취미로 셀프 펀딩과 셀프 퍼블리싱을 통해 게임을 개발해 왔으며, 테이블탑 RPG부터 시작하여 점차 대형 디지털 프로젝트에 도전하고 있습니다. 현재는 [Bombing!! 2: A Graffiti Paradise]라는 게임을 만들고 있습니다.

[Bombing!! 2: A Graffiti Paradise]는 게임 세계의 100%를 페인팅할 수 있는 창의적인 그래피티 샌드박스 게임입니다. 또한 같은 맥락의 게임인 [ Bombing!!: A Graffiti Sandbox]의 축소 버전인 속편이기도 합니다: .

제가 아는 한, Bombing!! 프랜차이즈는 정말 아무 데나 그림을 그릴 수 있는 게임을 만들기 위해 노력하는 몇 안 되는 게임 중 하나입니다. 다른 게임으로는 킹스프레이 그래피티 VRSuchArt: 지니어스 아티스트 시뮬레이터Roblox 스프레이 페인트 등 비슷한 시도를 하는 게임도 있지만, 이런 게임들은 페인팅할 수 있는 표면을 특정 장소로 제한하는 경우가 많습니다. Bombing!! 2의 목표는 항상 게임 월드에서 페인팅할 수 있는 공간을 최대한 넓게 만드는 것이었습니다.

Bombing!!  시리즈를 작업하면서 다른 게임에서 모든 곳에 페인팅을 허용하지 않는 이유를 서서히 알아냈는데, 알고 보니 모든 곳에 페인팅을 하는 것은 기술적으로 비용이 많이 들고 프로젝트의 목표로 완전히 집중하지 않으면 달성하기 매우 어려운 일이었습니다. 이번 심층 분석에서는 Bombing!!의 월드를 최적화하기 위해 제가 사용하고 있는 몇 가지 방법을 간략하게 설명하겠습니다. 2에서 어디에나 칠할 수 있는 경험을 강화하기 위해 사용한 방법과 제가 직면한 몇 가지 한계점, 그리고 플레이어가 온통 칠할 수 있는 게임을 디자인하면서 겪었던 몇 가지 어려움을 강조해 보려고 합니다.


Bombing!! 의 배경

Bombing!!: A Graffiti Sandbox (또는 지금 부르는 이름인 Bombing!! 1)는 제가 직접 그래피티를 그렸던 경험에서 영감을 얻은 사이드 프로젝트입니다. 2020년에 제가 혼자 만든 첫 번째 프리미엄 디지털 게임으로 출시되었던 Bombing!! 1에서 자연스럽게 많은 부분이 Bombing!! 2에 영향을 주었습니다.


Bombing!!! 1 는 Bombing!! 2과 게임 플레이는 비슷하지만, 맵의 크기가 방 한 칸 정도에 불과하고 페인트 해상도가 너무 낮아서 많은 사람들이 픽셀 아트를 만드는 것에 비유할 정도로 훨씬 더 작았습니다. Bombing!!! 2 에서는 이 아이디어를 이어받아 월드 크기와 툴 범위 모두에서 더 크고 더 나은 게임을 만들고 싶었고, 그래서 최적화에 집중했습니다.

기술적인 측면에서 보면, Bombing!!! 시리즈에는 Unity라는 게임 엔진이 내장되어 있으며, 카를로스 윌크스(훌륭한 에셋 개발자입니다. 그의 작품을 확인해 보시길 적극 추천합니다)가 만든 "Paint in 3D"라는 플러그인이 함께 제공됩니다. Bombing!!! 시리즈는 전반적으로 이 플러그인에 크게 의존하고 있으므로 이 글에서 몇 번 언급될 것입니다.

반응형


텍스처, 텍스처, 텍스처

텍스처 변경을 자주 수행하면 텍스처 변경을 작성하는 데 비용이 많이 들 수 있으며, 텍스처의 해상도가 클수록 작업 비용이 더 많이 듭니다. Bombing!! 에서 페인트를 칠할 때마다 페인트 이벤트를 수신하는 텍스처가 다시 작성됩니다.

Bombing!!! 1에서는 일부러 텍스처 해상도를 낮게(~128x128픽셀) 설정하여 스타일과 PSX 느낌을 살렸습니다. 해상도가 너무 두툼해서 픽셀 아트를 만드는 것에 비유하는 사용자도 있었고, 제한된 크기 때문에 더 복잡한 아트를 만들기가 어렵기 때문에 더 높은 해상도를 원하는 사용자도 있었습니다. 결국 낮은 해상도 때문에 자유형 페인팅이 플레이어에게 줄 수 있는 가능성의 공간이 줄어들었고, 속편에서는 이를 개선하고 싶었습니다.

Bombing!!! 2에서는 텍스처 크기와 성능 사이의 균형을 맞추기 위해 텍스처 해상도를 어디까지 끌어올릴 수 있는지 알아보고 싶었습니다. 문제는 에셋의 텍스처가 너무 낮으면 페인트가 너무 픽셀화되어 보이고, 너무 높으면 페인트가 너무 '선명하게' 느껴져 페인팅하는 동안 텍스처를 다시 작성하는 데 엄청난 비용이 들 수 있다는 점입니다. 또한 맵의 모든 에셋이 고유한 복잡성을 지닌 텍스처를 사용하는 경우, 밸런스가 맞지 않으면 한 오브젝트의 표면이 너무 픽셀처럼 보이는 반면 다른 오브젝트는 너무 선명하게 보일 수 있으므로 서로 간에 균형을 이루는 값을 찾는 것이 핵심입니다. 멋지게 보이는 것과 하드웨어가 감당할 수 있는 것 사이의 균형을 찾는 것이 관건입니다.

이 균형을 맞추려면 많은 시행착오가 필요하며, 보통 게임에 도입하는 각 에셋에 대해 여러 번 반복해서 테스트하는 과정을 거칩니다. 결국 가장 적합하다고 느낀 값은 단순한 에셋의 경우 512x512 정도, 큰 에셋의 경우 4096x4096 정도였습니다. 하지만 2048x2048보다 큰 값은 일반적으로 수익률이 떨어지고 구형 하드웨어에서 페인팅할 때 속도가 느려지는 경우가 많기 때문에 이보다 큰 값으로는 그만한 가치가 있는 경우가 거의 없습니다.

왼쪽은 Bombing!!! 1의 텍스처입니다. 오른쪽은 Bombing!!! 2의 텍스처입니다.


UV 언래핑

3D에서 페인트가 작동하는 방식은 에셋이 페인트 이벤트를 수신하면 이벤트를 수신한 에셋의 지점에 있는 텍스처에 기록하는 것입니다. 예를 들어 정지 표지판의 기둥에 페인트하면 기둥의 해당 지점에 있는 텍스처가 페인트됩니다. 즉, 에셋에 UV 공간이 겹쳐서는 안 되며, 그렇지 않으면 텍스처가 공유되는 에셋의 여러 위치에 페인트가 적용됩니다(이벤트가 접점의 UV 공간에 적용되므로).

그러면 자연스럽게 에셋 파이프라인의 속도가 크게 느려집니다: 저는 에셋을 Unity 스토어와 Sketchfab과 같은 온라인 소스에서 가져오는데, 게임에서 사용할 에셋이 제 사양과 일치하지 않을 경우 포장을 풀고 다시 베이킹해야 하는 경우가 많습니다(약 90%의 경우). 또한 게임에서 텍스처가 복잡할수록 전체적으로 텍스처 공간이 더 많이 차지하게 되는데, 이는 페인팅할 때 이상한 시각적 결함을 피하기 위해 텍스처의 각 UV 조각을 적절히 언패킹해야 하기 때문입니다.


저는 이 작업의 일부를 SimpleBake라는 블렌더 플러그인으로 보완했는데, 이 플러그인을 사용하면 파라미터를 설정하고 필요에 따라 UV가 적용되지 않은 에셋을 빠르게 리베이크할 수 있습니다. 새로운 에셋을 게임에 통합할 때 모든 에셋을 다시 베이크해야 하므로 여전히 워크플로 속도가 느려지지만, 적어도 프로세스를 간소화할 수 있어 수많은 3D 작업을 수작업으로 할 필요는 없습니다.

 

맵 크기 워크플로

Bombing!!! 1 의 맵 크기가 작았습니다.

정말 작았죠.


대부분의 맵에서 반대쪽을 볼 수 있고, 페인트할 에셋이 몇 개밖에 없는 경우가 많았습니다. 저는 Bombing!! 2에서 이 부분을 극한까지 밀어붙이기로 결심했습니다. 한계에 도전하기로 결심했지만 많은 문제가 수반되었습니다.

우선, 에셋을 페인트에서 3D로 칠하면 자체 텍스처를 가진 고유한 머티리얼이 되기 때문에 해당 에셋에 대한 새로운 머티리얼 인스턴스가 생성됩니다. 따라서 머티리얼 인스턴싱과 같은 일부 Unity 기본 제공 기능을 사용하여 화면에 많은 머티리얼을 표시할 수 없습니다. 또한 플레이어가 월드에 더 많은 것을 칠할수록 게임에서 개별적으로 렌더링해야 하는 머티리얼 인스턴스가 늘어나므로 결국 플레이어가 칠하는 오브젝트가 많아질수록 게임 씬을 전체적으로 렌더링하는 데 더 많은 작업이 필요하게 됩니다.

플레이어가 너무 많은 페인팅을 하면 프레임 속도가 저하될 수 있다는 사실을 깨달았을 때, 제작 과정에서 이 한계를 극복할 수 있는 최선의 방법을 찾아내는 데 큰 어려움을 겪었습니다.

처음에는 렌더링해야 하는 머티리얼 인스턴스 수를 줄이기 위해 맵 지오를 큰 '청크'로 결합하는 실험을 했습니다. 하지만 지오메트리가 커지고 복잡해지면 3D 최적화 작업이 많아질 뿐만 아니라 월드 내 에셋의 텍스처 해상도가 급격히 증가하여 결국 다른 방식으로 기술적으로 더 까다로워지기 때문에 이러한 접근 방식은 제작에 적합하지 않다는 결론에 이르렀습니다. 저는 Bombing!! 1 에서 사용했던 '키트' 기반 접근 방식을 유지하고 싶었습니다.

이 문제는 Bombing!! 2 의 대규모 맵에 대한 저의 모든 아이디어를 무너뜨릴 것만 같았습니다. 하지만 곧 아직 사용해 보지 않은 핵심 기능이 떠올랐습니다: 바로 오클루전 컬링입니다.

저는 접근 방식을 완전히 바꿔서 크고 복잡한 지오그래픽 대신 작고 단순한 지오그래픽으로 구성된 워크플로를 시도하기로 결정했습니다. 이전에는 머티리얼 인스턴싱 문제(인스턴스가 너무 많은 것이 문제라면 굳이 오브젝트를 더 많이 만들 필요가 있을까?)로 인해 이 방법을 완전히 무시했지만, 오클루전 컬링을 사용하면 표시되는 인스턴스의 수를 제한할 수 있으므로 문제를 완전히 해결할 수 있었습니다.

왼쪽은 Bombing!! 2에서 오클루전이 꺼진 상태입니다. 오른쪽은 Bombing!! 2 에서 오클루전이 켜진 상태입니다.


저는 오클루전 컬링을 사용해야 할 만큼 크거나 복잡한 씬이 있는 게임을 제작하는 경우가 거의 없기 때문에 오클루전 컬링에 대해 완전히 잊고 있었지만, 이 경우에는 씬을 렌더링하는 동안 사용자의 GPU가 스스로 폭발하는 것을 방지하기 위해 반드시 필요하다고 느꼈습니다.

그리고 성공했습니다! 적절한 오클루전 컬링 설정과 신중한 맵 디자인으로 작은 평면을 모아 큰 맵을 만드는 워크플로에 도달했습니다. 플레이어가 전체 맵을 볼 수 있는 영역의 수를 제한하면 한 번에 그려야 하는 머티리얼의 수가 크게 줄어들어 레벨에 수백 개의 머티리얼 인스턴스가 존재하는 경우에도 큰 맵을 제작할 수 있었습니다.


오클루전 컬링 감사합니다!

728x90


파티클을 사용한 페인팅

3D 페인트에서는 파티클 충돌을 사용하여 표면에 페인트를 칠할 수 있으며, 에어로졸 스프레이 페인트로 페인트를 칠하거나 물체에 페인트를 흘리는 것과 같은 동작을 재현할 수 있습니다. 하지만 표면에서 동시에 많은 파티클 충돌이 발생하는 것은 비용이 많이 들며, 일부 텍스처의 크기가 4096x4096일 경우 올바르게 처리하지 않으면 페인팅 과정에서 속도가 느려질 수 있습니다.

대부분의 게임에서 파티클 충돌은 그다지 중요하지 않을 수 있지만, 제 게임은 스프레이 페인트의 느낌을 중요하게 생각하는 그래피티 아티스트를 주 타깃으로 삼고 있습니다. 파티클이 플레이어가 기대하는 만큼 사실적으로 분사되도록 하는 데 많은 시간을 투자했는데, 이는 실제로 플레이어의 월드 컨트롤 수준에 직접적인 영향을 미치기 때문에 특히 파티클이 모든 것에 페인트를 칠하는 게임에서 제대로 구현하는 것이 정말 중요했습니다.

유니티에는 한 번에 너무 많은 파티클 충돌이 발생하는 것을 방지하기 위한 몇 가지 제한이 있지만, 플레이어가 기대하는 대로 페인트가 표면에 적용되지 않는 대가를 치른다면 그야말로 아슬아슬한 경계선이죠. 충돌 횟수가 너무 적으면 에어로졸이 충분히 반응하지 않고 플레이어가 기대하는 빈틈을 메우지 못하지만, 너무 많으면 속도가 크게 느려집니다.

Bombing!! 데모를 공개한 후 많은 피드백을 받았습니다. 파티클 충돌에 대해 일부 플레이어는 하드웨어가 약해서 페인팅하는 동안 속도가 느려졌다고 불평했고, 다른 플레이어는 속도가 느려지지는 않았지만 에어로졸 페인팅이 충분하지 않다고 지적했습니다. 여러 번의 최적화를 거듭한 끝에, 특히 하드웨어에 따라 사용자가 기대하는 퀄리티가 크게 다르다는 사실을 깨닫고, 전반적으로 사용자의 기대치와 하드웨어 요구 사항 간의 격차를 극복하는 것이 큰 과제라는 것을 깨달았습니다.

대신 저는 다른 솔루션을 선택했습니다: 바로 밸런스를 플레이어의 손에 맡기는 것이었습니다!

Bombing!! 2 _파티클 모디파이어 세팅.png


플레이어의 알 수 없는 하드웨어 성능에 맞춰 게임을 최적화하는 대신, 에어로졸 스프레이의 밀도를 변경할 수 있는 게임플레이 설정을 도입했습니다. 이렇게 하면 플레이어가 정보에 입각한 선택을 할 수 있고, 각기 다른 기기를 사용하는 모든 플레이어에게 강제로 빌드하는 대신 자신의 기기 성능을 테스트해 볼 수 있습니다.

성능에 영향을 줄 수 있으므로 더 강력한 시스템에서만 사용해야 한다는 경고가 함께 제공되지만, 무언가 부족하다고 느낀 사용자가 직접 최적화를 실험하여 각자의 필요에 맞는 적절한 중간 지점을 찾을 수 있게 되었습니다.

플레이어는 여전히 여기저기서 약간의 속도 저하를 느끼지만, 적어도 하드웨어에 맞게 파티클 충돌을 다시 최적화하는 것보다 이 설정을 낮추라고 말하는 것이 훨씬 쉬워졌습니다!


저장 시스템

Bombing!! 1의 저장 시스템은 나빴습니다. 정말 나빴죠. 고쳐야 할 가장 큰 문제였습니다.

기본적으로 3D 페인트는 텍스처 저장을 위해 Unity의 내장 플레이어프레프 시스템을 사용하는데, 이는 저장 방식이 각 게임마다 상황에 따라 다르기 때문에 일률적인 솔루션을 만들기가 어렵기 때문이라고 생각합니다. Bombing!! 1에서는 내장 옵션을 사용했는데, 개발자의 제한된 역량으로 인해 텍스처를 페인트 머티리얼의 이미지 파일로 사용자 레지스트리에 기록하는 결과를 초래했습니다.

다시 한 번 말씀드리지만, 좋지 않았습니다. 일부 사용자들이 Bombing!! 1을 플레이하지 않게 만들기에 충분했습니다. 게임을 아예 플레이하지 않게 만들 정도였으니 충분히 이해할 수 있습니다.

창의적인 그림 그리기 게임을 하는 플레이어라면 오랜 시간이 지난 후에도 작품으로 돌아가서 다시 작업할 수 있기를 기대하는 기본적인 기대치가 있습니다. 결국, 그게 재미의 절반이죠! 특히 더 큰 맵과 더 높은 해상도의 텍스처를 계획하고 있다면, 플레이어 프리셋에 저장하는 것은 Bombing!! 2 에서 작동하지 않을 것입니다. 다시는 그렇게 하지 않겠습니다.

대신 저만의 시스템을 만들었습니다! 씬에서 칠할 수 있는 각 게임 오브젝트에 고유 ID를 저장한 다음 이 고유 ID를 사용하여 텍스처 파일을 파일 저장소에 저장했습니다. 이렇게 하면 저장 용량이 커지지만(완전히 칠한 맵은 500MB를 쉽게 넘을 수 있습니다), 사용자가 이러한 텍스처를 복사/붙여넣어 백업하거나 나중에 다시 돌아올 때 다른 버전의 맵을 다시 불러올 수 있습니다. Steam의 클라우드 저장소는 용량 제한으로 인해 더 이상 사용할 수 없지만, 적어도 이번에는 사람들의 레지스트리를 날려버릴 일은 없겠네요.


결론

보시다시피 제작 과정에서 많은 성장통과 학습 포인트가 있었지만, Bombing!! 게임을 제작하면서 페인팅 최적화에 대한 독특한 팁과 요령을 많이 배웠기 때문에 만족합니다.

궁극적으로 제가 Bombing!! 에서 가장 좋아하는 점은 사람들이 집에서 편안하게 그래피티를 그리는 경험을 재현하고 멋진 작품을 만들 수 있도록 지원하는 것입니다. 앞으로 '어디든 그리기'라는 게임 플레이 스타일이 하나의 장르로 성장하는 것을 보고 싶기 때문에, 이러한 고려 사항 중 일부가 여러분의 게임에 적용하는 데 도움이 되었으면 좋겠습니다. 


* 원문: https://www.gamedeveloper.com/design/deep-dive-bombing-2-a-graffiti-paradise

 

Deep Dive: Optimizing a fully spray-painted world in Bombing!! 2: A Graffiti Paradise

"Painting everywhere is a technically expensive thing to do, and it can be very difficult to achieve if you’re not entirely focused on it as a goal of your project."

www.gamedeveloper.com

 

* 게임 사이트: https://store.steampowered.com/app/2109570/Bombing_2_A_Graffiti_Paradise/

 

Bombing!! 2: A Graffiti Paradise on Steam

Welcome To Graffiti Paradise! Explore for hidden secrets, meet interesting friends, unlock painting tools, and fill your world with colour!

store.steampowered.com

 

// 역대급으로 힘들었던 번역입니다. 오역이 많을 수 있습니다. 잘못된 번역은 댓글로 알려주세요.

반응형
LIST

댓글