UDP의 간단한 개념, 사용하는 이유, TCP와의 차이점을 알아보고 직접 C#으로 간단한 예제코드를 작성해서 동작 방식을 습득해보자.
TCP/IP 개념을 정리하면서 이해하고, 직접 C# 코드를 작성해서 습득한 내용을 글로 작성해봤습니다.
C# 유니티 개발을 하면서 자주 사용하는 컴포넌트 패턴에 대해서 고민하고 그와 연관된 '게임 오브젝트' 와의 연관성에 대해 공부해봤습니다.
디자인 패턴 중 하나로 싱글턴 패턴을 C# 예제 코드와 유니티에서 사용되는 방식을 글로 작성해봤습니다.
게임 서버 프로그래머를 결심하게 된 계기와 이유를 상기하기 위해 작성해봤습니다. 힘들어서 마음이 꺾일 때마다 다시 보고 마음을 다 잡기 위한 글입니다.
커맨드 패턴이란? 요청을 객체의 형태로 캡슐화하여 사용자가 보낸 요청을 나중에 이용할 수 있도록 메서드 이름, 매개 변수 등 요청에 필요한 정보를 저장 또는 로깅, 취소할 수 있게 하는 패턴이다.
Protobuf는 다양한 분야에서 사용된다는 것을 알게 되었습니다. 처음에는 게임 개발 쪽에서 주로 사용되는 것인줄 알았습니다. 구글링을 하면서 찾아보니까 AI 분야에서도 사용 된다고 합니다. 이런 Protobuf를 좀더 자세히 알기 위해, C# 게임 서버를 기준으로
유니티를 배울 때 스크립트 작성 시 제일 먼저 마주했던게 MonoBehaviour였습니다.처음에는 단순히 Main() 함수와 같이 entry point의 역할을 하는 줄 알았습니다. 하지만 MonoBehaviour를 통해 사용할 수 있는 다양한 이벤트 들이 있습니다.
C#으로 게임 서버를 만들면서 멀티 스레딩에 대한 이해도가 필요하다고 생각했습니다. 그렇게 공부를 하다가 동시성과 병렬성의 개념이 멀티 스레드 프로그래밍에 대한 이해를 도와줄 것 같아 이렇게 글로 작성해봤습니다.
멀티플레이 서버를 구축하고 클라이언트에서 빌드를 진행 후 다중 클라이언트를 구동하는 자동화 코드에 관한 글입니다. 자동화 코드를 통해 쉽게 다중 클라이언트를 실행해서 동기화 및 멀티플레이 환경 테스트가 가능합니다.
Race condition은 거의 모든 CS 책에서 나오는 개념입니다. 이런 Race condtion의 개념을 정리하고 문제점 그리고 다른 키워드와의 연결성을 정리해봤습니다.
게임 개발 관련 채용 공고를 보다가 CISC와 RISC에 대해 필수로 질문한다는 것을 봤습니다.그래서 왜 질문을 할까 고민하면서 자료를 찾아보게 되었습니다.
유니티에서 코루틴을 사용해서 카드 짝 맞추기 게임에서의 기능 중 하나를 구현해봤습니다. 단순히 구현하고 끝나는게 아니라 회고하고 다른 방법은 없을지 찾아보기 위해 글로 작성해봤습니다.
유니티에서 케릭터(오브젝트)를 움직이는 기능에 대해서 글로 작성하고 회고해봤습니다. 하나의 방법이 아닌 단순하게 구현하는 방법에서부터 더 부드럽게 케릭터가 움직이는 방법과 그 이유를 작성했습니다.
인프런 Rookiss님 유니티 엔진 강의(링크)를 듣다가 State(상태) 패턴에 대한 것이 나왔습니다.게임 개발에서는 State 패턴이 거의 필수지 않을까 생각했습니다.그만큼 중요도가 높고 많이 사용되기 때문에 이렇게 글로 정리하게 되었습니다.
스프링 프레임워크에서는 Jackson 라이브러리가 직렬화와 역직렬화 동작을 수행하는데 큰 도움을 줍니다. 하지만 이런 추상화 되어 있는 처리로 인해서 잘 몰랐던 직렬화와 역직렬화에 대해 알기 위해 글로 정리해봤습니다.
C#으로 아주 간단한 게임을 만들기 위해 스네이크 게임을 만들어 봤습니다. 현재 다니고 있는 개발 부트캠프에서 내준 과제여서 진행한 것도 있지만, 스네이크 게임을 구현하면서 지금까지 배웠던 것들을 꽤 많이 사용해볼 수 있는 좋은 기회라고 생각했습니다.
Listener란? Client의 접속을 받아들이는 Listner 객체를 얘기합니다. TCP 소켓 게임 서버를 구축할 때 Listner 객체로 정리할 수 있습니다. Listener의 역할을 클래스로 따로 빼서 구현하지 않고 구현해도 아래와 같이 가능합니다.
Func와 Action을 게임 서버에서 실제로 사용하는 사례와 코드를 통해 알아보았습니다. 단순히 개념적인 부분이 아니라 사용 이유를 자세히 알아볼 수 있었습니다.
세션이라는 키워드는 웹 개발에서도 자주 사용되는 키워드입니다. 게임 서버도 동일하게 세션이라는 키워드를 사용하고 그 개념에 맞게 서버 측에서 구현을 합니다. 이런 세션에 대해 더 잘 알고 게임 서버의 핵심 로직을 구현하는 방법을 알아봤습니다.
게임 서버 개발에서는 대부분 멀티 스레드 프로그래밍 방식을 사용합니다. 멀티 스레드를 알기 전에 우선 스레드를 좀 더 알아보고 주의해야 할 점들을 글로 작성해봤습니다.
컴파일러 최적화와 하드웨어 최적화를 통해 작성한 코드의 의도와 다르게 작동하는 경우가 있습니다. 이런 상황을 해결하기 위해 메모리 배리어를 사용해서 의도적으로 순서를 맞추는 방법이 있습니다. 이번에는 이런 메모리 배리어에 대해서 글을 작성해봤습니다.
멀티 스레드 코드를 추가 시 공유 자원에 대한 문제는 항상 따라다닌다고 합니다. 스레드가 프로세스와 달리 자원을 공유하는 영역이 있어서 편한것도 있지만, 이것이 양날의 검이 되어서 문제를 일으키게 됩니다. 이런 문제를 Interlocked로 해결할 수 있습니다.
임계 영역을 지정해서 Race condition에서 발생하는 문제를 Monitor 클래스로 좀 더 쉽게 해결할 수 있습니다. Monitor 키워드를 통해 파생되는 임계 영역, 상호 배제, 배타적인 Locking 등 다양한 키워드를 함꼐 공부해봤습니다.
어려운 개념인 Lock을 간단한 SpinLock 예제 코드와 함께 정리해봤습니다. SpinLock 코드를 직접 타이핑하고 실행하면서 멀티 스레드 환경에 대해 기초적인 부분을 이해할 수 있었습니다.
게임 서버를 구현하면서 동기화 이슈가 상당히 큰 비중을 차지한다는 것을 공부할수록 느끼게 되어 좀 더 공부하게 되었습니다. 멀티 스레드 프로그래밍에서 교착 상태(DeadLock)에 빠지게 되면 멀티 스레드 방식이 오히려 독이 될 수 있습니다.
GameObject.Find()의 문제점이 무엇인지 자료를 찾아보고 어떤 대안 방법이 있는지 찾아봤습니다. 그리고 팀 프로젝트에서 직접 적용하고 팀원에게 받은 피드백과 저의 생각을 적어봤습니다.
유니티에서 반복적으로 작성하던 싱글톤 코드를 제네릭을 사용해서 쉽게 해결할 수 있습니다.
네트워크에서 가장 기초 지식인 IP의 종류 중 공인 IP와 사설 IP에 대해 알아봤습니다. 이론뿐만 아니라 실질적으로 확인하는 방법과 C# 코드로도 확인할 수 있는 방법을 작성했습니다.
팀 프로젝트를 진행하면서 전부 Start() 함수에 초기 코드를 작성했었습니다. 하지만 가끔씩 NullReferenceException이 터졌을 때 Awake()에 코드를 옮겨서 해결했습니다. 이번에 이유를 알기 위해 글을 작성해봤습니다.
프로젝트를 진행하면서 케릭터의 무기와 같은 아이템 종류의 데이터를 Json으로 저장해서 관리하는 것을 구현했었습니다. 그런데 클라이언트와 서버 중에서 어디서 이런 데이터를 관리하면 좋을 지 한 번 각자의 관점에서 정리해봤습니다.
게임 개발 프로젝트를 하면서 나만의 서버를 구축해서 배포했었습니다. 그런데 로그를 확인해보니 해킹 시도가 확인되었습니다. 이런 해킹을 조금이라도 예방하기 위해 해외 IP를 차단하는 방법을 도입해봤습니다.
유니티에서 Nuget 패키지를 사용하기 위해 쉽게 세팅하는 방법을 작성해봤습니다.
게임 서버를 구축하면서 데이터를 일시적으로 보관하는 버퍼에 ArraySegment를 사용했습니다. ArraySegment는 배열의 일정 데이터를 참조할 수 있습니다. 이런 이점 때문에 Array 대신 ArratySegment를 사용해봤습니다.
게임 개발을 하면서 파일 시스템을 일부 사용해봤습니다. 그러면서 파일 시스템의 단점을 명확하게 알게 되고, 데이터베이스의 장점을 알게 되었습니다. 이번에 알게 된 내용을 글로 작성해봤습니다.
캐릭터와 벽(박스)에 콜라이더를 추가해도 벽을 통과하는 문제가 발생했습니다. 이 문제를 해결하면서 제가 배운 것들과 3 가지 해결 방법 들을 글로 작성해봤습니다.
멀티플레이 게임을 만들면서 테스트 시 게임 서버를 계속 껐다가 켜는 번거로움이 있었습니다. 팀 프로젝트를 할 때 다른 팀원들의 생산성도 떨어지는 문제가 되었습니다. 그래서 남는 노트북 컴퓨터에 게임 서버를 구축해서 해당 서버에 접속할 수 있도록 구축해봤습니다.
복잡도(Complexity)는 알고리즘의 성능을 나타내는 척도입니다. 시간 복잡도 : 특정한 크기의 입력에 대하여 알고리즘이 얼마나 오래 걸리는지 나타냅니다.
인터페이스(interface)란? 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다. 즉, 사용자 기기를 쉽게 동작시키는데 도움을 주는 시스템을 의미한다.
유니티에서 체력바를 간단하게 구현하는 방법입니다. 생각보다 간단하고 단순하게 구현을 할 수 있습니다.
게임 서버에서 비정상적으로 접속 해제를 하거나, 유령 세션으로 서버의 리소스를 잡아먹는 클라이언트를 접속 해제하는 시스템이 있습니다. 그것이 바로 Ping Pong 시스템입니다.
게입 개발을 하면서 계정 관련 처리를 ASP.NET Core에서 구현하고 있습니다. 그러던 중 Controller에 너무 많은 역할을 담당하고 있어서 Service와 Repository 패턴을 도입해서 결합도를 낮춰봤습니다.
ASP.NET Core에서 xUNit 테스트 프로젝트를 생성해서 단위 테스트를 작성해봤습니다. 테스트를 작성하는 이유와 그것을 바탕으로 제가 진행한 방법을 글이 담겨 있습니다.
의존성 주입은 디자인 패턴입니다. ASP.NET Core는 클래스와 해당 종속성 간의 IoC(Inversion of Control)를 실현하는 기술인 DI 소프트웨어 디자인 패턴을 지원합니다.