한줄요약: PS3 각각의 SPU는 강력하지 않지만, 제대로 뭉치기만 하면 무섭다. 그리고 요즘 소니가 개발자들 지원에 힘을 쓰고 있어서 PS3에 최적화된 게임들이 많이 나올 것이다.
PS3 게임 제작이 어려운 이유.(이제 더 이상 문제가 아님)
PS3의 개발이 어려운 이유를 아무나 잡고 물어보면 10명중 9명은 '셀' 때문이라고 말할 것이다. 셀은 PS3안의 코프로세서의 이름이다. 아직 모르는 사람을 위해 설명을 잠깐 하자면, PS3는 여러개의 프로세서를 내장하고 있다. 예전 맥에서 보던 파워PC CPU이다. 하지만 PS3용으로 특성화되었다. 또 8개의 여분의 프로세서인 SPU도 포함하고 있다. SPU 중 하나는 PS3 기능향상을 위해 항상 잠겨있다. 또 하나는 시스템을 위해 여분으로 남겨둬 있다. 하지만 6개의 남은 SPU는 제작자가 원하는데로 사용할 수 있다. 그리고 중요한 것은 남겨진 SPU는 무지하게 빠르다 사실 몇몇 사람들이 PS3가 모든 SPU를 활용하면 "무한 성능"을 지니게 된다고 주장한다. 모든 폴리곤은 던져 놓기만하면, "유욱시입프으레이임"을 외치기도 전에 처리한다고 생각할 지도 모른다. 사실 이건 정확하지 않다.
셀 SPU 하나의 성능을 보자면, 어느 정도를 뽑아줄 지 예상이 가능하다. 사실 그렇게 빠르지 않다. 셀의 기능에 최적화된 작업들은 정해져 있다. 사실 모든 프로세서가 각자 자신의 역할에 맞는 장소가 있다. 예를 들면, CPU를 그래픽 계산에 쓸 생각이나, GPU를 파일들의 해독이나 암호화하는데 쓸 생각은 보통 안할 것이다. 특정 하드웨어는 특정 동작을 위해 만들어진다. 셀의 진정한 파워는 바로 6개라는 점이다. 아무리 힘이 넘친다하더라도, 적재적소에 쓰이지 않는다면 무용지물이다. 하지만, 이런 기술이 새로운 것은 아니다. 다만 게임제작에서는 상대적으로 새로운 기술이다. 처음 PS3 개발킷이 보급된 2005년으로 돌아가보면, 모든 데스크탑 PC는 싱글 프로세서였다. 당시 콘솔도(게임큐브,PS2,엑스박스) 모두 비슷한 상황이었다. 싱글 프로세서, 약간의 램과 GPU 뿐이었다. PS2는 약간의 예외가 적용되지만, 이것은 나중에 설명하겠다.
PS3는 여러개의 프로세서를 가지고 있다. 각각의 프로세서들은 특출나지 않다. 다만 뭉치게 되면 놀라운 일을 해낸다. PS3가 멀티코어를 사용한 첫번째 콘솔은 아니다. 기억할련지 모르겠지만, 새가 새턴이 있다. 새턴은 PS1보다 성능이 우수했다. 하지만 개발하기가 끔찍하게 어려웠다. 다른 문제는 세가는 개발자들에게 충분한 지원을 하지 않았다. 따라서 개발자들은 다른 CPU는 무시해버리고, 단일 CPU만 사용했다. 새턴 게임이 어떻게 되었는지는 모두 알 것이다.
처음에 말했듯이. 2005년 전까지 멀티코어를 이용한 게임 제작은 거의 없었다. 멀티 CPU는 다양한 일을 동시에 처리해야 되는 서버와 클러스터를 위한 것이었다. 날씨 계산 같은 일부 작업들은 쉽게 병렬화 가능하다. 반면 게임은 그것이 쉽지 않다. 이 말을 듣고 당신은 이렇게 생각할 것이다. GTA같은 거대하고 멋진 오픈월드 게임을 보면, 모든 것들이 동시에 처리된다. 차량은 움직이고, 사람들은 대화하고, 날씨는 변화한다. 이게 동시에 처리되는 것이 아니라면, 무엇이 동시에 처리되는 것인가? 초기 PS3 vs 360 논쟁중 하나는 엑박360이야말로 게임을 염두에 두고 만든 콘솔이라는 것이다. 엑박360에는 3개의 코어가 있다. 하나의 코어는 피직스에 다른 하나는 오디오에 마지막 하나는 그래픽에 쓰인다. 완벽하고 간단하다. 하지만 이런 설명은 부족하다.
게임 디자인 간단 정리.
왜 이 과정이 단순하지 않는가에 대한 것을 이해하려면 먼저 게임디자인에 대한 기본적인 이해부터 갖추어야 한다. 이것이 가장 기초적인 개요이다.
컴퓨터 입문서를 보면, 대충 아래와 같은 내용을 볼 수 있을 것이다.
입력-처리-출력
사실, 모든 컴퓨터가 이런 방식으로 동작한다. 컴퓨터에 입력을 하면, 처리를 하고 출력을 보여준다. 자세히 들어가면, 정확한 설명은 아니지만, 대충 개략은 이렇다. 사용자가 버튼을 누르면, 컴퓨터는 화면 출력전에 처리를 한다. 게임의 경우 아날로그 스틱을 움직이면, 컴퓨터는 아날로그 스틱이 얼마나 움직였는지, 벽이나 다른 물체에 부딪히진 않았는지, 피직스를 계산한 뒤 화면에 출력한다.
거의 모든 게임이 이 방법을 따른다. 팩맨이든, 쉔무든 똑같다. 컴퓨터는 컨트롤러로 입력을 받으면, 무슨 의미인지 분석한 뒤 AI 계산을 한다. 물론 모든 게임이 이 패턴을 정확하게 따라가는 것은 아니지만, 대부분의 게임은 이런 물밑 작업을 한다. 매우 단선적이다. 입력하면 움직임, 피직스, 충돌여부, 충돌결과 등등을 계산한다. 이 점이 멀티 코어에 게임의 처리를 집어 넣기 어려운 문제로 다가온다. 컴퓨터는 유저의 컨트롤러를 움직이기 전까진 피직스와 충돌을 처리할 수 없다. 모든 오브젝트의위치 어떤 방향으로 향하는지, 얼마나 빨리 움직이는 것을 파악하기전까지 화면에 출력할 수 없다. 이 모든 것도 피직스가 완료되기 전까지는 알 수가 없다.
엑박360의 경우 3개의 코어가 있다. 하나는 피직스, 다른 둘은 피직스가 완료되기까지 기다려야 한다. 일단 피직스처리가 완료되야, 다른 두개의 코어가 일을 시작한다. 근데 다른 두개의 코어가 일을 하는 동안에 피직스 코어는 쉬고 있다. 설사 이런 다른 종류의 일을 병렬화하는 방법이 있다 하더라도, 모든 코어가 일을 하도록 할 수 는 없다. 한 코어가 많은 일을 하는 동안 다른 코어는 적은 일만 담당하게 된다. 게임제작에서 목표는 모든 코어가 100% 일을 하게 하는 것이다.
여러분들은 게임제작자들이 콘솔의 성능을 극한으로 뽑아냈다고 주장하는 것을 본적이 있을 것이다. 필자가 너티독을 비하하고 싶은 것은 아니지만, 실제 프로세서를 100% 사용하는 것은 그다지 어려운 일은 아니다.
코드 한줄로도 쉽게 프로세서를 풀가동시킬 수 있다. 코어가 곱하기 6인 제품이라도 100% 뽑아내는 것은 그다지 어려운 일은 아니다. 진짜 중요한 것은 프로세서가 프로세싱하는 동안 프로그램 코드를 최적화하는 것이다. 그럼 어떻게 해야 최적화를 할 수 있는 것일까? 게임 즉 특별히 최근 게임에선 조금 다른 페이스이다. 게임 중에 당신 뒤의 박스에 누군가가 수류탄을 던진다면 어떤 일이 벌어질까? 피직스 계산은 순간적으로 올라가지만, 다른 것은 쉬고 있다. 게임이 단선적일 수 밖에 없다면, 이 처리를 3개나 그 이상으로 나눈다면 어떨까? 그리고 나눈 프로세서를 동시에 일하게 한다면?
멀티쓰레딩
프로그램이 동시에 여러가지 일을 처리하게 하는 것을 멀티쓰레딩이라고 한다. (멀티태스킹과 햇갈리지 말자) 예를 들어 프로그램이 한줄 한줄 차례대로 처리한다고 생각한다면 멀티쓰레드는 동시에 2줄을 처리 하는 것이다. 먼저번 예를 든 360의 예대로 게임은 3가지 작업이 필요하다. 이것을 PS3에 그대로 적용 시킨다면, 오직 6개의 코어중 3개만 사용하는 결과를 낳을 것이다. 물론 이것은 PS3의 메인 CPU는 제외한 것이다. 왜 많은 사람들이 PS3는 개발하기 여렵고 360은 개발하고 쉽다는 생각을 하는지 이해는 간다. 하지만 쉬운 설명은 지나치게 쉽다. 확실한 설명이 필요하다.
이제 한코어는 열심히 일하는 동안 나머지 코어는 노는 그런 것 말고, 여러 코어에 동시에 일을 처리하도록 시키는 방법을 찾아보도록 하자. 더 이상 시스템 자원을 그냥 놀리지 말고, 하드웨어가 제공가능한 풀성능을 끌어내는 것 말이다. 들리기엔 쉬어 보이지만, 이런 병렬 컨퓨팅은 전혀 쉽지 않다.
예를 들어 육상선수 6명이 100m 달리기 전력질주를 한다고 하자. 단 선수는 PS3의 CPU라 가정하자. 가장 이상적인 것은 모든 선수가 동시에 100m달리기를 끝마치는 것이다. 하지만 실제는 이와 다르다. 일부 작업은 다른 작업보다 약간 오래 걸린다. 선수로 치면 다른 선수에 비해 약간 뒤쳐진다. 하지만 다른 선수들은 계속해서 질주하기 때문에 큰 문제는 아니다. 하지만, 우리가 원하는 것은 아니다. 모든 선수가 같은 속도로 질주하길 바란다. 모든 프로세서가 같은 양의 데이터를 처리하길 원한다. 두명에게 부족하다면, 6명에게 맡기면 어떻게 될까?
선수들은 서로 부딪쳐 넘어질 것이고 넘어뜨릴 것이다. 서로 부상을 입히고, 경주는 끌나기도 전에 중지될 것이다.
컴퓨팅에서 두개의 쓰레드가 동시에 일할 때, 서로간에 교차하지 않는다. 그렇지 않을 경우 좋지 않은 일이 발생한다. 한 쓰레드의 데이터 조각이 다른 쓰레드에 접근하려 한다면 문자그대로 다양한 일이든지 발생한다. 어쩌면 괜찮을 수도, 아니면 충돌이 한쪽 혹은 양쪽에서 일어날 수 있다. 데이터가 사라질 수도, 출력이 좋지 않을 수도 있다. 하지만 우리는 60프레임을 원한다. 이말은 각각의 초당 60프레임의 질을 확률에 맡겨야 한다는 것이다. 각각의 프레임은 프로세싱 뒤에야 출력된다.팩맨 같이 간단한 게임이라도 이 과정을 따른다.
우리는 콘솔의 모든 코어가 같은 셋트의 데이터를 다른 프로세서의 발을 밟지 않고, 동시에 처리하길 원한다. 프로그래밍을 잘 모르는 사람이라면, 좀 어렵게 들릴지도 모른다. 사실 프로그래밍을 좀 아는 사람이라도 좀 어려운 부분이다. 이 기술은 2005년 들어서야 나온 새로운 기술도 아니고, 이 기술에 관한 많은 서적들도 이미 나와 있는 상태이다. 다만 이전에 멀티쓰레드 프로그래밍을 해보지 않았다면, 조금 어려울 수도 있다. 염두에 두어야 할 점은 완벽한 프로그램 코드를 작성하려 한다면, 100%에는 도달할 수 없을 것이다. 하지만, 굉장히 가까운 수준은 맞출 수 있을 것이다.
만약 게임엔진 기초부터 새로 만든다면, 그건 어려운 일이 아닐수도 있다. 하지만 대부분의 게임제작사들은 이미 있는 게임엔진으로 만든다. 시중의 엔진은 멀티쓰레드를 염두에 두고 만든 것이 아니다. 이미 당신은 다른 종류의 게임들이 비슷하게 보이는 것을 경험한 적이 있을 것이다. 게임엔진 제작은 돈과 시간이 든다. (시간은 돈이다. 즉 돈과돈) 단순히 새 콘솔이 나왔다고 해서 새로 엔진을 만드는 것은 좋은 선택이 아니다. 코드를 재사용할 수록 돈과 시간이 절약된다. 2006년 당시 많은 게임들이 적어도 몇년이상된 구형 게임 엔진을 사용했었다. 콜오브듀티가 그 대표적 예이다. 콜옵을 자세히 본다면, 퀘이크3의 잔재를 볼 수 있다. 당연히 수년간의 개조와 업그레이드는 있었지만 말이다. 모든 멀티코어를 활용하기 위해선 이 게임엔진들에 추가적인 작업이 필요하다. 혹은 엔진자체를 새로 만들어야 한다. 두 방법 모두 싼 선택은 아니다.
그럼, 무엇이 변했나?
PS3는 처음 출시된 2006년 이후 내부적으로 그다지 바뀐것은 없다. 여전히 6개의 SPU를 활용할 수 있다. 그런데, 요즘들어 아무도 PS3 개발이 힘들다고 투덜대지 않는다. 그냥 제작자들이 알아서 포기를 한 것인가? 아니면 실제로 뭐가 바뀐 것인가?
최근 칼럼을 보면 소니가 드디어 자사의 콘솔제작에 어려움을 겪는 제작자들의 고충을 인식하기 시작했다. 소니의 고급 기술자들이 다양한 라이브러리와 엔진을 좀 더 쉽게 개량한뒤 PS3 개발자들에게 보급했다. 또 현재 많은 제작들이 새로운 멀티쓰레드를 지원하는 엔진으로 옮겨가거나, 아예 새로운 엔진을 만들고 있다. 언리얼 엔진을 주목해보자면, 언리얼 엔진은 시간이 갈 수록 PS3에 좋아지고 있다.
이는 PS3가 많이 팔리면 팔릴 수록, 개발자가 PS3 개발에 투자하는 시간이 가치있게 만들어 주는 요인이 되고 있다. 이것이 PS3가 새턴이 다른 점이다. 이 비슷한 일이 PS2에서도 있었다. PS2도 개발하기 힘든 콘솔이다. PS2는 물론 멀티 프로세서는 없다. 하지만 그래픽 칩 디자인 약간 이상해서, 많은 개발자들이 개발에 불편을 토로해 왔다. 그래도 PS2는 수백만대가 팔렸고 돈을 벌려면 어쩔 수 없이 감내해야만 했다.
결국, 돈이 가장 큰 요소이다. 만약 제작하기가 대단히 어려운 콘솔이지만, 보급대수가 많은 게임기라면, 제작난이도는 큰 난관이 아니다. 만약 소니가 재빨리 가격인하를 단행하지 않았다면, 지금의 게임계는 많이 달라져 있었을 것이다.