게임 렉 백서 › 증상별로 찾기
뚝뚝 끊김: 원인 60가지와 담당
다른 말: 버벅임, 끊김, 프레임 드랍 느낌
그림이 있는 원본 증상 사전으로 열기 →
움직임이 매끄럽지 않고 짧게 멈췄다 움직이기를 반복합니다.
다른 캐릭터나 내 화면 전체가 “멈칫, 멈칫”. 궤적 점이 뭉쳤다 벌어졌다 합니다.
핑 수치가 멀쩡하면 내 PC 프레임(클라이언트·OS) 문제, 핑이 들쭉날쭉하면 와이파이·회선의 지터일 가능성이 큽니다. 다만 게임 안 핑 표시는 대개 프레임마다 도는 게임 루프 안에서 재기 때문에, 프레임이 튀면 핑 숫자도 함께 튈 수 있습니다.
이 증상을 만드는 원인
L1 클라이언트 게임 프로세스
- 프레임 타임 스파이크: 한 프레임 계산이 평소보다 몇 배 오래 걸려 화면이 잠깐 멈춥니다. (게임개발팀·클라이언트 개발)
- 클라이언트 가비지 컬렉션: 쓰고 버린 메모리(가비지)를 회수하는 동안 게임 전체가 멈춥니다. 규칙적인 간격으로 뚝뚝 끊기는 것이 특징입니다. (게임개발팀·클라이언트 개발)
- 메인 스레드 동기 로딩·셰이더 컴파일: 처음 보는 지역·몬스터·이펙트를 그리기 직전에 파일을 읽고 셰이더를 만드느라 멈춥니다. (게임개발팀·클라이언트 개발)
- 저장장치가 느려 에셋 스트리밍이 밀림: HDD처럼 느린 저장장치에서는 오픈월드의 텍스처·모델을 읽는 속도가 이동을 따라가지 못해, 개체가 늦게 뜨거나 게임이 읽기를 기다리며 끊깁니다. (게임개발팀·클라이언트 개발)
- 대규모 인원 렌더링 부하: 공성전·월드 보스처럼 수백 명이 한 화면에 들어오면 그리는 비용 자체가 감당이 안 됩니다. (게임개발팀·클라이언트 개발)
- 보간 버퍼가 없거나 짧음: 서버 패킷을 받자마자 그리면 지터(도착 간격의 흔들림)가 그대로 화면에 드러납니다. (게임개발팀·클라이언트 개발)
- 과도한 외삽(데드 레커닝): 패킷이 오지 않는 동안 마지막 속도로 계속 움직여 보여 주다가, 틀린 걸 알고 되돌립니다. (게임개발팀·클라이언트 개발)
- 고정 타임스텝 따라잡기 폭주: 한 번 멈춘 뒤 밀린 계산을 몰아서 하다가, 그 계산 때문에 또 밀립니다. (게임개발팀·클라이언트 개발)
- 시계 동기화 오차: 클라이언트가 추정한 서버 시각이 틀리면 보간 시점과 쿨타임 판정이 어긋납니다. (게임개발팀·클라이언트 개발)
- float 시간 정밀도 손실: 게임 시각을 정밀도가 낮은 소수 형식(float)으로 들고 있으면, 켜 둔 시간이 길수록 시간 해상도(구별할 수 있는 가장 작은 시간 차이)가 떨어져 움직임과 이펙트가 떨립니다. (게임개발팀·클라이언트 개발)
- V-Sync와 렌더 대기열: GPU가 그린 프레임을 몇 장 대기열에 쌓아 두었다가 모니터 주기에 맞춰 내보내는 동안 입력이 늦어집니다. (게임개발팀·클라이언트 개발)
- 클라이언트 메모리 누수: 오래 켜 둘수록 메모리가 늘어 점점 느려지다가 결국 게임이 강제로 꺼집니다. (게임개발팀·클라이언트 개발)
- 게임 보안 모듈(안티치트) 검사: 해킹을 막으려고 게임과 함께 도는 보안 모듈이 주기적으로 검사합니다. 검사가 무겁거나 보안 서버와 주고받는 하트비트(주기적인 생존 확인 신호)가 늦으면 뚝뚝 끊기거나 접속이 끊깁니다. (게임개발팀·클라이언트 개발)
L2 클라이언트 OS·기기
- 백그라운드 프로세스의 CPU 점유: 백신 검사, 윈도우 업데이트, 방송 프로그램, 브라우저 영상이 코어를 차지하면 게임 스레드가 CPU를 배정받지 못하고 기다립니다. (외부·외부)
- 절전 모드·발열 스로틀링: 노트북 배터리 모드, 폰 절전 모드, 기기 발열 때문에 CPU·GPU 속도가 떨어집니다. 발열은 처음엔 괜찮다가 한참 뒤부터 느려지는 게 특징입니다. (외부·외부)
- 타이머 해상도: 윈도우의 기본 타이머는 15.6ms 단위라 “1ms만 쉬기”가 실제로는 다음 타이머 주기까지, 길게는 15.6ms로 늘어납니다. (게임개발팀·클라이언트 개발)
- 보안 프로그램의 패킷 검사: 백신·방화벽이 모든 패킷을 검사하면 지연이 늘고 과하면 게임을 공격으로 오인해 막습니다. (외부·외부)
- 클라이언트 메모리 부족·스왑: 브라우저 탭 수십 개와 게임을 함께 켜 두면 OS가 게임 메모리 일부를 디스크로 내보냅니다. (외부·외부)
- 그래픽 메모리(VRAM) 부족: 그래픽 옵션이 요구하는 메모리가 그래픽카드 메모리보다 크면, OS가 텍스처를 PC 메모리로 내보냈다가 다시 가져오느라 뚝뚝 끊깁니다. (게임개발팀·클라이언트 개발)
- 와이파이 백그라운드 스캔: OS가 주변 와이파이를 찾으려고 주기적으로 채널을 옮겨 다니는 동안 통신이 잠깐 멈춥니다. (외부·외부)
- NIC 절전·드라이버 문제: 랜카드·와이파이 칩이 패킷 사이에 절전 상태로 들어가면 다시 활성화되는 데 시간이 걸립니다. (외부·외부)
- 창 최소화·비활성 시 처리 제한: 다른 창을 보거나 게임을 최소화하면 게임과 윈도우가 전기를 아끼려고 게임을 느리게 돌립니다. 돌아오면 밀린 패킷이 몰려오거나, 이미 접속이 끊겨 있습니다. (게임개발팀·클라이언트 개발)
- 오버레이 프로그램 간섭: 메신저·런처·녹화·FPS 표시 프로그램이 게임 화면 위에 자기 UI를 덧그리려고 게임의 렌더링 과정에 끼어듭니다(후킹). 프레임마다 작업이 늘고 가끔 게임과 부딪혀 멈칫하거나 게임이 강제로 꺼집니다. (외부·외부)
L3 집 네트워크
- 와이파이 간섭·신호 약화: 신호가 약하거나 간섭이 생기면 무선 구간에서 몇 번씩 다시 보내느라 도착이 들쭉날쭉해집니다. (외부·외부)
- 와이파이 채널 혼잡: 아파트처럼 공유기가 수십 개 있는 곳은 같은 채널을 나눠 쓰느라 전송 기회를 기다립니다. (외부·외부)
- 공유기 성능 부족·과열: 값싼 공유기에 기기 수십 대, 연결 수천 개가 몰리면 공유기 자체가 처리를 못 합니다. (외부·외부)
- 모바일 신호 약함·음영 지역: 엘리베이터·지하·건물 안쪽에서는 재전송이 늘고 속도가 떨어지며 결국 접속이 끊깁니다. (외부·외부)
- 5G↔LTE 잦은 전환 (5G 경계 지역): 5G 신호가 약한 건물 안이나 5G 경계 지역에서는 폰이 5G와 LTE를 자주 오가고, 바뀔 때마다 핑이 튀거나 통신이 잠깐 끊깁니다. (외부·외부)
L4 인터넷 회선
- 위성 인터넷 (저궤도·정지궤도): 위성 인터넷은 전파가 우주를 오가야 해서, 정지궤도 위성은 왕복만 0.5초가 넘고 Starlink 같은 저궤도 위성은 평소엔 빠르지만 경로를 다시 배정하는 순간 지연이 흔들리고 잠깐 끊기기도 합니다. (외부·외부)
- 피크 시간 피어링 구간 혼잡: 저녁 9~11시 무렵에는 영상 트래픽이 폭증해 통신사 간 연결 구간(피어링)이 붐비기 쉽습니다. (인프라팀·네트워크 인프라)
- ECMP 경로 하나의 불량: 통신사와 데이터센터는 같은 목적지로 가는 경로를 여러 개 두고 연결마다 경로 하나를 정해 보냅니다. 경로 하나만 고장 나면 그 경로에 배정된 사람만 계속 렉을 겪습니다. (인프라팀·네트워크 인프라)
L6 서버 네트워크 카드
- 가상화 오버헤드·노이지 네이버: 같은 물리 서버의 다른 가상 머신이 네트워크·CPU를 많이 쓰면 내 서버의 처리가 불규칙하게 밀립니다. (인프라팀·서버 인프라)
L7 서버 OS (커널)
- 스레드 과다와 컨텍스트 스위칭: 코어보다 훨씬 많은 스레드를 돌리면 OS가 번갈아 실행시키는 데만 CPU를 씁니다. (게임개발팀·서버 개발)
- CPU 스틸 (가상 머신): 물리 서버(하이퍼바이저)가 가상 머신의 CPU 시간을 잠시 다른 가상 머신에 넘기는 동안(CPU 스틸) 게임 서버가 멈춥니다. (인프라팀·서버 인프라)
- 컨테이너 CPU 스로틀링 (CFS 쿼터): 컨테이너에 CPU 한도를 걸면, 정해진 주기(보통 100ms) 안에 할당량을 다 쓴 순간 남은 시간 동안 강제로 멈춥니다(스로틀링). (인프라팀·서버 인프라)
- 메모리 회수·컴팩션으로 인한 멈춤: OS가 큰 페이지(huge page)를 만들려고 메모리를 컴팩션하거나 여유 메모리를 회수하는 동안 프로세스가 멈춥니다. (인프라팀·서버 인프라)
- 예약 작업: 매일 같은 시각에 도는 로그 압축·백업·보안 검사가 CPU와 디스크를 차지합니다. (인프라팀·서버 인프라)
- OS·커널·드라이버·펌웨어 업데이트 뒤 성능 변화: 게임 코드는 그대로인데 서버 OS·커널·드라이버·펌웨어를 업데이트한 뒤부터 서버가 느려집니다. 업데이트로 기본값, 스케줄러, CPU 취약점 완화(mitigations), 드라이버 동작이 바뀌기도 합니다. (인프라팀·서버 인프라)
L9 서버 게임 프로세스
- 틱 예산 초과: 한 틱 안에 할 일이 예산을 넘으면 서버의 틱 주기가 늘어지고 그 지역 전체가 느리게 흐르거나 뚝뚝 끊깁니다. (게임개발팀·서버 개발)
- 시야(AOI) 계산 폭증 (N²): 누가 누구를 볼 수 있는지 모두끼리 비교하면, 인원이 10배가 될 때 계산은 100배가 됩니다. (게임개발팀·서버 개발)
- 게임 스레드의 동기 호출: 틱 도중 DB 응답이나 파일 쓰기를 기다리면, 그 시간만큼 서버의 게임 진행 전체가 멈춥니다. (게임개발팀·서버 개발)
- 타이머 동시 발동 몰림: 모든 몬스터 리스폰, 모든 버프 만료, 정각 보상이 같은 틱에 몰리면 그 틱만 수십 배 무거워집니다. (게임개발팀·서버 개발)
- 개체 누적 (정리되지 않은 아이템·소환물): 사라져야 할 바닥 아이템, 소환물, 끝난 타이머가 정리되지 않고 쌓이면, 서버를 오래 켜 둘수록 매 틱 할 일이 늘어납니다. (게임개발팀·서버 개발)
L10 메모리
- 스크립트 엔진의 GC 멈춤: C++ 서버라도 퀘스트·AI·스킬을 Lua 같은 스크립트로 돌리면, 스크립트 엔진의 GC가 도는 동안 그 존이 멈춥니다. (게임개발팀·서버 개발)
- 할당 폭주: 이벤트 중 임시 객체를 대량으로 만들면 GC가 평소보다 훨씬 자주 돕니다. (게임개발팀·서버 개발)
L11 디스크
- 동기 로그 쓰기: 게임 스레드가 로그 한 줄마다 디스크 완료를 기다리면, 디스크가 바쁠 때 게임 진행도 같이 멈춥니다. (게임개발팀·서버 개발)
- fsync 폭주: 데이터를 “확실히” 디스크에 쓰도록 요청하면 디스크에 따라 한 번에 0.1ms~수십 ms가 걸리고, 몰리면 대기열이 길어집니다. (게임개발팀·서버 개발)
- 클라우드 디스크 버스트 크레딧 소진: 일부 클라우드 디스크와 작은 서버 사양은 잠깐 기준보다 빠르게 쓸 수 있는 버스트 크레딧이 있어서, 바쁜 시간이 길어져 크레딧이 바닥나면 속도가 갑자기 떨어집니다. (인프라팀·서버 인프라)
- 백업·압축·검사 작업: 새벽 백업, 로그 압축, 보안 검사가 디스크를 독점하면 게임 서버의 읽기·쓰기가 밀립니다. (인프라팀·서버 인프라)
L12 데이터베이스
- 체크포인트·로그 플러시: DB가 메모리의 변경분을 주기적으로 디스크에 몰아서 쓰는 순간 쿼리가 느려집니다. (인프라팀·DB 인프라)
L13 서버 구성과 운영
- 로그·모니터링 과부하: 장애가 나면 로그가 폭증하고 로그를 동기로 넘기는 서버는 로그 때문에 더 느려집니다. (게임개발팀·서버 개발)
동기화 설계
- 락스텝에서 가장 느린 플레이어 대기: 모두가 같은 턴을 함께 계산하는 구조에서는, 한 명의 입력이 늦으면 모두가 기다립니다. (게임개발팀·서버 개발)
- 타임스탬프 없는 도착 즉시 재생: 서버 이벤트에 발생 시각을 붙이지 않고 받자마자 재생하면, 네트워크 지터 때문에 연출 타이밍이 그대로 들쭉날쭉해집니다. (게임개발팀·클라이언트 개발)
- 호스트(방장) 구조: 한 플레이어의 PC가 서버 역할을 하면, 그 사람의 회선과 PC 성능이 모두의 체감을 정합니다. (게임개발팀·서버 개발)
- 낮은 스냅샷 전송률: 서버가 위치 업데이트(스냅샷)를 1초에 몇 번만 보내면 보간 버퍼를 그만큼 길게 잡아야 해서, 다른 캐릭터를 더 먼 과거로 봅니다. (게임개발팀·서버 개발)
일부에게만 생기는 문제
- 플레이어별 입력 버퍼 크기: 서버가 사람마다 입력을 조금 모아 두었다가 한 틱에 하나씩 꺼내 쓰면, 다른 사람 눈에는 매끄럽지만 본인 행동이 서버에서 확정되는 시점은 그만큼 늦어집니다. (게임개발팀·서버 개발)
- 몬스터 제어 권한이 느린 클라이언트에 있음: 서버 부하를 줄이려고 몬스터 이동 계산을 근처 플레이어 한 명의 클라이언트에 맡기는 게임이 있습니다. 그 사람 회선이 나쁘면 그 몬스터가 모두의 화면에서 이상하게 움직입니다. (게임개발팀·서버 개발)
- 메모리·VRAM 부족으로 스트리밍 실패: 클라이언트 두 개가 그래픽 메모리를 나눠 쓰면, 새로 필요한 모델·텍스처를 올릴 자리가 없어 일부가 안 그려집니다. (게임개발팀·클라이언트 개발)
- 시계 추정 오차로 개체 보류: 클라이언트가 추정한 서버 시각이 틀리면, 막 도착한 개체 정보를 “아직 미래”라며 보류하거나 “너무 옛날”이라며 버립니다. (게임개발팀·클라이언트 개발)
TCP 재전송의 근본 원인
- 순서 뒤바뀜으로 인한 불필요한 빠른 재전송: 여러 경로나 묶인 링크를 지나며 패킷 순서가 바뀌면, 받는 쪽이 중복 ACK로 “빠진 패킷 있음”을 알리고 보내는 쪽은 멀쩡한 패킷을 다시 보냅니다. (인프라팀·네트워크 인프라)
그림이 있는 원본 증상 사전 보기