[내일배움캠프 Unity 9기]

04/28 TIL - 복습내용(시간 기반 서버 루프 / 메모리 디버깅)

kyvv 2025. 4. 28. 21:07

📒 시간 기반 서버 루프

✅ 기본 개념

  • 서버는 일정한 주기로 동작하는 루프(loop) 를 가진다.
  • 정확한 루프 주기를 맞추기 위해 고해상도 타이머를 사용한다.

✅ 주요 함수

  • timeBeginPeriod(1): 타이머 간격을 1ms로 설정 (반드시 초기화 시 호출).
  • QueryPerformanceCounter() / QueryPerformanceFrequency()
    • 고해상도 타이머 사용.
    • Counter / Frequency를 나눠 초 단위 시간 계산.

✅ 프레임 제어 방식

  • 목표 프레임 예시:
    • MMO: 약 10fps
    • RPG: 약 30fps
    • 액션 게임: 50~60fps
  • 루프 구조:
  • cpp
    복사편집
    while (running) { auto start = GetTime(); // QueryPerformanceCounter 사용 ProcessLogic(); auto elapsed = GetTime() - start; Sleep(20 - elapsed); // 50FPS 기준 (20ms 주기) }

✅ sleep 보정

  • 로직 처리에 걸린 시간(elapsed)을 빼서 sleep 시간을 조정해야 정확한 주기 유지 가능.

✅ 입력/로직/렌더링 분리

  • 입력(Input)로직(Logic) 은 합칠 수 있지만,
  • 렌더링(Rendering) 은 별도로 분리해야 유지보수가 쉬워진다.

✅ 고해상도 주의사항

  • CPU마다 QueryPerformanceFrequency()가 다를 수 있음 → 항상 재확인 필요.
  • 멀티코어 환경에선 QueryPerformanceCounter()가 코어마다 오차 발생 가능성 존재.

 

📒 메모리 디버깅 시나리오

✅ 메모리 구조 복습

  • 프로세스는 다음 메모리 영역을 가진다:
    • .text (코드 영역), .data (초기화 데이터), 힙(Heap), 스택(Stack)
  • 메모리는 보통 4KB 페이지 단위로 관리된다.

✅ 디버깅 기법

  • .pdb 파일: 소스코드와 메모리 주소 매핑 → 덤프 분석 필수.
  • 덤프 파일 생성:
    • 작업 관리자 → 프로세스 → 덤프 파일 만들기
  • 디버깅 연결:
    • 실행 중 디버거 연결해 디버깅 (프로세스 연결).

✅ 메모리 브레이크 (데이터 중단점)

  • 특정 메모리 주소에 변화가 생길 때 멈추는 기능.
  • 메모리 확정 이후에만 설정 가능.

✅ 코드 중단 기법

  • DebugBreak() / __debugbreak()
    • 소프트웨어 인터럽트(3번) 발생 → 프로그램을 멈춤.
  • 사용 목적:
    • 결함(논리 불일치)이 발생했을 때 서버를 즉시 중단시키기 위해 사용.
    • 데이터 오염을 방지.

✅ 에러 발생 주요 시나리오

  • 댕글링 포인터 접근
  • 널 포인터 접근
  • 페이지 외부 메모리 접근

✅ 기타 디버깅 팁

  • 조사식(Watch) 창에서 포인터+숫자로 배열처럼 접근 가능.
  • 어셈블리 창에서 레지스터 상태 확인 후 문제 추적.
  • 실행 중 외부 라이브러리 함수에서 멈출 경우:
    • 외부 기호 로드(Load Symbols) → 어셈블리로 디버깅.

요약:
서버 루프는 정확한 주기와 프레임 관리가 중요하고, 메모리 디버깅은 시스템 구조를 이해하고 디버깅 도구를 적극 활용하는 것이 핵심이다.