PVP관련 문의입니다.

고객님의 문의에 답변하는 직원은 고객 여러분의 가족 중 한 사람일 수 있습니다.
고객의 언어폭력(비하, 조롱, 욕설, 협박, 성희롱 등)으로부터 직원을 보호하기 위해
관련 법에 따라 수사기관에 필요한 조치를 요구할 수 있으며, 형법에 의해 처벌 대상이 될 수 있습니다.

커뮤니티 이용 정책에 위배되는 게시물을 작성할 경우, 별도 안내 없이 게시물 삭제 또는 커뮤니티 이용이 제한될 수 있습니다.

문의 응대 : 평일 오전 10시 ~ 오후 6시
문의를 남기실 경우 다음 항목을 작성해 주세요.
정보가 부족하거나 응대시간 외 문의하는 경우 확인 및 답변이 지연될 수 있습니다.

  • 베이스/채팅/데이터베이스/월드 SDK 버전 :
  • 프로젝트명 :
  • 스테이터스 코드 :
  • 에러 코드 :
  • 에러 메시지 :

뒤끝 개발팀을 통한 별도의 기술지원이 작업이 필요한 요청은 help@backnd.com 으로 문의해주시기 바랍니다.

안녕하세요.

1:1 PvP 콘텐츠를 기획 중인데, 뒤끝에서 어떤 기능을 활용하는 것이 적절할지 문의드립니다.

현재 구상 중인 시스템은 아래와 같습니다.

  • 티어가 존재하는 리그형 PvP
  • 각 리그 시작 시 모든 유저는 1000점으로 동일하게 시작
  • 같은 리그 내에서 대전 버튼을 누르면 3명의 유저가 랜덤으로 노출
  • 노출된 유저 중 1명을 선택하여 1:1 전투 진행
  • 승패 결과에 따라 점수가 상승하거나 하락하는 구조

이와 관련하여 아래 사항이 가능한지 문의드립니다.

  1. 동일한 리그 내 유저들을 100명 단위 그룹으로 나누어 표시하고, 해당 그룹 내 유저들끼리만 대전 상대 후보로 노출되도록 구성할 수 있을까요?

  2. 전투 결과 처리 시, 내 점수뿐 아니라 대전을 진행한 상대 유저의 점수까지 함께 변경할 수 있을까요?

  3. 위와 같은 구조를 구현할 때, 뒤끝의 어떤 기능을 사용하는 것이 가장 적절한지 추천 부탁드립니다.

  4. 위 점수 처리 시, 동일한 시점에 여러 전투 결과가 반영되더라도 점수 갱신이 꼬이지 않도록 안전하게 처리할 수 있는 방법이 있는지도 궁금합니다.

안녕하세요 개발자님,
문의해주신 컨텐츠는 랜덤조회 기능과 데이터베이스 기능을 혼합하여 구현이 가능합니다.

  1. 동일한 리그 내 유저들을 100명 단위 그룹으로 나누어 표시하고, 해당 그룹 내 유저들끼리만 대전 상대 후보로 노출되도록 구성할 수 있을까요?
    => 그룹을 나누는 기준정보가 필요합니다. 랜덤조회 기능을 통해서는 숫자 정보를 기준으로 특정 범위내 유저를 랜덤하게 조회할 수 있습니다. 스코어 혹은 티어와 리그를 구분하는 특정 숫자를 구성하여 조건에 맞는 유저만을 랜덤으로 조회하도록 하는 것이 가능합니다.
    티어/리그의 구분을 명확히 알지 못하기에 현재 안내에서는 안내가 제한적인점 참고 바랍니다.

  2. 전투 결과 처리 시, 내 점수뿐 아니라 대전을 진행한 상대 유저의 점수까지 함께 변경할 수 있을까요?
    => 데이터 베이스 기능을 통해서 자신 및 타인의 정보를 모두 동시성에 대한 문제 없이 변경 수정이 가능합니다.

  3. 위와 같은 구조를 구현할 때, 뒤끝의 어떤 기능을 사용하는 것이 가장 적절한지 추천 부탁드립니다.
    => 앞서 안내드린것과 같이 데이터베이스와 랜덤조회 기능을 통해 구현 가능합니다.

  4. 위 점수 처리 시, 동일한 시점에 여러 전투 결과가 반영되더라도 점수 갱신이 꼬이지 않도록 안전하게 처리할 수 있는 방법이 있는지도 궁금합니다.
    => 데이터베이스의 산술연산자 기능을 통해 동시성 환경에 대해서도 안전한 처리가 가능합니다.

좋아요 1

답변 너무감사합니다.
1번 답변에서 그룹을 나누는 기준정보가 어떤 의미인지 조금 더 자세히 알고 싶어 추가 문의드립니다.

제가 구상 중인 결투장 시스템은 다음과 같습니다.

  • 유저는 브론즈 > 실버 > 골드 > 다이아와 같이 리그를 승급하는 구조입니다.
  • 각 리그 내 유저들을 다시 100명 단위로 나누어 개별 그룹으로 운영하고 싶습니다.
  • 각 그룹 내에서 랭킹을 집계하고, 시즌 종료 시 상위 n% 유저를 다음 리그로 승급시키는 방식입니다.

예를 들면 아래와 같은 구조입니다.

  • 브론즈 / 그룹1 [100명]
  • 브론즈 / 그룹2 [100명]
  • 브론즈 / 그룹3 [100명]
    이런구조를 생각하고있습니다.

제가 궁금한 부분은, 위와 같은 구조를 구현할 때 말씀해주신 기준정보가
예를 들어 [리그 값 + 그룹 번호]처럼 각 유저 데이터에 별도로 저장되어 있어야 한다는 의미인지입니다.

현재 스테이지 랭킹은 리더보드로 제작하여 서비스 중인데, 결투장 시스템도 동일하게 리더보드 방식으로 제작해야 한다면 리그와 그룹 수에 따라 너무 많은 리더보드 테이블이 필요할 것 같아 문의드리게 되었습니다.

이전에 문의드렸을 때 리더보드는 총 500개까지 제한이 있다고 안내받았는데,
결투장 유저 수가 많아질 경우 이 방식으로는 한계가 있을 것 같아 우려됩니다.

그래서 아래 내용을 추가로 문의드립니다.

  1. 위와 같은 리그 + 100명 단위 그룹 구조를 구현할 때, 유저 데이터에 어떤 기준정보를 저장해야 하는지
  2. 이 시스템을 리더보드 기반으로 구현하는 것이 적절한지, 아니면 데이터베이스/랜덤조회 등을 활용한 더 적절한 방식이 있는지
  3. 유저 수가 많아졌을 때도 운영 가능한 권장 구현 방식이 있는지

확인 부탁드립니다. 감사합니다~

리그 + 그룹(100명 단위) 구조를 구현하기 위해서는
말씀주신 것처럼 각 유저 데이터에 리그 및 그룹을 식별할 수 있는 기준값을 별도로 저장하는 방식이 필요합니다.

랜덤조회 기능은 숫자 데이터를 기준으로만 저장 및 조회가 가능하기 때문에,
리그와 그룹 정보를 하나의 숫자 값으로 구성하여 관리하는 방식으로 구현할 수 있습니다.

예를 들어 아래와 같이 구성할 수 있습니다.

  • 리그: 브론즈(01), 실버(02), 골드(03), 다이아(04)
  • 그룹: 00001 ~ 99999

이를 조합하여 아래와 같은 하나의 숫자값으로 관리할 수 있습니다.

  • 브론즈 / 그룹1 = 0100001
  • 브론즈 / 그룹2 = 0100002
  • 다이아 / 그룹1 = 0400001

해당 그룹의 유저를 랜덤하게 조회할 경우
pivot 을 자신의 그룹 값으로, gap을 0으로, count 를 3(대전 상대 수)으로 하여 조회를 하면 됩니다.

다만 랜덤조회 기능은 다음과 같은 제약이 있습니다.

  • 숫자 값 기반 조회만 가능
  • 해당 그룹에 몇 명이 존재하는지 확인 불가
  • 유저가 직접 등록한 데이터만 조회 대상에 포함됨 (1회라도 등록이 필요)
  • 리그 시작/종료 시 전체 유저를 일괄 재배치하는 용도로는 사용이 불가함 (초기화만 가능)

위와 같은 제약으로 인해 운영이 어려운 경우에는
데이터베이스 기반으로 구현도 가능합니다.

  • group, score 컬럼 구성 (group은 인덱스 권장)
  • 동일 group 조건으로 유저 조회 후, 조회 결과 내에서 랜덤 선택
  • 시즌 종료 시 콘솔에서 제공하는 쿼리 에디터를 통해 전체 유저의 리그/그룹 재배치
좋아요 1