관리해야 할 두 가지 사항이 있습니다.
서버 는 전 세계를 정식으로 관리 해야합니다 . 이를 위해서는 N 개의 클라이언트 (N이 "대규모")와의 통신이 필요합니다.
클라이언트 는 원칙적으로 전 세계에 대해 알 수 있지만 반드시 그럴 필요는 없습니다 . 클라이언트의 경우 플레이어 근처에 무엇이 있는지 아는 것으로 충분합니다. 예를 들어 다소 거친 그리드와 같은 파티셔닝을 가정하면 플레이어의 셀과 플레이어 주변의 26 셀 (또는 2D 그리드가있는 경우 8 셀) 만 알아야합니다. 다소 미세한 격자가 더 좋지만 아이디어를 얻습니다.
지금, 많은 픽업, "많은"은 무엇입니까? 초당 5 개를 파야 할 수도 있습니다. 서버에서 업데이트해야하는 24 개의 숫자 일 수도 있고, 서버 가 관심 영역이 셀과 겹치는 다른 플레이어에게 전송해야 할 수도 있습니다. 컴퓨터의 경우 이것은 상당히 말도 안되는 양의 데이터이며 무시할 수없는 양의 계산입니다. 같은 셀에 수백 / 수천 명의 플레이어가있을 경우 문제가 될 수 있습니다 (귀하의 패리티가 너무 거칠다).
서버는 픽업의 회전 또는 그와 같은 세부 사항을 알거나 신경 쓸 필요가 없습니다. 왜 그런가요?
클라이언트는 실제로 신경 쓰지 않습니다. 클라이언트가 즉시 구성 할 수있는 눈 사탕 일뿐입니다.
서버의 관점에서 필요한 것은 당신이있는 노드에서 (30, 40, 50)을 파고 있다는 것을 알고 있으며, 예를 들어 5 유형의 3 개의 객체 또는 7 유형의 1 개의 객체를 생성하기로 결정합니다 그게 다 중요합니다. 그것이 당신에게하는 전부입니다. 또한 그리드 셀을 통해 관심 영역을 이동시키는 누군가에게 보낸 데이터의 정보도 나중에 포함됩니다 (그때까지 계속 있다고 가정).
클라이언트는 거기에 세 개의 오브젝트가 생성되었다고 들었습니다. 이제 클라이언트가 'D'가있는 ASCII 아트 맵을 표시하는지, 회전하는 먼지 더미를 표시하는지 여부는 모두 동일합니다. 파일의 회전이 다른지 또는 플레이어와 가까운 파일의 회전 만 같은지 여부 모니터에 표시되는 내용 일 뿐이며 다른 사람에게는 영향을 미치지 않습니다.
따라서 콘크리트의 경우 근처에있는 먼지 더미 만 회전 시키려면 알고있는 모든 개체에 대해 범위 검사를 수행하면됩니다. 데이터 세트가 크지 않기 때문에 모든 것에 대한 무차별적인 힘조차도 효과 가 있습니다.
파티션 크기에 따라 너무 멀리있는 그리드 셀을 사소하게 제거 할 수 있습니다.
물론 셀의 하위 파티션에 대해 더 똑똑한 것을 사용할 수 있습니다. 당신이 원한다면 kd-Tree를 사용하십시오. 그러나 큰 이익을 기대하지는 마십시오. Manhattan distace로 물건을 정리하거나 물건을 작은 격자로 정렬 할 수는 있지만 왜 그럴까요?
거리 확인 (실제로 제곱 거리이지만 사용자와 동일)은 단지 두 번의 곱셈과 덧셈 (MUL, MADD, 실제로 두 개의 연산에 최적화 됨)에 이어 분기 또는 조건부 이동입니다. 한 번에 전체 그리드 셀을 제거하지 않는 다른 작업만큼 빠릅니다. 사실 이것은 GPU에서 할 수 있는 일입니다 ...
동일한 위치에 대해 수백 또는 최대 수천 개의 거리 검사를 수행하는 방법 (제곱 거리가 잘 작동 함)을 보았을 때 실제로 계산하는 데 많은 어려움을 겪지 않습니다. 연속 메모리에 대한 친절한 반복 및 조건부 이동으로 먼지가 저렴합니다. (의사 코드)와 같은 것 rot = r[i] + 1; r[i] = ((dx*dx+dy*dy) < DIST_SQ) ? rot : r[i];
. 이는 프레임 당 수백 개의 값 배열에 대한 반복입니다. 컴퓨터는 그 작업에 대해 신경 쓰지 않았으며, 인접한로드 및 저장, 간단한 ALU, 분기 없음 및 수천 번의 반복입니다.
이 (다 대일) 서버에서와 같은 종류의 문제 (다 대다)가 아닙니다. 실제로, 클라이언트는 문제가되지 않습니다.
minecraft:dirt
) 및 개수 (30)를 사용하여 플레이어가 픽업 할 수있을만큼 가까이있을 때 플레이어의 인벤토리에 최대한 많은 수를 추가합니다. 만약 플레이어가 6 개의 아이템을위한 공간을 가지고 있고 30의 스택이지면에 있다면, 플레이어는 6을 가져오고지면의 스택은 24로 줄어 듭니다.