반응형

분류 전체보기 1418

Part 4-5-5. Job Queue : Job Queue #2

Job Queue 지난 시간에는 Action과 람다식을 이용해 함수를 직접적으로 실행하는 것이 아닌, 스레드에게 일감을 주는 형태로 변경하는 시간을 가졌다. 오늘은 똑같이 동작하지만 수동적으로 Task를 만들어주는 수동적인 방법에 대해서 알아보도록 한다. 📧 Task Queue Task Queue라는 새로운 클래스를 서버 프로젝트 밑에 새롭게 생성하고 interface ITask를 새롭게 생성해준다. 이 후 Excute()라는 메소드를 생성해준다. 일 처리가 필요한 함수(Enter, Leave, BroadCast 등)에 맞도록 클래스를 새롭게 만들어준다. 예시로는 BroadCast를 만들어 볼것이다. 아래와 같이 작성하여 필요한 변수와 값들을 담아주도록 하자. 이전 시간처럼 실행시켰던 BroadCast ..

Part 4-5-4. Job Queue : Job Queue #1

Job Queue 지난 시간에는 디자인 패턴 중 커맨드 패턴에 대해서 학습하는 시간을 가지었다. 커맨드 패턴은 사용자의 요구사항을 객체로 캡슐화하여 일감을 처리하는 스레드에게 던져준다고 이해하면 될 것같다. 오늘은 학습한 커맨드 패턴을 활용하여 Job Queue를 마저 구현해보자. 🧱 JobQueue 우선 Server 영역에 JobQueue 라는 클래스를 새롭게 만들어준다. 해당 클래스를 다른 곳에서도 사용하기 위하여 Public 으로 변경해주고, IJobQueue 라는 Interface를 만들어 해당 인터페이스를 상속 받도록 설정해준다. 📏 Interface 일감을 밀어 넣기 위한 함수 Push()를 새롭게 만들어주고, 이 행위 자체를 넘겨주기 위해 Action을 매개변수로 이용하여 사용한다. 📏 Jo..

Part 4-5-3. Job Queue : Command 패턴

Job Queue 지난 시간에는 채팅 테스트를 인원 수(1, 10, 100명)를 설정한 후 직접 실행해보는 시간을 가졌다. 이 때 인원이 늘어남에 따라 나타나는 부하의 문제점을 확인하였다. 이를 처리하기 위한 기능이 Job, Task인 것을 알았으니 오늘은 이를 학습해보는 시간을 가져보자. 😎 🖥️ Command Pattern 지금 작성한 스크립트의 문제점은 쓰레드가 일감을 받으면, 아래 이미지와 같이 다른 사람에게 일을 시키는 것이 아닌 일감을 받음과 동시에 이를 처리까지 모두 하고 있는 것이 문제되는 것이다. 이 때 lock의 특성까지 더 해져 한번에 하나의 쓰레만을 이용하여 일을 진행하다보니, 대기하는 쓰레드들이 쌓이는 것이다. 그래서 이를 해결하기 위해서는 아래 이미지와 같이 다른 쓰레드들은 Qu..

Part 4-5-2. Job Queue : 채팅 테스트 #2

Job Queue 지난 시간에는 채팅 테스트를 위한 GameRoom을 만들고, 입장, 나가기, 전송하기 등의 기능을 구현해주었다. 또한 SessionManager를 새롭게 만들어, 이를 통해 세션을 생성해주고 관리해주도록 하였다. ⛈️ Client Session 현재 클라이언트에서는 한 명의 유저만 접속하고 있는 상황이므로, 이를 다수의 유저들이 접속하는 상황으로 가정하고 변경할 것이다. 🐦‍⬛ Server Session 서버쪽과 동일하게 클라이언트 세션에도 Manager를 만들어주어 직접적으로 세션을 생성하는 것이 아닌 Manager를 통해 제작하고 넘겨주는 방식을 통해 작동하도록 하자. 변경 전, 후 🐦‍⬛ SessionManager 제작 서버에서 작업했던 것과 동일한 방식으로, 싱글톤 형식을 이용해..

Part 4-5-1. Job Queue : 채팅 테스트 #1

Job Queue 지난 시간에는 드디어 Packet Generator의 작업이 모두 끝났다. 🤯 자동화 과정이 조금 지루하긴 했지만, 코드 그 자체를 string 변수에 담아 패킷 별로 구분하여 {0}, {1}을 이용해 생성해주는 방식은 정말 듣도 보도 못한 과정이었다. 이걸 보니 취준생일 때 부터 지금까지 꾸준하게 날 가르쳐주고 있는 루키스님이 새삼 대단하고 느껴지네. 😂 ⛳ 추가 개선 예전에 작성해두었던 ServerCore 프로젝트 내 Session 클래스 안에 RegisterSend(), OnSendComplete() 메서드를 다시 확인해보자. 해당 메서드는 중간에 접속이 끊겼을 때에 대한 처리가 없어 위와 같이 진행된다면 틀림없이 문제가 생길 것이다. 🚦 RegisterSend() Register..

Part 4-4-11. 패킷 직렬화 : Packet Generator #6

패킷 직렬화 지난 시간에는 ClientSession 에서 패킷을 받을 때 패킷 종류에 따라 처리를 달리 하는 방식을 Switch 문으로 처리하였지만, 시간이 지나면서 패킷의 종류가 늘어날수록 비효율적인 구조가 되기에 이를 패킷의 형식에 맞게 처리해주는 구조로 변경해주었다. 🩺 Packet Manager 자동화 이제 지난 시간에 제작한 구조들을 자동화 코드로 변경하고자 한다. 📿 ManagerFormat 추가 자동화를 위해 PacketFormat에 managerFormat을 선언하고, 기존에 작업하던 코드들을 가져온다. 여기서 Register의 부분은 어떠한 패킷이냐에 따라 처리 방식이 다르기에 {0}으로 선언하여 설정한 후, 추후 데이터를 넣는 방식으로 접근한다. 📿 managerRegisterForma..

Part 4-4-10. 패킷 직렬화 : Packet Generator #5

패킷 직렬화 지난 시간에는 Client/Server Session 에서 사용하는 GenPackets의 내용을 수정할 때 마다 매 번 세션에 복사, 붙여넣기 해주던 작업을 ~.bat (=배치파일)을 만들어 실행시켜주는 방법을 통해 자동화를 하였다. 추가적으로 이제 더 무엇을 자동화 하여야할까? 를 생각해보며 오늘 학습을 이어나가 보자. 👚 OnRecvPacket 개선 기존에 사용하던 OnRecvPacket 스크립트는 아래와 같다. 이를 자세히 살펴보면 ClientSession의 OnRecvPacket에서 받은 패킷 ID를 통해 Switch 문에서 검사를 해주어 작업을 진행하였다. 하지만 가면 갈수록 패킷의 종류는 다양해질 수 밖에 없기 때문에 수 많은 Switch 문을 거치는 로직은 비효율적일 수 밖에 없..

Part 4-4-9. 패킷 직렬화 : Packet Generator #4

패킷 직렬화 지난 시간에는 Packet Id가 담긴 Enum을 포함하여 FileFormat을 새롭게 추가하고, 또 byte 처리와 이중 list를 처리하는 로직도 추가하였다. 마지막으로 추가한 로직이 정상적으로 잘 작동하는지 실행해보며 확인하는 시간을 가져 자동화 하는 과정을 조금 더 완성시켰다. 📜 PDL 문서 자동화 지난 시간까지 우리는 PDL 파일을 수동으로 생성해주고, 이를 복사한 뒤 Debug 폴더에 넣어주는 방식으로 작업을 진행하고 있었다. 그러나 이제는 직접 파일 경로를 지정하여 원본을 참조하는 방식으로 구현을 변경할 것이다. 방법은 크게 어렵지 않다. 저장 경로를 나타내는 pdlPath를 생성해주어 이를 활용하여 처리해준다. 이 후, Create 메서드를 실행 할 때 pdlPath를 입력하..

Part 4-4-8. 패킷 직렬화 : Packet Generator #3

패킷 직렬화 지난 시간에는 Packet Generator를 이용하여 패킷 처리 코드를 자동화 하는 작업을 해보았다. 또한 완성된 코드를 기존 코드에 대체해보며 정상적으로 코드가 실행되는지 테스트해보았다. 오늘도 지난 시간에 이어 자동화 코드를 보다 개선해보도록 하자. 💘 FileForamt 코드를 계속해서 수정하는데, 이를 매번 Client Session, Server Session에 복사, 붙여넣기 하는 작업 또한 귀찮아진다. 따라서 해당 과정도 파일의 내용을 참조하여 사용해 자동화 하는 과정을 만들 수 있다. 이를 처리하기 위해서는 PacketFormat 스크립트 내부에 몇 가지 코드를 더 작성해야 하므로 먼저 그 작업을 처리해보자. 🖋️ Using 처리 파일을 통째로 가져와서 사용하기 위해서는 us..

Part 4-4-7. 패킷 직렬화 : Packet Generator #2

패킷 직렬화 지난 시간에는 Packet Generator를 이용하여 패킷 자동화를 어떻게 하면 구성하고, 사용할 수 있는가? 에 대해서 개념 이해를 가지는 시간을 가졌다. Xml 파일에 담긴 데이터를 읽어와 각 타입별로 적합하게 변환하는 작업이 굉장히 유용하여서 추후 다른 프로젝트에서도 필요하다면 사용할 수 있어보인다. 🫵 GenPackets.cs 🧗‍♀️ 파일 생성 using (XmlReader x = XmlReader.Create("PDL.xml", settings)) { x.MoveToContent(); while (x.Read()) { if (x.Depth == 1 && x.NodeType == XmlNodeType.Element) ParsePacket(x); } File.WriteAllText(..

Part 4-4-6. 패킷 직렬화 : Packet Generator #1

패킷 직렬화 지난 시간에는 직렬화, 역직렬화를 마무리 하는 시간을 가졌다. 이를 통해 숫자, 문자, 구조체, 리스트 등 다양한 형태의 자료형들을 어떠한 방법으로 인코딩하여 패킷을 보내주고, 이를 수신하여 읽을 때 어떻게 역직렬화 하여 데이터를 처리하는 지 알아보았다. 즉 Packet 하나를 만들어 Session에 대해서 학습하였다. 오늘 학습은 이러한 패킷들을 자동화하여 처리하는 Packet Generator에 대해서 알아보도록 하자. 📪 Packet Generator 자동화는 지금까지 하드코딩으로 진행하며 작업했던 것들을 자동화하여 처리하는 것을 뜻한다. 여태껏 Session을 만들어 줄 때 자료형을 하나하나 입력해주어서 만들어 주었지만, 이제 Packet Generator를 통해 자동화 처리를 한다...

Part 4-4-5. 패킷 직렬화 : Serialization #4

패킷 직렬화 지난 시간에는 ushort, int 자료형과 같이 크기가 정해져 있는 자료형과는 다른 string 자료형의 패킷 Write, Read에 대해서 알아보았다. 이는 크게 2가지의 방법으로 나뉘어져 있는데, 먼저 String Packet의 사이즈를 확인하고 그 다음 내부 데이터 값을 전송하는 방법이었다. 그렇다면 오늘은 String에서 더 나아가 List 자료구조를 보낼 때에는 어떻게 처리해야 하는지에 대해서 학습해본다. 💷 List Packet 그렇다면 List Packet은 어떻게 넘겨줄 수 있을까? 예시를 들어 설명하기 위해 기존에 작업하던 PlayerInfoReq 클래스에 새로운 List를 추가하자. public List skills = new List(); { } public struct..

Part 4-4-4. 패킷 직렬화 : Serialization #3

패킷 직렬화 지난 시간에는 유니코드와 인코딩의 기본적인 개념과 UTF-8, 16의 개념 및 차이점에 대해서 알아보았다. 이러한 지식을 바탕으로 오늘 배울 문자열 처리를 잘 학습해보자. 🧐 🚩 코드개선 Session Write 기존 코드는 아래 이미지와 같이 new Span을 사용하여 packetId, playerId 값을 세그먼트에 넘겨주었다. 이 부분을 보다 가독성 좋고 효율적으로 변경할 수 있다. 바로 매번 Span 변수를 사용하는 것이 아닌 Span 변수를 한번만 호출하고 선언하여 세그먼트의 값을 받아와 Span의 Offset 값만 변경하며 필요한 값들을 byte 타입으로 변경시켜 줄것이다. 변경된 코드를 보면 Span span을 선언하여 사용한다. 또한 기존 코드에서는 각 패킷의 사이즈를 하드코딩..

Part 4-4-3. 패킷 직렬화 : UTF-8 vs UTF-16

패킷 직렬화 지난 시간에는 Send(=Write)와 Recv(=Read) 두 메서드를 Packet이라는 최상위 부모 객체에 abstract로 선언하여 이를 각자의 패킷(PlayerInfoReq)에서 override 하는 작업을 통해 또 한번의 개선을 진행했다. 이번 시간에는 Serialization에 더 자세하게 알아보기 전에 인코딩과 UTF-8, 16에 대해서 알아보자. 🍦 유니코드 유니코드(Unicode)란? 유니코드는 글자들의 특별한 번호표 같은 것이다. 예를 들어, "A"는 유니코드에서 특정한 번호를 가지고 있고, "가"라는 한글도 또 다른 번호를 가지고 있다. 🧐 왜 이런 번호를 가지게 되었을까? 1. 글자를 쉽게 구분하기 위해 * 유니코드는 전 세계의 거의 모든 글자들을 포함하고 있습니다. 각..

스티커 메모 핸드폰으로 확인하기

❗ 24.03.07 기준 1. 구글 플레이스토어에서 'Microsoft 365 (Office)' 설치하고 실행한다. 2. 앱 하단에 OneDrive, 캡처, Copilot, 만들기, 앱 중 앱을 선택한다. 3. 밑으로 내리다 보면 '노트' 항목이 있다. 해당 탭을 클릭한다. 4. 윈도우에서 작성한 내 스티커 메모를 확인한다. ❗ 23.12.04 기준 1. 구글 플레이스토어에서 'Microsoft 365 (Office)' 설치하고 실행한다. 2. 앱 상단에 최근/장치/검사/즐겨찾기와 같은 항목이 나와있는데 해당 항목을 오른쪽으로 넘겨준다 3. 넘겨주다 보면 노트 탭이 있다. 4. 해당 탭을 클릭하여 윈도우에서 작성한 내 스티커 메모를 확인한다. 인터넷에 검색해보니 죄다 과거 OneNote 앱 기준으로 나와..

기타/기타 2023.12.04

[뒤끝 강의] 온라인 게임 개발 #02 - 유저 관리 기능을 이용한 로그인

뒤끝 이번 시간에는 '게임 유저 관리' 기능을 이용한 로그인을 배웁니다. 다만 학습하기 전 뒤끝에서 제공하는 함수는 크게 동기, 비동기, SendQueue로 호출할 수 있습니다. 각각에 대해서 먼저 알아보도록 하겠습니다. 🧐 동기 비동기 SendQueue 비동기 호출을 위한 처리 BackendManager 스크립트를 다음과 같이 수정합니다. using UnityEngine; using BackEnd; // 뒤끝 SDK public class BackendManager : MonoBehaviour { private void Awake() { // Update() 메소드의 Backend.AsyncPoll() 호출을 위해 오브젝트 파괴 방지 DontDestroyOnLoad(gameObject); // 뒤끝 서..

[뒤끝 강의] 온라인 게임 개발 #01 - 뒤끝 SDK 설치 및 준비

뒤끝 뒤끝 계정 생성 및 프로젝트 생성에 관한 내용은 따로 작성하지 않는다. 😜 유니티 프로젝트 생성 및 설정 유니티 허브에서 새로운 프로젝트를 생성한 뒤 뒤끝 홈페이지에서 문서 - 뒤끝 SDK를 눌러 최신 버전의 뒤끝 SDK를 다운로드 받는다. 이 후 다운로드한 패키지 파일을 유니티 프로젝트에 임포트 한 후 Unty - The Backend - Edit Setting을 눌러준다. 뒤끝 콘솔에서 생성한 프로젝트에 들어 간 후 인증 정보 탭에 들어가 Client App Id와 Signature Key를 TheBackendSettings 객체 Client App Id와 Signature Key에 넣어준다. 뒤끝 초기화 뒤끝 서버 사용을 위한 BackendManager 스크립트를 생성 후 아래와 같이 적어줍니..

[뒤끝 강의] 온라인 게임 개발 #00 - 뒤끝 소개

뒤끝이란? PC, 콘솔, 모바일 등의 다양한 플랫폼에서 온라인 게임 개발 및 운영을 위해 필요한 서버, 데이터베이스 구축을 보다 손쉽게 설정할 수 있는 서버 시스템이다. ❓ 게임 서버가 왜 필요한데? 1. 기기 변경, 초기화 등에 따른 유저 데이터를 안전하게 유지할 수 있다. 2. 푸시 메시지, 우편, 이벤트, 랭킹, 소셜 기능 활용을 통한 유저 리텐션 및 플레이타임 개선이 가능하다. 3. 게임 내 밸런스 데이터를 서버에서 관리하기 때문에 수치를 조정하기 위해 앱을 업데이트 하지 않고 뒤끝에서 게임 밸런스를 수정할 수 있다. 4. 유저 주요 지표 및 로그를 통한 이탈 구간 확인 개선 및 유저 데이터 분석 및 관리하는 기능으로 데이터 분석 관리를 할 수 있다. 5. 캐시 재화 충전 및 영수증 검증을 통한 ..

Part 4-4-2. 패킷 직렬화 : Serialization #2

패킷 직렬화 지난 시간에는 직렬화, 역직렬화의 개념과 이를 예시를 통해 이해하고 학습하였다. 물론 아직 개선이 필요한 부분은 많이 있지만.. 🤔 📌 직렬화 #2 Send 개선 지난 시간에 열심히 뜯어고친 OnConneccted 메서드 내부에서 buffer를 Send 하는 부분을 더욱 편리하게 사용하기 위해 이를 PlayerInfoReq 클래스 내부에 함수로 만들어 줄 것이다. 위 스크립트에서 빨간 줄로 그어진 부분을 개선할 것이다. 😋 먼저 사용하지 않는 PlayerInfoOk 클래스는 지워주고, Server 쪽에서 패킷을 읽는 부분(=역직렬화)도 매번 재사용 하기 위한 Read 메서드와, 패킷을 보내기 전 직렬화 하는 과정인 Write 메서드를 작성한다. public abstract class Pack..

반응형