📒 시간 기반 서버 루프
✅ 기본 개념
- 서버는 일정한 주기로 동작하는 루프(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) → 어셈블리로 디버깅.
✨ 요약:
서버 루프는 정확한 주기와 프레임 관리가 중요하고, 메모리 디버깅은 시스템 구조를 이해하고 디버깅 도구를 적극 활용하는 것이 핵심이다.
'[내일배움캠프 Unity 9기]' 카테고리의 다른 글
| 04/30 TIL - 유니티 입문(Stack Block) (2) | 2025.04.30 |
|---|---|
| 04/29 TIL - 유니티 입문 강의 수강 (1) | 2025.04.29 |
| 04/25 복습내용 (0) | 2025.04.25 |
| 04/24 캠프 배치고사 및 복습 내용 (0) | 2025.04.24 |
| 04/23 TIL 인터페이스 클래스의 json 직렬화/역직렬화 (0) | 2025.04.23 |