728x90
나만무
보외와 보간을 구현
보외 - extrapolation 방법으로 보외를 구현했다.
- 이를 위해서 서버에서 클라이언트로 오는 패킷의 변화를 줬다.
- 서버의 시간을 주는 것을 추가했다.
- 클라이언트의 시간을 구해서 받아온 서버의 시간의 차를 구했다.
- node.js에서는 ms단위를 쓰기 때문에 유니티에서 쓰기 위해 초단위로 바꿔주었다.
- 구해온 시간을 통해서 외삽 제한 시간을 구했다.
- 경과 시간이 외삽 제한 시간보다 작은 경우 위치를 계산해서 Slerp로 외삽해주었다., 크다면 서버에서 보내온 마지막 위치와 현재 위치를 고려하여 외삽한다.
private void ExtrapolatePosition()
{
Quaternion lastServerRotation = Quaternion.LookRotation(lastServerAcceleration);
long currentTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
float timeSinceLastUpdate = (currentTime - lastServerTimeStamp) / 1000f;
float interpolationRatio = Mathf.Clamp01(timeSinceLastUpdate/extrapolationLimit);
Debug.Log("현재 레이턴시 :" + timeSinceLastUpdate);
Debug.Log("인터폴레이션 비율 :" + interpolationRatio);
if (timeSinceLastUpdate < extrapolationLimit)
{
Vector3 extrapolatedPosition = lastServerPosition + (lastServerVelocity * timeSinceLastUpdate) + (0.5f * lastServerAcceleration * timeSinceLastUpdate);
transform.position = Vector3.Slerp(transform.position, extrapolatedPosition, interpolationRatio);
}
else
{
transform.position = Vector3.Slerp(transform.position, lastServerPosition, interpolationRatio);
}
}
MessageQueue - 메시지 패킷을 처리할 큐를 구현
패킷을 받아오고 동시에 같은 블럭에서 처리하니까 속도가 매우 느렸다.
쿠고랑씨의 피드백을 받아서 다른 곳으로 넘겨서 처리하도록 변경했다.
메시지를 받는 큐를 추가했다.
문제. 구현한 extrapolation이 적용이 안되는 상황
구현한 extrapolation이 안되는 상황이 발생했다.
가설 1. 함수가 호출되지 않고 있다.
→ 함수가 호출되고 있는 것을 확인했다.
가설 2. 다른곳에서 충돌이 나오고 있을 것이다.
→ 만들어 놓은 MessageQueue를 지우고, 원본의 코드와 같게 만들었음에도 달라지지 않았다.
가설 3. 서버에서 받아오는 시간이나 클라이언트의 시간이 이상하다.
→ 시간을 debug.log로 확인해본 결과 서버에서 받아오는 시간이 0인것을 찾았다.
→ 서버와 차이점을 비교해보니 json 형태가 다른 것을 확인할 수 있었고, 서버와 클라이언트를 일치시켜줌으로서 해결 수 있었다.
728x90
'Study > Project' 카테고리의 다른 글
나만무 슬레이어즈 10 (0) | 2024.05.08 |
---|---|
나만무 슬레이어즈 9 (0) | 2024.05.04 |
나만무 슬레이어즈7 (0) | 2024.05.03 |
나만무 슬레이어즈6 (0) | 2024.05.03 |
나만무 슬레이어즈5 (0) | 2024.05.01 |