전체 글 71

3. 보정 처리

0.2초마다 캐릭터의 위치를 보내고 이를 뿌려줘서 해당 위치로 이동시키게 되면 0.2초마다 순간이동 하는 것처럼 보이게 된다. 이때 가장 먼저 떠오르는 해결 방법은 프레임마다 패킷을 보내주는 것인데 당연히 이건 불가능하다. 서버에 엄청난 부하가 걸리게 되기 때문이다. 그래서 캐릭터가 자연스럽게 움직이게 하도록 보정처리를 해주어야 한다. 여러 가지 방법이 있겠지만 가장 먼저 목적지를 지정한 후 이동시키는 것이다. 오브젝트의 위치를 서버에서 받으면 바로 업데이트하는 것이 아니라 그 위치를 목적지로 설정하고 그쪽을 향해서 움직이게 하는 방법이다. 하지만 이 방법은 플레이어가 다른 플레이어의 과거의 모습을 보는 것이기 때문에 플레이어끼리의 상호작용이 있을 경우 문제가 생길 수 있다. 물론 일반적인 MMORPG ..

2. 이동 동기화

MMO에서 캐릭터가 이동할 때 패킷을 보내는 순서를 어떤 식으로 하는 것이 좋을까? 1. 클라이언트에서 먼저 이동을 하고 서버에게 그 패킷을 보낸 후 서버가 그 정보를 다른 유저들에게 보내는 방법2. 먼저 서버에게 이동을 할 것이라는 패킷을 보낸 후 서버가 허락(?)하면 그 이후에 이동하는 방법 그냥 봤을 때 이동을 먼저 하게 되면 다른 유저들이 보는 화면과 본인의 화면이 조금 딜레이가 있을 것 같다.(근데 fps같은 장르가 아니면 조금의 딜레이는 문제 없지 않나?)서버의 허락이 필요한 경우는 패킷이 오는 것을 기다려야 하므로 플레이어 입장에서 렉이 걸린다고 느낄 수 있을 것 같다. 보통 게임들의 경우 마우스로 움직이냐 키보드로 움직이냐에 따라서 나뉜다고 한다. 롤처럼 마우스로 움직이는 경우 2번째 방법..

2. 패킷 설계

연동이 끝났으니 패킷을 어떤 식으로 설계해야 하는지 알아보자. Login에서 PlayerInfo를 보냈는데 Enter_Game에서 한 번 더 보내는 이유는 로그인을 하고 나면 캐릭터 선택화면이 나올 텐데 여기서는 플레이어의 레벨, 닉네임 등 간단한 정보만 있으면 되지만 실제 게임에 들어갈 때에는 인벤토리나 능력치 등 더 디테일한 정보들이 필요하기 때문이다. 물론 꼭 이렇게 해야 한다는 것은 아니고 편한 대로 하면 된다. Enum.protosyntax = "proto3";package Protocol;enum PlayerType{ PLAYER_TYPE_NONE = 0; PLAYER_TYPE_KNIGHT = 1; PLAYER_TYPE_MAGE = 2; PLAYER_TYPE_ACHER = 3;}Struct.p..

1. 서버-클라이언트 연동

지금까지 만든 서버를 언리얼 클라이언트와 연동해 볼 것이다. 가장 먼저 해야할 것은 네트워크 통신을 위한 프로토버퍼 연동이다. 언리얼 프로젝트를 생성하고 비주얼스튜디오 프로젝트 파일을 생성하게 되면 Source폴더가 생기게 되는데 해당 위치에 ProtobufCore 폴더를 만들어서 관련된 파일을 다 넣어주도록 할 것이다.이런식의 구조를 띄고 있다. ProtobufCore.Build.cs파일은 처음에 없을건데 새로 하나 만들면 된다. ProtobufCore.Build.cs// Fill out your copyright notice in the Description page of Project Settings.using System.IO;using UnrealBuildTool;public class Prot..

4. ORM

저번까지 xml을 읽어 들이는 것을 해보았는데 이제 이렇게 읽어 들인 데이터를 데이터베이스에 업데이트까지 해 볼 것이다. 하나의 ORM을 만드는 것이다. 현재 디비의 구조를 가져와서 xml로부터 읽어 들인 구조와 비교 후 바뀐 부분만 업데이트하도록 만들어 볼 것이다. 그전에 로그를 찍을 수 있도록 하나 만들어 보자ConsoleLog.h#pragma once//--------------// ConsoleLog//--------------enum class Color{ BLACK, WHITE, RED, GREEN, BLUE, YELLOW,};class ConsoleLog{ enum { BUFFER_SIZE = 4096 };public: ConsoleLog(); ~ConsoleLog();public: void..

게임서버/DB 2025.08.01

3. XML Parser

개인 프로젝트를 한다면 지금까지의 내용으로도 충분하겠지만 만약 라이브 서비스를 한다면 버전 관리가 중요하게 될 것이다. 이건 찾아보면 정보가 굉장히 많기 때문에 별 다른 설명은 없을 것이다. 코드의 경우는 깃 같은걸로 버전 관리를 하게 되면 큰 문제는 없다. 근데 데이터베이스가 들어가면 조금 복잡해진다. 디비는 따로 관리를 해주지 않기 때문이다. ORM을 사용하면 버전 관리에 큰 문제는 없을 테지만 지금까지 작성한 코드에서는 쿼리를 일일이 날려주고 있었다. 그렇기 때문에 소스코드에 버전에 맞춰서 디비도 버전 관리를 해주어야 한다.이런 식으로 디비에 변동이 있으면 번호를 늘려가면서 버전 관리를 해주는 것이다. 그리고 해당 디비는 아래와 같이 디비의 버전을 함께 들고 있어야 한다.CREATE TABLE [d..

게임서버/DB 2025.08.01

2. DB Bind

데이터를 저장하고 사용하는 방식에 대해 알아보았다. 하지만 사용 방식이 생각보다 복잡하고 실수할 여지가 많다. 사용자가 직접 타입을 지정하는 부분이 조금 불편하다. 그래서 그 부분을 수정해 보도록 하자.public: bool BindParam(int32 paramIndex, bool* value, SQLLEN* index); bool BindParam(int32 paramIndex, float* value, SQLLEN* index); bool BindParam(int32 paramIndex, double* value, SQLLEN* index); bool BindParam(int32 paramIndex, int8* value, SQLLEN* index); bool BindParam(int32 param..

게임서버/DB 2025.07.31

1. DB Connection

이번 글부터는 데이터베이스를 어떻게 서버랑 연동하고 관리하는지 알아볼 것이다. 디비도 종류가 굉장히 다양하다. MySQL, 오라클 등 여러 가지가 있는데 보통 윈도우 서버를 기반으로 한다고 하면 SQL-Server를 많이 사용한다고 한다. 디비의 종류가 달라지게 되면 코딩하는 방법이 달라지는 것이 아닌가 하는 의문점이 생길 수 있지만 전혀 그렇지 않으니 걱정하지 않아도 된다. ODBC라는 것이 있다. 이건 여러 DBMS에 접근하기 위한 표준 API이다. 그렇기 때문에 이걸 사용하면 아무런 문제 없이 다양한 DBMS에 접근할 수 있다. 오늘의 코드들은 엄청 깊게 공부할 필요는 없다. ODBC가 제공하는 것들을 그냥 사용하는 것이기 때문에 기억이 안나면 그냥 찾아보면 된다. 예전에 네트워크 라이브러리를 만들..

게임서버/DB 2025.07.29