여기에서 말하고자 하는 것은 앞으로 이동할 경로에 대한 예측이 아닌, 현재 객체가 이동한 경로를 관리하고 처리하는 방식에 대해 논의해 보고자 한다.
어떻게 보면 이미 지난 데이터라 의미없을지 모르지만 예측이 아닌 객체(A)의 이동 처리 방식에서는 타 객체(B)의 현재 위치는 예전 위치이기 때문에 만약, 타 객체(B)가 객체(A)를 공격할때 이에 대한 정확한 판단이 필요하게 된다. == 이를 위해 다음과 같은 객체의 처리가 필요하게 된다.
다음과 같이 객체의 이동이 발생 되었다고 가정하다.
객체(A)는 이동을 하지만, 객체(A)를 보고 있는 다른 객체(B)는 일정 시간 이후에 객체(A)의 이동을 보게 된다.
이러한 시점에서 객체(B)가 객체(A)를 공격한다면?
서버에서는 객체(A)가 객체(B)가 보고 있는 시점에 공격을 받는 위치에 있었는지 판단할 필요가 있다.
이를 위해 다음과 같은 처리 방식을 사용한다.
** FPS와 같이 이동에 대한 예측(객체(A)의 이동을 객체(B)는 바로 감지 한다)에서는 해당 방식을 사용할 필요가 없다.
객체 관리를 위해 필자는 다음과 같은 관리 구조를 가지고 있다.
#define MAX_BASELINE 8 typedef int limit_t[MAX_BASELINE + 1];
#define RECORD_BEGINMSEC 500 /* 0.5 sec */ struct info { sights_t actors; // 시야 범위 객체의 간격 struct urecord { // 이동 경로 저장 테이블 int nstart; // 저장 시작 위치 unsigned __int64 begin_msec; // key 설정 마지막 시간
#define RECORD_MAXCOURSE 24 struct course { // 객체의 이동정보를 recording 한 테이블 unsigned __int64 msec; // 이동 발생 시간 vector3d L; // 위치 uintptr_t udata; // 부가 정보 #define RECORD_ISBEGIN 0x01 unsigned int flags; // 상태 정보 } C[RECORD_MAXCOURSE]; // 저장 테이블 } r; limit_t limit; // relevant 설정 값
// 이동 경로를 저장한다. void actor::record( actor::course_t *t, int max, int begin_msec) { ENTER_RWLOCK( &_M.rwlock); { int n = 0;
do { if ((t[n].msec - _M.r.begin_msec) >= ((unsigned __int64)begin_msec)) { t[n].flags |= RECORD_ISBEGIN; _M.r.begin_msec= t[n].msec; } _M.r.C[_M.r.nstart] = t[n++];
if ((++_M.r.nstart) >= RECORD_MAXCOURSE) _M.r.nstart = 0; } while ((--max) > 0); } LEAVE_RWLOCK( &_M.rwlock); }
여기에 추가적으로 해당 시간에 존재한 위치를 얻기 위해서는 일부 예측이 사용되어야 한다. == 객체가 이동 중일수 있으므로, 위의 처리는 객체의 이동변화에 대한 값 만을 관리하고 있어, 이에 대한 보정을 위해서는 일정 시간 이후(A -> B이동) 해당 객체의 위치를 예측해야 한다.