일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- Chart
- 즐겨찾기
- c# maui
- c# websocket
- 업비트 c#
- 업비트
- XAML
- 라이브 차트
- c# restapi 호출
- c# 업비트 api키 목록
- 업비트 API
- upbit
- 북마크
- maui
- 차트
- WPF
- 업비트 차트
- c# 업비트
- c# api호출
- Upbit API
- C#
- Prism
- 나만의 사이트모음집
- c# restapi
- c# 차트
- c# 라이브 차트
Archives
- Today
- Total
하아찡
[C++] 서버 DB업로드 본문
언리얼 버전 5.5.3
서버언어 C++로 구성했습니다.
공부를 하면서 왜...? DB서버를 따로 열어야 하나 늘 궁굼했는데
생각보다 DB에 데이터를 올리고 받는 과정에서 서버가 딜레이가 생기더라구요.
그래서 간단하게라도 원래 쓰던 코드에서 DB서버용으로 하나만들어서 사용했습니다.
로그인은 아직 그대로 게임서버에서 처리를 하게 두었고 플레이중에 처리되는것들을 앞으론 DB서버에서 처리 할 예정입니다.
실행결과
DB서버 추가하기전 실행결과
DB서버와 게임서버가 서로 통신할 Protobuf를 생성해줍니다.
DBProtocol.proto
syntax = "proto3";
package Protocol;
import "Enum.proto";
import "Struct.proto";
message C_DB_GAINEXP
{
uint64 characterid = 1;
int32 level = 2;
int32 nowexp = 3;
}
message S_DB_GAINEXP
{
}
message C_DB_GAINGOLD
{
uint64 characterid = 1;
int32 gold = 2;
int32 logtype = 3;
}
message S_DB_GAINGOLD
{
}
message C_DB_UPDATEPOS
{
uint64 characterid = 1;
ObjectInfo objectinfo = 2;
}
message S_DB_UPDATEPOS
{
}
message C_DB_PING
{
uint64 timestamp = 1;
}
message S_DB_PING
{
uint64 timestamp = 1;
}
위와같이 작성하여 사용했습니다.
예시)
변경전 서버코드
void CharacterDB::UpdatePlayerGold( uint64 characterDBID, int gainGold, int logType)
{
//골드 얻었을때
DBConnection* dbConn = GDBConnectionPool->Pop();
dbConn->Unbind();
DBBind<3, 0> dbBind(*dbConn, "CALL AddCharacterGoldWithLog(?, ?, ?)");
int64 DBID = characterDBID;
int GainGold = gainGold;
int LogType = logType;
dbBind.BindParam(0, DBID);
dbBind.BindParam(1, GainGold);
dbBind.BindParam(2, LogType);
ASSERT_CRASH(dbBind.Execute());
GDBConnectionPool->Push(dbConn);
}
변경 후
void CharacterDB::UpdatePlayerGold( uint64 characterDBID, int gainGold, int logType)
{
//골드 얻었을때
Protocol::C_DB_GAINGOLD pkt;
pkt.set_characterid(characterDBID);
pkt.set_gold(gainGold);
pkt.set_logtype(logType);
SendBufferRef sendBuffer = DBServerPacketHandler::MakeSendBuffer(pkt);
GDBManager.Broadcast(sendBuffer);
}
GDBManager를 통해서 DB서버에게 패킷을 전송합니다.
게임서버와 DB서버 끼리 1:1 연결이라 기존코드에있던 Broadcast를 사용해서 데이터를 전달해줬습니다.
반응형
'C++ > 이것저것서버테스트' 카테고리의 다른 글
[C++] 서버에서 아이템 드랍 처리 (0) | 2025.03.22 |
---|---|
[C++] 몬스터 정보, 아이템 정보 XML에서 불러오기 (0) | 2025.03.22 |
[C++] 몬스터 움직임 - 2 (0) | 2025.03.17 |
[언리얼5] 마지막 종료지점 저장 (0) | 2025.03.12 |
[언리얼5, C++] 몬스터 어그로 (0) | 2025.03.12 |