728x90
반응형

Game Development, 게임개발 182

게임의 근간인 게임 루프, Game Loop에 대해서

물론 이러한 디자인 패턴에 대해서 공부해봤다. [Game Developer, 게임개발자/디자인패턴] - Game Loop Pattern, 게임 루프 패턴 ** [디자인패턴] 하지만 조금 더 일반적인 이야기를 해보려고 한다. 게임 루프는 앞의 글처럼 게임 프로그램의 전체적인 흐름을 주관한다. 즉, 사용자가 임의적으로 중지하지 않는 한 게임은 계속 수행을 하는 것이다. 게임 루프는 말 그대로 LOOP, 계속 반복되어 진행된다. 일반적으로 우리는 60프레임으로 진행되는 게임을 많이 보는데 이는 게임루프가 초당 60번 실행된다는 뜻이다. 하지만 최신 하드웨어에 맞게 게임루프도 점차 변해가는데 우선 전통적으로 쓰여온 게임루프의 형식부터 알아보자. 전통적인 게임 루프 1. 입력 처리 2. 게임 업데이트 3. 출력 ..

Geometry Pipeline, 오브젝트부터 스크린까지의 변환

**21.11.11 업데이트 **21.12.22 업데이트 게임의 오브젝트가 우리 스크린 위에서 실제로 움직이기까지 정말 많은 과정을 거친다. 그 과정들은 Transformation이고 특히 좌표 변환이 엄청나게 이루어진다. -> 행렬의 계산은 은근히 연산이 많기에 이를 해결한다면 렌더링에 도움이 될 것 같다. 알아보자 우선 요약하자면 Local World (Model Space) World (Model Space) View (Camera Space) View (Camera Space) 정규 뷰 볼륨, Canonical view volume (Proejection) Canonical view volume Screen 순서대로 알아보자 3D 모델의 폴리곤 메시가 가진 모델 공간의 Local 좌표에서 Worl..

프로젝트 -3[Unity]

github.com/powerpower2005/MiniProject/tree/master 이 프로젝트로 얻고자하는 바 사용자 입력을 스크린에서 처리 기본적인 Physics + 부드럽게 움직이게하기(ex.Lerp) 배경효과 Parallax 적들의 움직임 구현 각 영역 히트효과 쉴드 기능 아이템 랜덤드랍 게임목표 wasd로 움직이며 space로 발사한다. 우주선과의 싸움에서 이겨 아이템을 먹으며 강해지자. 작업 내역 및 구현한 부분 Hero Input을 GetAxisRaw가 아니라 연속적으로 받는다. 이 값을 Rotation에 이용함 -> 2D로 보이는 게임이면서도 애니메이션 없이 이동하는 모션을 만듬 (z축 이용 3D) /////////////////////////////////////// Shield T..

프로젝트 -2 [Unity]

github.com/powerpower2005/MiniProject/tree/master 이 프로젝트로 얻고자하는 바 카메라이동 사용자 입력을 스크린에서 처리 기본적인 Physics + 부드럽게 움직이게하기(ex.Lerp) 배경효과 Trail효과 게임목표 투사체를 이용하여 공을 Goal에 도달하게하라. 지난 궤적을 이용하여 조금 더 정밀하게 쏘고 적은 횟수로 클리어하자. 작업 내역 및 구현한 부분 Follow Cam 요약: 앵그리 버드의 새가 날아가면 카메라가 새를 따라가는 것처럼 구현함 투사체가 발사되면 카메라가 따라감. 상세: Main Camera에서 static으로 gameobject를 선언해주고 Prefab을 Instantiate할 때 static 오브젝트에 할당해줌 카메라는 해당 static 오..

Data Locality, 데이터 지역성 [디자인패턴](최적화)

지역성이란 단어에서 알 수 있듯이 캐시와 관련되어 있다. CPU 캐시를 최대한 활용할 수 있도록 데이터를 배치해 메모리 접근 속도를 높이기 위함이다. 우리는 무어의 법칙으로 CPU 성능이 18~24개월마다 반도체 성능이 거의 2배로 증가한다고 그랬지만.. 이제 한계에 봉착했다. 즉, 우리는 있는 것을 더 잘 돌릴 수 있는 능력이 필요해졌다. 칩은 계속해서 연산 속도가 빨라지지만 데이터의 접근 속도는 그렇지 못했다. 즉, 캐시를 쓰는 것은 여전하다. 아무튼 각설하고 우리는 프로세서의 성능이 메모리의 성능보다 높아서 생기는 그 차이에 대한 비용을 어떻게 최소화할 것인가? 에 대해 생각해 봐야 한다. 우리가 회사 직원이라고 생각해보자 우리 업무는 숫자가 빽뺵이 쓰여있는 문서에 대해 작업한다. 이런 문서들은 해..

Spatial Partition, 공간분할 [디자인패턴](최적화)

이 패턴을 사용하는 의도는 객체를 효과적으로 찾기 위해 객체 위치에 따라 구성되는 자료구조에 저장하기 위함이다. 게임 자체는 다른 세상을 경험하게 해준다. 나는 현실의 한국 서울에 사는 대학생일지 몰라도 중세시대 성을 지키는 기사가 될 수도 있다. 하지만 몰입을 위해 실제 현실적인 것들을 게임에 다 반영하다보니 게임에서도 현실감을 느낄 수 있다. 이 말을 왜했느냐? 현실 감을 줄 수 있는 요소 중 하나인 위치, location(not position)에 대해 알아보려고 한다. 게임 월드에는 공간, space에 대한 개념이 존재해서 객체는 공간 어딘가의 위치에 존재하게 된다. 위치 개념은 여러 형태로 확인 가능하다. 가장 분명한 것은 객체가 움직이고 충돌하고 상호작용하는 물리이지만 다른 예도 있다. 오디오..

Event Queue, 이벤트 큐 [디자인패턴](디커플링)

이 패턴의 의도는 메시지와 이벤트를 보내는 시점과 처리하는 시점을 다르게 하기 위함이다. 큐라는 이름대로 실제로 큐를 이용한다. 이벤트와 큐는 각각 들어봤는데 이벤트 큐는 뭘까? 싶지만 그냥 이벤트가 들어있는 큐다. 걱정말자. 예를 들어 UI 프로그래밍을 해봤다면 이벤트에 대해서 조금이라도 더 알텐데 버튼 같은 것을 User가 누르면 이벤트가 발생하고 프로그램에서 해당 이벤트를 이용해 작동하는 형식이다. 다시 말해서 버튼 클릭이든 뭐든 프로그램과 상호작용을 위해 OS가 이벤트를 발생시켜서 프로그램으로 전달하는 것이다. 프로그램에서는 이벤트를 받아서 행위를 처리하도록 이벤트 핸들러, Event Handler에게 전달한다. 예를 들어 아래처럼 이벤트 루프가 있는 것이다. while (running) { Ev..

Component, 컴포넌트 [디자인패턴](디커플링)**

이 패턴을 사용하는 의도는 한 개체가 여러 분야를 서로 커플링 없이 다룰 수 있도록 한다. 완전 많이 쓰이는 패턴이다. 이것만큼은 잘 해보자. 플랫포머 게임을 만든다고 해보자. 플레이어 한 명을 정했다면 클래스를 하나 만들어서 주인공이 게임에서 하는 모든 것들을 넣는 것이 당연해 보인다. 플레이어를 조정해야 하니 컨트롤러 입력 값을 읽어 행동으로 바꿔야 한다. 지형이나 플랫폼 같은 레벨과도 상호작용할 수 있도록 물리 및 충돌 처리도 필요하다. 주인공이 화면에 나와야 하니 애니메이션과 렌더링도 넣자. 소프트웨어 구조 입문 수업에서 분야가 다른 코드는 서로 격리해야 한다고 배웠다. ** 클래스는 한 번에 하나의 역할만 하게끔 만드는 것이 OOP의 원칙이다. 예를 들어서 워드 프로세서라면 인쇄 코드가 문서를 ..

Type Object, 타입 객체 [디자인패턴](행동)

이러한 패턴을 만드는 의도는 클래스 하나를 인스턴스 별로 다른 객체형으로 표현할 수 있게 만들어서 새로운 "클래스들"을 유연하게 만드는 것이다. 이것은.. 객체지향프로그래밍의 원칙, SOLID에서 비슷한 것이 있었지 아마? ?? 왜..?? 게임에서 플레이어가 잡을 몬스터 무리를 구현해보자. 몬스터는 체력, 공격, 그래픽 리소스, 사운드 등 다양한 속성이 있다. 다만.. 예제에서는 체력과 공격 속성만 고려해보자. class Monster { public: virtual ~Monster() {} virtual const char* getAttack() = 0; protected: Monster(int startingHealth) : health_(startingHealth) {} private: int he..

Dirty Flag, 더티 플래그 [디자인패턴](최적화)

의도는 불필요한 작업을 피하기 위해 실제로 필요할 때까지 그 일을 미루는 것이다. 게으른 초기화랑 비슷한 느낌을 가지고 있다. 한 번 알아보자 많은 게임에서 월드에 들어있는 모든 객체를 장면 그래프라는 큰 자료구조에 저장한다. 렌더링 코드에서는 장면 그래프를 이용해서 어떤 것을 화면에 그려야 하는지를 결정한다. 장면 그래프를 가장 간단하게 만들겠다면 그냥 객체 리스트 하나만 있으면 된다. 모든 객체에는 모델 혹은 그래픽에 관련된 기본 단위 데이터와 함께 변환 값이 들어 있다. 변환 값은 객체의 위치, 회전, 크기 조절 (Position, Rotation, Scale) 등이 있다. 변환 값만 바꾸면 쉽게 객체를 옮기거나 회전시킬 수 있다. 렌더러가 객체를 그릴 때에는 먼저 객체 모델을 받아서 변환을 적용한..

728x90
반응형