게임 렉 백서 › L1 클라이언트 게임 프로세스
float 시간 정밀도 손실 Float time precision loss on long sessions
원인 ID cg-float-time · 주 담당 게임개발팀·클라이언트 개발
그림과 실험이 있는 원본 카드로 열기 →
게임 시각을 정밀도가 낮은 소수 형식(float)으로 들고 있으면, 켜 둔 시간이 길수록 시간 해상도(구별할 수 있는 가장 작은 시간 차이)가 떨어져 움직임과 이펙트가 떨립니다.
왜 게임을 켠 뒤 흐른 시간을 float로 쌓거나 그대로 셰이더에 넘김 → 그러면 켜 둔 시간이 길수록 float가 나타낼 수 있는 가장 작은 차이가 커짐 → 화면에서는 며칠 켜 둔 클라이언트만 캐릭터·애니메이션·흐르는 이펙트가 덜덜 떨리고 다시 켜면 멀쩡함
- 증상
- 뚝뚝 끊김
- 요인
- 지터
- 누가 겪나
- 나만
- 언제
- 오래 켜 둘수록
- 담당
- 주 담당 게임개발팀·클라이언트 개발
- 게임개발팀 할 일
- 흐른 시간은 double(64비트)이나 정수로 보관, 셰이더에 넘기는 시간은 일정 주기로 되감기, 며칠짜리 장시간 자동 테스트.
- 수치 감각
- 32비트 float는 유효 숫자가 7자리 남짓입니다. 켜 둔 지 하루(약 86,400초)면 시간 해상도가 약 8ms로 60FPS 한 프레임(16.7ms)의 절반쯤이 되고, 일주일이면 약 60ms로 한 프레임보다 커집니다.
- 그래프에서는
- 서서히 오름 · 켜 둔 시간별 떨림 제보
- 확인할 곳
- 떨림 제보에 클라이언트를 켜 둔 시간을 함께 받고 재시작 전후를 비교. 개발 쪽은 게임 시작 시각 값을 며칠 지난 값으로 두고 돌려 보는 테스트
- 이러면 맞음
- 며칠 켜 둔 클라이언트에서만 떨리고 재시작하면 사라지며 켜 둔 시간이 길수록 심해짐
- 이러면 아님
- 켜자마자 떨리면 “보간 버퍼가 없거나 짧음”이나 “타이머 해상도”
- 확인 수단
- 유저 쪽 환경에서 확인
- 더 알아보기
- 자동 사냥을 켜 두고 며칠씩 끄지 않는 모바일 MMO에서 특히 나옵니다. 유니티의 Time.time도 float라서, 유니티는 double로 된 Time.timeAsDouble을 따로 두고 이쪽을 권합니다.
출처
- Time.timeAsDouble Unity
Time.time의 double 버전, 오래 켜 둘수록 float보다 정밀해 대부분 이쪽을 권장 - Floating-point numeric types (C# reference) Microsoft
float 정밀도 약 6~9자리, double 약 15~17자리
함께 보면 좋은 원인
같은 층: L1 클라이언트 게임 프로세스
같은 증상(뚝뚝 끊김)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기