데이터지역성 패턴 이거는 캐시친화적이게 코드를 바꾸는 것인데예를 들어서 포인터로 이루어진 변수들을 일반 배열로 바꾸어서 캐시 미스를 최소화하는 것이다. 이런 방식으로 cpu 동작까지 계산해서 코드 성능을 끌어올리는 것인데 위의 예시로도 수십배가 빨라질 수 있다고 한다.하지만 이것도 오버엔지니어링 될 수 있기 때문에 언제 어떻게 쓸지를 고민해야한다. 고급 프로그래머로 갈길이 먼 것 같다. 개발 지식/디자인패턴 2025.04.22
서비스 중개자 패턴 이것 역시 모듈간 결합도를 낮춰주는 패턴이다. 싱글턴이랑 비슷한 부분이 많은데, 이 패턴은 다른 모듈에서 audio시스템 등을 들고 있지않고 싱글턴처럼 get함수를 이용해 접근하여 사용한다. 이 점에서는 상당히 비슷한데 이 서비스중개자는 예를들어서 audio라는 인터페이스를 상속하는 playerAudio를 만들고다른 모듈에서는 audio 인터페이스만 노출시킬수 있다. 그리고 인상깊었던 사용법은 로그기능이다.게임을 개발하다보면 로그기능은 반드시 필요한데 이 기능은 시스템별로 껐다켰다 할 수 있다.싱글턴이라면 함수를 두개만들거나 주석으로 일일이 처리해야하지만 audio를 상속받는 playerAudio 와 LogPlayerAudio를 만들어서 서비스 중개자 클래스에 갈아끼우면 된다. logPlayerAud.. 개발 지식/디자인패턴 2025.04.22
이벤트 큐 패턴 이벤트 큐 패턴은 이벤트나 메세지를 즉각적으로 처리하지 않고 큐에 넣었다가 처리하는 방식이다.이 방식은 로직을 분리하여 모듈들을 디커플링하고 프레임 당 처리량을 제한할수도 있다. 정확히 어떻게 써야할지는 모르겠지만예시를 보면 사운드나 통신패킷 등에 사용하는 것 같다. 뭔가 한번에 트래픽이 폭주할때 이를 해결하기 위한 수단으로 쓰는것 같다.이런 문제가 발생했을 때 사용해봐야겠다. 개발 지식/디자인패턴 2025.04.22
컴포넌트 패턴 컴포넌트 패턴은 유니티에서 사용하고 그 패턴이다. 유니티에서 우리는 이미 만들어져 있는 여러가지 컴포넌트와 스크립트를 통해서 새로운 컴포넌트를 만든다.또한 getcomponent를 통해 다른 컴포넌트와 통신한다. 즉 유니티의 GameObject는 컴포넌트 패턴으로 만들어졌다. 이 패턴은 하나의 클래스의 크기가 아주 커지는 것을 방지하고 유지보수, 확장성을 모두 확보할 수 있게된다. 컨테이너 클래스는 컴포넌트 클래스의 포인터만 가지고 있으면서각 컴포넌트의 update만 실행시켜주면 된다. class Component{ virtual void update()=0;}class physicsComponent : Component{ virtual void update(){}}class renderComponen.. 개발 지식/디자인패턴 2025.04.22
타입 객체 패턴 이것도 사실 책을 읽어도 잘 모르겠다. 수많은 상속 클래스를 만들 때 클래스를 생성하지 않고 타입객체로 대체할 수 있는 방법이다. 타입 객체라는 것은 그냥 데이터를 통해서 값만 바꾼것이다.예를 들어class Monster{ int hp; string attack;}이게 있다고 하자.몬스터 종류마다 이 값이 전부 다를텐데 이를 하위클래스로 다 만드는 것보다 타입객체를 쓰는게 낫다고한다. class Breed{ int hp; string attack;}이렇게 만들고 이 클래스를 Monster에 추가한다.class Monster{ Breed breed; Monster() : hp(breed.hp),attack(breed.attack)}이런 방식이다. 근데 몬스터마다 동작이 달라지거나 하면 .. 개발 지식/디자인패턴 2025.04.21
샌드박스 메서드 패턴 상위 클래스에서 필요한 모든 기능을 제공해주고 하위클래스는 상위클래스하고만 커플링되며 필요한 부분만 구현한다. 이는 유니티의 기본적인 프레임워크에 사용된다. 유니티의 게임오브젝트는 Monobehavior를 상속받는데 여기에 많은 기능들이 이미 제공된다.또한 라이프 사이클 또한 정의되어있기 때문에 하위클래스에서 순서를 변경할 수 없다.따라서 정해진 순서를 유지할 수 있다. 또한 확장에도 아주 유리하다. UI를 예로 들면using UnityEngine;public abstract class UIPanelBase : MonoBehaviour{ public void Open() { gameObject.SetActive(true); OnOpen(); // 사용자 정의 확장 .. 개발 지식/디자인패턴 2025.04.21
바이트코드 바이트코드란 챕터를 책에서 읽었다. 뭔소린지 잘 모르겠어서 읽다가 넘겼는데 chatgpt의 도움을 받아 유니티에서 어떤식으로 연관성이 있나를 알아보았다. 먼저 바이트코드는 무엇이냐면 작성된 프로그래밍언어를 기계와 친화적인 언어로 바꾼 코드를 말한다. 이는 가상머신에서 실행되며 작성된 스크립트의 코드를 바이트코드로 바꿔 가상머신에서 실행해주는 것이 컴파일러이다. 아래는 chat gpt가 정리해준 내용이다. Unity를 사용하다 보면 가끔 "바이트코드", "IL2CPP", "Mono", "가상머신", "JIT/AOT" 같은 단어들을 접하게 됩니다.이 개념들은 성능, 플랫폼 대응, 빌드 최적화에 직접적으로 영향을 미치기 때문에 꼭 한 번은 정리하고 넘어가야 할 부분입니다. 유니티에서의 코드 실행 흐름[C.. 개발 지식/디자인패턴 2025.04.21
업데이트 메서드 패턴 이것도 게임루프패턴과 마찬가지로 게임에서는 계속 게임이 돌아가야한다. 그중 오브젝트들은 매번 동작을 위해서 업데이트가 되어야하는데, 수많은 오브젝트의 업데이트를 어떻게 관리할 것인가에 대한 것이 업데이트 메서드 패턴이다. 각 오브젝트에 update메서드를 만들고 각자 프레임당 처리할 코드를 작성해놓고메인로직에서 각 오브젝트의 update함수를 호출하는 방식을 사용한다. 이는 물론 상용엔진인 유니티에 구현이 되어있다. 우리가 아는 Update(), Start()함수등이 바로 그 예시이다. 개발 지식/디자인패턴 2025.04.21
게임 루프 패턴 게임 루프 패턴은 while(true){ input() update() render()}이런 구조의 루프를 말한다. 계속 실행되어야하기 때문에 업데이트와 렌더가 계속 이루어져야 하는데이 때 여러가지 고려해야할 사항들이 있다. 각 사용자들의 pc에 따라서 처리속도가 다르기 때문에 그것을 맞추는 것도 필요하고, 처리량 자체가 얼마냐 많은가에 따라서도 실행할수록 게임이 느려지거나 빨라진다. 이를 해결하기 위해서 여러 방법들이 고안되었다. 그런데 이러한 구체적인 방법들을 자세하게 알 필요는 없다. 직접 만드는 것이 아니면.상용엔진에는 이미 최적화된 루프가 구현되어있고 그것을 사용하면 된다. 하지만 어떤식으로 동작하는지를 이해하고 사용한다면 훨씬 효과적으로 개발을 할 수 있다고 생각한다. 그래서 유.. 개발 지식/디자인패턴 2025.04.21
이중버퍼 그래픽스에서 자주 사용되는 개념이다. 말그대로 버퍼를 두 개로 사용하며 하나는 그리는 용도, 다른 하나는 읽는 용도이다. 왜 쓰이나?대표적인 예시는 화면 깜빡임이다.하나의 버퍼라면 버퍼에 데이터를 저장도 해야하고 그 버퍼를 읽어서 그리기도 해야한다.그런데 저장하는 도중에 버퍼를 읽는다면 이상하게 그려지거나 깜빡임이 발생할 수 있다.따라서 버퍼를 두개로 사용하며 다른 버퍼를 읽는 동안 나머지 버퍼에 저장하는 것이다.그리고 다시 교체하는 방식이다. 포인터로 버퍼를 구현하여 current와 next 버퍼로 포인터만 교체하는 것이 깔끔하다고 한다. FrameBuffer* buffers[2];FrameBuffer* cur;FrameBuffer* next;void Swap(){ FrameBuffer* temp.. 개발 지식/디자인패턴 2025.04.21