Skip to content

Chore: 플레이어별 체감 난이도 분석용 로그 JSON 초안 #5

Description

@elian118

초안

{
  "user_id": "player_1024",             // [추가] 사용자 고유 식별자 (개인별 맞춤 난이도 제공용)
  "game_id": "map_underwater_03",       // [추가] 현재 진행 중인 게임/맵의 식별 코드
  "play_logs": [
      {
        "event_id": "uuid-67890",            // 각 클릭 이벤트를 식별하기 위한 고유 ID
        "timestamp": "2026-02-28T12:15:00Z", // 실제 발생 시각 (서버 타임라인 정렬용)
        "play_time_ms": 52400,               // 게임 시작 후 경과 시간 (숙련도 및 점수 감점 계산용)
        "click_coordinate": {                // 사용자가 실제 클릭한 화면상의 좌표 (기준 해상도 권장)
          "x": 720, 
          "y": 480 
      },
      "result_type": "MISS",               // 클릭 결과 유형 (HIT: 정답, MISS: 오답, DUPLICATED_HIT: 중복 클릭)
  
      /* [ML 핵심] 사용자의 타겟팅 의도 분석 데이터 */
      "distances_to_remaining_targets": [  // 아직 찾지 못한 모든 정답 객체들과의 거리 리스트
        { 
          "target_id": "tree_01",          // 객체 고유 식별자 (특정 객체의 물리적 난이도 분석용)
          "distance": 45.2                 // 클릭 지점과 해당 객체 중점 사이의 직선 거리
        },
        { "target_id": "bird_02", "distance": 120.5 },
        { "target_id": "rock_05", "distance": 310.0 }
      ],

      /* [규칙 반영] 이미 찾은 객체를 다시 눌렀을 때의 정보 (고득점 방해 요소) */
      "nearest_found_target": {            // 이미 정답 처리가 된 객체 중 가장 가까운 것의 정보
        "target_id": "key_01",             // 클릭 지점 근처에 이미 찾은 객체가 있는지 확인
        "distance": 8.5,                   // 해당 객체와의 거리
        "is_duplicated_hit": true          // 클릭 방지 로직(Penalty) 발동 여부
      },

      /* 게임의 전체적인 맥락(Context) 정보 */
      "game_state": {
        "remaining_targets_count": 3,      // 클릭 당시 남은 정답 개수 (후반부 집중도 분석용)
        "current_score": 1250              // 클릭 직전의 점수 상태
      }
    }
  ]
}

주요 필드 분석 활용 제안

  • distances_to_remaining_targets

    • 이 리스트 내의 모든 거리가 멀다면 사용자가 '찍기'를 하고 있는 것이고, 특정 객체와의 거리만 유독 가깝다면 **'미세한 조작 실수'**로 해석 가능.
  • nearest_found_target:

    • is_duplicated_hit가 true인 데이터가 많다면, 해당 위치의 UI 피드백(이미 찾았다는 표시)이 사용자에게 명확하지 않다는 의미. 가독성 난이도 조절 지표로 활용
  • play_time_ms + result_type

    • 게임 후반부로 갈수록 MISS가 늘어난다면 사용자의 피로도가 급격히 상승하는 구간으로 추정.

클라이언트 사이드 클릭좌표와 정답 객체 중점간 거리 계산 성능이슈 해결 방안

  1. 거리 계산 '지연 처리' (Post-Processing)
  • 클릭 시점에는 좌표와 시간만 수집하고, 실제 거리 계산은 게임이 끝난 후 또는 브라우저가 한가할 때 처리
  • 방법: 클릭 시에는 { x, y, timestamp } 등 최소한의 데이터만 배열에 적재
  • 시점: 게임 결과 화면이 나오기 직전(로딩 중)이나, 사용자가 결과창을 보고 있는 '유휴 시간'에 루프를 돌며 거리 리스트 생성
  • 장점: 플레이 중 프레임 드랍(Lag)을 완벽하게 방지
  1. '공간 분할'을 통한 타겟 제한 (Spatial Partitioning)
  • 모든 객체와의 거리를 구할 필요 없이, 클릭 지점 주변의 객체만 필터링하는 방식
  • 방법: 화면을 격자(Grid) 단위로 나누고, 클릭된 격자와 인접한 격자에 속한 객체들만 거리 계산 대상에 포함
  • 장점: 계산량이 $N$(전체 객체 수)에서 $k$(주변 객체 수)로 급격히 감소
  • .JSON 변화: 멀리 있는 객체는 아예 제외하거나 distance: null 또는 특정 임계값(Cut-off) 이상으로 처리하여 전송량 경량화
  1. Web Worker 활용 (Multi-threading)
  • 메인 스레드(렌더링 스레드)가 아닌 별도의 백그라운드 스레드에서 계산을 처리하는 방식
  • 방법: 클릭 이벤트가 발생하면 좌표 데이터를 Web Worker로 전송
    • Worker는 백그라운드에서 거리를 계산하고 결과를 다시 메인 스레드의 로그 리스트에 추가
  • 장점: 계산량이 많아도 화면이 버벅거리는 '프리징' 현상이 전혀 없음

위 방법 중 3번 방안으로 추진

  • 기술적으로 어필하기 좋은 포인트(고급 스킬) → 면접 씨 썰 풀기 좋음

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions