게임 이론: CPU와 GPU (1)
1. CPU
CPU는 게임에 관련된 데이터를 어떻게 다룰 것인지를 담당합니다. 즉, CPU는 게임기의 핵심 역할을 합니다.
프로그램은 게임이 실행될 때 메모리에 배치됩니다. 그러면 CPU는 메모리상의 프로그램 위치를 확인하고 내용을 참조하면서 동작합니다.
2. 메모리상의 프로그램
게임을 실행하기 위해서는 다양한 동작과 처리가 필요합니다. 예를 들어, 3D 액션게임과 같은 경우, 플레이어의 이동, 공격, 적의 이동, 공격, 배경 화면 처리, 공격 효과 처리, 사운드 관련 처리 등이 있습니다. 이러한 처리를 순서대로 끝내면 처음부터 다시 시작하게 됩니다. 이와 같이 반복되는 과정을 루프라고 하고, 그 중 메인이 되는 것을 메인 루프라고 합니다.
메인 루프를 중심으로 각각의 처리를 불러오는 것이 게임의 기본적인 구조입니다. 반면에 루프에서 처리를 불러오는 것이 아닌 직접적인 구조로 구성을 하는 경우도 있습니다.
최근의 게임들은 불러오기 처리 장소를 개별적으로 만든 뒤 불러오는 것이 더 간단하고 프로그램의 메모리 사용량을 낮출 수 있으며, 오류가 있을 때에도 문제점을 파악하기 쉽습니다.
예를 들어, 액션게임에서는 적과 유저 사이 간 충돌 판정이 존재합니다. 이 판정을 적과 유저에 따로 두는 것이 아닌 두 곳에서 충돌 판정을 맡는 구간을 불러오는 것이 되겠습니다.
3. 오버레이
오버레이는 기존에 데이터가 있던 메모리에 다른 데이터를 덮어씌우는 것을 말합니다. 이것을 이용하여 메모리를 최적화할 수 있습니다.
게임에는 타이틀 화면과 엔딩 화면이 있습니다. 이 둘은 동시에 쓸 일이 없으므로 메모리에 이 두 화면의 데이터를 모두 집어넣는 것은 비효율적이라고 할 수 있습니다.
따라서 타이틀 화면이 표시될 때에는 타이틀 화면 관련 데이터를 메모리에 배치하고, 엔딩이 표시되어야 할 때에는 타이틀 화면 데이터가 있는 메모리에 엔딩 처리를 하는 데이터를 덮어씌웁니다.
이를 통해서 메모리를 절약할 수 있지만, 주의해야 할 점도 존재합니다. 먼저, 그래픽 데이터 등에 비해서 프로그램 크기가 작아서 많은 양의 메모리가 절약되지는 않습니다. 또, 디버깅이 어려워지거나 오류의 원인이 되기도 합니다. 이렇기 때문에 오버레이는 특별한 경우를 제외하고는 사용하지 않습니다.
4. 메인루프의 시작과 끝
메인루프의 처음에서는 제어기의 입력을 받습니다. 입력 정보에 따라 처리 순서가 크게 달라질 수 있기 때문입니다.
아래 사진은 제어기 입력이 루프 중간에서 처리될 때를 보여준 것입니다.
그리고 다음은 제어기 입력이 처음에 처리될 때입니다.
제어기 정보를 받는 타이밍이 다르면 사용자의 조작감이 떨어져 재미있는 게임이 될 수 없습니다. 또한 화면상 플레이어나 적의 이동량도 달라질 뿐더러 카운트다운도 규칙적이지 않게 될 것입니다.
이러한 문제는 메인 루프의 마지막에 '어떠한 처리'를 할지에 따라 해결할 수 있습니다. 즉, 동일한 타이밍에 마지막 처리를 하게 만들도록 대기시키는 것입니다.
5. 수직동기와 프레임
수직동기란 1/60초의 주기로 디스플레이에서 발생되는 특정 신호입니다. 수직 동기가 시작되는 시점은 화면이 바뀌는 라인의 화면 가장 아래에 도달할 때입니다. 디스플레이는 왼쪽 위에서부터 화면이 바뀝니다.
수직동기가 시작되는 순간에는 디스플레이 화면 가장 아래(표시되는 화면을 넘어 아래쪽 일부)가 바뀌고 있습니다. 표시되는 화면 끝자락부터 그 구간까지를 수직동기 구간이라고 합니다.
이와 같이 수직동기에 기초한 1/60초라는 시간을 기본단위로 게임 처리 루프를 반복하는데, 이 기본단위를 프레임이라고 합니다. 만약 처리가 1/60초를 넘는다면 다음 수직동기를 기다리며 1/30초라는 시간을 소비하게 됩니다. 이와 같은 상태를 처리지연 혹은 딜레이라고 합니다.
6. 30fps
1프레임의 단위를 1/60초라고 했을 때, 이 시간은 매우 짧아 캐릭터의 움직임이 매우 매끄럽게 움직일 것입니다. 그러나 게임에 따라서 이런 높은 프레임이 필요가 없고 루프 내에서 처리해야 할 것이 많은 게임들은 수직동기를 한 번씩 건너뛰어 1/30초마다 받기도 합니다.
프레임 정보를 표시하는 단위로는 'frames per second'의 약자는 fps를 사용합니다. 단위시간에 해당하는 프레임 수를 프레임 레이트(frame rate)라고 하며, 게임 도중에 변경할 수 있습니다.
CPU는 게임에 관련된 데이터를 어떻게 다룰 것인지를 담당합니다. 즉, CPU는 게임기의 핵심 역할을 합니다.
프로그램은 게임이 실행될 때 메모리에 배치됩니다. 그러면 CPU는 메모리상의 프로그램 위치를 확인하고 내용을 참조하면서 동작합니다.
2. 메모리상의 프로그램
게임을 실행하기 위해서는 다양한 동작과 처리가 필요합니다. 예를 들어, 3D 액션게임과 같은 경우, 플레이어의 이동, 공격, 적의 이동, 공격, 배경 화면 처리, 공격 효과 처리, 사운드 관련 처리 등이 있습니다. 이러한 처리를 순서대로 끝내면 처음부터 다시 시작하게 됩니다. 이와 같이 반복되는 과정을 루프라고 하고, 그 중 메인이 되는 것을 메인 루프라고 합니다.
메인 루프를 중심으로 각각의 처리를 불러오는 것이 게임의 기본적인 구조입니다. 반면에 루프에서 처리를 불러오는 것이 아닌 직접적인 구조로 구성을 하는 경우도 있습니다.
최근의 게임들은 불러오기 처리 장소를 개별적으로 만든 뒤 불러오는 것이 더 간단하고 프로그램의 메모리 사용량을 낮출 수 있으며, 오류가 있을 때에도 문제점을 파악하기 쉽습니다.
예를 들어, 액션게임에서는 적과 유저 사이 간 충돌 판정이 존재합니다. 이 판정을 적과 유저에 따로 두는 것이 아닌 두 곳에서 충돌 판정을 맡는 구간을 불러오는 것이 되겠습니다.
3. 오버레이
오버레이는 기존에 데이터가 있던 메모리에 다른 데이터를 덮어씌우는 것을 말합니다. 이것을 이용하여 메모리를 최적화할 수 있습니다.
게임에는 타이틀 화면과 엔딩 화면이 있습니다. 이 둘은 동시에 쓸 일이 없으므로 메모리에 이 두 화면의 데이터를 모두 집어넣는 것은 비효율적이라고 할 수 있습니다.
따라서 타이틀 화면이 표시될 때에는 타이틀 화면 관련 데이터를 메모리에 배치하고, 엔딩이 표시되어야 할 때에는 타이틀 화면 데이터가 있는 메모리에 엔딩 처리를 하는 데이터를 덮어씌웁니다.
이를 통해서 메모리를 절약할 수 있지만, 주의해야 할 점도 존재합니다. 먼저, 그래픽 데이터 등에 비해서 프로그램 크기가 작아서 많은 양의 메모리가 절약되지는 않습니다. 또, 디버깅이 어려워지거나 오류의 원인이 되기도 합니다. 이렇기 때문에 오버레이는 특별한 경우를 제외하고는 사용하지 않습니다.
4. 메인루프의 시작과 끝
메인루프의 처음에서는 제어기의 입력을 받습니다. 입력 정보에 따라 처리 순서가 크게 달라질 수 있기 때문입니다.
아래 사진은 제어기 입력이 루프 중간에서 처리될 때를 보여준 것입니다.
그리고 다음은 제어기 입력이 처음에 처리될 때입니다.
제어기 정보를 받는 타이밍이 다르면 사용자의 조작감이 떨어져 재미있는 게임이 될 수 없습니다. 또한 화면상 플레이어나 적의 이동량도 달라질 뿐더러 카운트다운도 규칙적이지 않게 될 것입니다.
이러한 문제는 메인 루프의 마지막에 '어떠한 처리'를 할지에 따라 해결할 수 있습니다. 즉, 동일한 타이밍에 마지막 처리를 하게 만들도록 대기시키는 것입니다.
5. 수직동기와 프레임
수직동기란 1/60초의 주기로 디스플레이에서 발생되는 특정 신호입니다. 수직 동기가 시작되는 시점은 화면이 바뀌는 라인의 화면 가장 아래에 도달할 때입니다. 디스플레이는 왼쪽 위에서부터 화면이 바뀝니다.
수직동기가 시작되는 순간에는 디스플레이 화면 가장 아래(표시되는 화면을 넘어 아래쪽 일부)가 바뀌고 있습니다. 표시되는 화면 끝자락부터 그 구간까지를 수직동기 구간이라고 합니다.
이와 같이 수직동기에 기초한 1/60초라는 시간을 기본단위로 게임 처리 루프를 반복하는데, 이 기본단위를 프레임이라고 합니다. 만약 처리가 1/60초를 넘는다면 다음 수직동기를 기다리며 1/30초라는 시간을 소비하게 됩니다. 이와 같은 상태를 처리지연 혹은 딜레이라고 합니다.
6. 30fps
1프레임의 단위를 1/60초라고 했을 때, 이 시간은 매우 짧아 캐릭터의 움직임이 매우 매끄럽게 움직일 것입니다. 그러나 게임에 따라서 이런 높은 프레임이 필요가 없고 루프 내에서 처리해야 할 것이 많은 게임들은 수직동기를 한 번씩 건너뛰어 1/30초마다 받기도 합니다.
프레임 정보를 표시하는 단위로는 'frames per second'의 약자는 fps를 사용합니다. 단위시간에 해당하는 프레임 수를 프레임 레이트(frame rate)라고 하며, 게임 도중에 변경할 수 있습니다.
댓글
댓글 쓰기