작년 초 발표한 내용

대략 이런 주제로 연합 동아리 기술 세미나, 테크톡에 참가했음
근데 발표시간 10분 제한이라.. 가볍게 듣고 넘어갈 수 있는 '매치메이킹'을 주제로 발표함
어떤 사용자들끼리 매칭시켜줘야할까?
되도록 비슷한 실력의 유저를 짝지어줘야하는데, 짝지어주는건 고사하고 도대체 어떻게 사용자들의 실력을 측정함..??
이런 문제는 컴퓨터 발명 이전부터 계속되어 왔다. 체스나 여타 보드게임 대회 등에서 볼 수 있는 방법으로 사용자들의 실력을 수치화해서 비교하는 방법이 있다.
실력점수(MatchMakingRating) : 초기값은 모두 동일한 시작 점수로 시작해서 이기면 점수를 따고, 지면 점수를 잃는 과정속에서 MMR을 업데이트하면서 실력에 맞는 점수대로 수렴하는 원리로 승률을 예측한다.
Elo 점수 시스템 : 실력점수 체계 안에서 체스나 온라인 게임에서 변형해 레이팅 제도 도입에 큰 역할을 함.
→ 서로의 점수를 걸고 싸우지만, 강자가 약자보다 더 많은 점수를 건다.
Rn = Ra + K(Sa - Ea)
Rn : 유저 A의 새로운 점수, Ra : 이전 점수, Sa : 실제 결과. 이기면 1, 지면 0
Ea : 예상 승률, K : 튜닝 패러미터
ex) 내가 1400점인데 1600점의 상대를 만났다면?
K=24라 할 때, Ra = 1400. Sa=1, Ea=0.25
승리 : R1a : 1400 + 24(1-0.25) = 1418
패배 : R1a : 1400+24(0-0.25) = 1394
(* 상수 패러미터 K는 취향껏임. )
int GameManager::UpdateMMR(int A, int B, bool win) {
int K = 16;
double EA = 1.0 / (1.0 + pow(10, (B - A) / 400));
double EB = 1.0 / (1.0 + pow(10, (A - B) / 400));
// E는 점수차이를 계산한 예상 승률.
// A가 B보다 400점 높은 경우 이길 확률이 10배 높아진다는 의미.
int SA = win ? 1 : 0;
int SB = win ? 0 : 1;
int new_MMR = A + K * (SA - EA);
return new_MMR;
}
Elo 공식을 함수로 구현했음. 거기에 5:5 혹은 다수대 다수의 팀 대전을 구상했기에 좀 더 구체적인 로직이 필요함.

5:5 로 대전하는 경우라고 예시를 들면, 승리한 팀의 사용자 360은 패배한 Red 팀의 전체 사용자들의 평균 실력점수와 비교해서 Elo 점수 업데이트를 진행한다. 사용자 360의 MMR 1200과 Red 팀 MMR 1200을 비교해서 1207로 점수가 올라가는 모습.
이런 구조로 다수간의 대전 게임에서의 MMR 업데이트를 구현할 수 있었다.
그러나, 가장 큰 문제점이 남았는데..
애초에 사용자가 적으면 실력점수에 따라 정렬해도 차이가 커진다
그럼 과연 승패만 보고 실력점수를 판단한다는게 옳을까? 운좋아서 5연승한 친구랑 같은 실력은 아닐테니까
오랜 기간 라이브한 온라인 게임들은 개인의 실력보다 매칭 결과의 품질이 중요시함.
물론 비슷한 지역, 핑 상태같은 것도 신경쓰겠지만 매칭 품질은 절대 무시못하는 요소
이런 녀석들은 쌓아온 데이터를 토대로 게임참여자들의 조합을 평가해서 매치메이킹을 가다듬는다.
ex) 각 참여자들이 선호하는 무기, 포지션, 전략, 팀원들간의 상성, 선택한 캐릭터의 숙련도 등
게임의 유저 데이터가 쌓이면 다시 시도해봐야할 부분이라고 생각함
'windows' 카테고리의 다른 글
Windows In Docker - C++ 프로젝트의 컨테이너화 빌드 및 관리 (0) | 2025.02.20 |
---|---|
토이프로젝트 - IOCP 서버와 유니티 클라이언트 구현(winsock2, cpp) (0) | 2024.11.22 |
IOCP(IO Completion Port) 쉽게 이해하기 (0) | 2024.11.22 |
토이프로젝트 - winsock으로 구현한 프록시 서버(winsock2, cpp) (0) | 2024.11.22 |
IOCP GetQueuedCompletionStatus, CreateloCompletionPort 함수의 변경점 (0) | 2024.11.22 |