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