분류 전체보기 239

바이트코드

바이트코드란 챕터를 책에서 읽었다. 뭔소린지 잘 모르겠어서 읽다가 넘겼는데 chatgpt의 도움을 받아 유니티에서 어떤식으로 연관성이 있나를 알아보았다. 먼저 바이트코드는 무엇이냐면 작성된 프로그래밍언어를 기계와 친화적인 언어로 바꾼 코드를 말한다. 이는 가상머신에서 실행되며 작성된 스크립트의 코드를 바이트코드로 바꿔 가상머신에서 실행해주는 것이 컴파일러이다. 아래는 chat gpt가 정리해준 내용이다. Unity를 사용하다 보면 가끔 "바이트코드", "IL2CPP", "Mono", "가상머신", "JIT/AOT" 같은 단어들을 접하게 됩니다.이 개념들은 성능, 플랫폼 대응, 빌드 최적화에 직접적으로 영향을 미치기 때문에 꼭 한 번은 정리하고 넘어가야 할 부분입니다. 유니티에서의 코드 실행 흐름[C..

업데이트 메서드 패턴

이것도 게임루프패턴과 마찬가지로 게임에서는 계속 게임이 돌아가야한다. 그중 오브젝트들은 매번 동작을 위해서 업데이트가 되어야하는데, 수많은 오브젝트의 업데이트를 어떻게 관리할 것인가에 대한 것이 업데이트 메서드 패턴이다. 각 오브젝트에 update메서드를 만들고 각자 프레임당 처리할 코드를 작성해놓고메인로직에서 각 오브젝트의 update함수를 호출하는 방식을 사용한다. 이는 물론 상용엔진인 유니티에 구현이 되어있다. 우리가 아는 Update(), Start()함수등이 바로 그 예시이다.

게임 루프 패턴

게임 루프 패턴은 while(true){ input() update() render()}이런 구조의 루프를 말한다. 계속 실행되어야하기 때문에 업데이트와 렌더가 계속 이루어져야 하는데이 때 여러가지 고려해야할 사항들이 있다. 각 사용자들의 pc에 따라서 처리속도가 다르기 때문에 그것을 맞추는 것도 필요하고, 처리량 자체가 얼마냐 많은가에 따라서도 실행할수록 게임이 느려지거나 빨라진다. 이를 해결하기 위해서 여러 방법들이 고안되었다. 그런데 이러한 구체적인 방법들을 자세하게 알 필요는 없다. 직접 만드는 것이 아니면.상용엔진에는 이미 최적화된 루프가 구현되어있고 그것을 사용하면 된다. 하지만 어떤식으로 동작하는지를 이해하고 사용한다면 훨씬 효과적으로 개발을 할 수 있다고 생각한다. 그래서 유..

이중버퍼

그래픽스에서 자주 사용되는 개념이다. 말그대로 버퍼를 두 개로 사용하며 하나는 그리는 용도, 다른 하나는 읽는 용도이다. 왜 쓰이나?대표적인 예시는 화면 깜빡임이다.하나의 버퍼라면 버퍼에 데이터를 저장도 해야하고 그 버퍼를 읽어서 그리기도 해야한다.그런데 저장하는 도중에 버퍼를 읽는다면 이상하게 그려지거나 깜빡임이 발생할 수 있다.따라서 버퍼를 두개로 사용하며 다른 버퍼를 읽는 동안 나머지 버퍼에 저장하는 것이다.그리고 다시 교체하는 방식이다. 포인터로 버퍼를 구현하여 current와 next 버퍼로 포인터만 교체하는 것이 깔끔하다고 한다. FrameBuffer* buffers[2];FrameBuffer* cur;FrameBuffer* next;void Swap(){ FrameBuffer* temp..

상태 패턴

사용자 입력에 따라 상태를 변환할 때 사용하는 패턴이다. FSM 이라는 유한상태기계를 구현하는 방법이다. 걷기, 점프, 달리기 등 여러 상태가 존재하는데 이를 분기문으로 처리하려면 bool변수도 그렇고 너무 복잡해진다.이를 상태에 따라 깔끔하게 구현가능하게 해주는 것이 상태패턴이다. 우선 열거형으로 상태를 정의할 수 있다. 그리고 이를 switch문으로 분기해서 코드를 모아둘 수 있다. 이정도로도 충분할 수 있지만 '게임 프로그램이 패턴' 책에서는 각 상태를 클래스로 만들었다. 상태 인터페이스를 만들고 각 상태는 이를 상속한다.interface heroState{ virtual void update() virtual void handleinput() static walkState; ..

싱글턴 패턴

싱글턴패턴은 가장 익숙한 패턴이 아닐까 싶다. 처음 게임구조를 익히면서 가장 먼저 접하게 되는 것 같다.특히 매니저라는 이름의 클래스를 만들 때 항상 봤던 것 같고, 나도 항상 사용해왔다. 싱글턴은 무엇인가?단 하나의 인스턴스만 있게하고 싶고, 동시에 전역적인 접근이 필요할 때 싱글턴 패턴을 사용한다. 이는 static instance 와 생성자를 private으로 둠으로써 해결한다. 이런 특징으로 manager로서 많이 사용이 된다. 하지만 '게임프로그래밍 패턴'의 저자인 로버트 나이스트롬은 자신은 싱글톤을 사용한 적이 없다며지양해야 한다고 말했다. 이유인 즉, 회사에서는 여러사람이 관리하며 최대한 커플링되지 않아야 한다. 그러나 전역적인 접근은아무것도 모르는 신입이 잘 짜여진 구조를 유지하려는 생..

관찰자 패턴

옵저버패턴이라고도 불리는 이 패턴은 아주 흔하게 사용된다.C#에서는 event 로 이미 사용하고 있던 패턴이다. 이는 상관없는 코드 덩어리들의 결합도를 낮추기 위함인데, event에 함수를 등록해 놓으면 특정상황 발생 시, 알아서 함수를 실행 시켜준다. event DeathEvent;void playerDeath(){ DeathEvent.Invoke();}class uimanager{ public uimanager() { DeathEvent += UpdateUI; } UpdateUI(){}}이렇게 += 로 등록할 수 있다. 그러면 플레이어가 죽어서 playerDeath 함수가 실행되면 DeathEvent에 함수를 등록한모든 클래스에서 해당 함수가 실행된다. 이 때, 등록한..

경량 패턴

경량패턴은 메모리 최적화를 위한 패턴이다. 많은 객체를 생성해야할 때, 에를 들어, 나무 오브젝트를 생성할 때, texture와 model은 동일하지만 위치와 색 등을 바꿔 숲을 만들 수 있다. 이 때, 100개의 나무라면 텍스처와 모델도 100개가 생성되는데, 동일한 이 백개를 공유데이터 1개로 대체하여 메모리를 최적화하는 것이다. 이 때, texture, model 같은 공유되는 데이터를 내부상태라 하고, 위치, 값 등 달라지는 변수를 외부상태라 한다. 내부 상태는 모든 나무 객체가 참조하게끔 하고 외부상태만 설정하게끔 하면 된다. 타일도 마찬가지로 고유한 타일의 값, 텍스처, 이 타일위에서의 캐릭터 이동속도 등은 변하지않는다. 그렇지만 위치는 매번 다르다. 따라서 각 타일마다 객체를 하나씩 ..

명령 패턴

작업의 요청자와 수행자를 분리시켜주는 디자인 패턴이다. 때문에 결합도를 낮추고 큐나 스택을 이용해 명령 취소, 되돌리기 등의 기능도 쉽게 구현할 수 있다. 상위 클래스인 Command라는 것을 만들고 멤버함수로 execute 라는 가상함수를 만든다. 그리고 그 하위클래스에서 이를 오버라이딩해서 다른 곳에서 execute를 실행한다. 따라서 요청자는 이 작업에 대해서 실행해줘라고만 하고, 수행자인 Command의 하위클래스는 로직을 실행하게 된다 . 이는 게임개발에서 사용자입력, ai 행동, undo, redo 등 사용된다. public interface ICommand{ void Execute();}public class MoveCommand : ICommand{ private Charac..

유니티 렌더링 파이프라인

유니티에서는 Built - in 렌더링 파이프라인을 사용한다.  먼저 씬이 구성되고 Camera가 렌더링 준비를 한다.  Culling 과정을 거치는데 GPU로 보내기전에 화면에 보이지 않는 오브젝트를 제거한다.1. Frustum Culling : 카메라 시야 밖 오브젝트 제거2. Occlusion Culling : 다른 오브젝트에 가려진 오브젝트 제거 사용될 Shader, Material, Light를 설정하고 GPU에 보낸다.  Draw Call 한다. Gpu에 이걸 그려라하고 전달하는 것이다. vertext 같은 메시데이터가 이 때, GPU에 올라간다. 조명 및 그림자 계산을 하고 Shader를 실행한다. 후처리 (Post Processing) 을 진행한다. 마지막으로 GPU가 계산한 최종 이미지를..

면접관련 질문 2025.04.12