게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타...
TRANSCRIPT
게임에서 흔히 쓰이는 최적화 전략
기본적인 이야기
• 기본적인데 잘 안되는 이유✓ 바쁘니까
• 기본적인데 잘 안고치는 이유✓ 돌아가니까
✓ 장비가 좋아지니까
최적화
• 다양한 의미의 최적화
• 공간 최적화✓ 요즘은 뒷전✓ 사실상 개발비로 제한
• 속도 최적화 ✓ 항상 중요
속도 최적화
• 게임은 무조건 빠르게!✓ 화려한 그래픽✓ 부드러운 애니메이션✓ 현실적인 상호작용✓ 칼같은 조작감의 밑거름
• ‘빠르다’의 기준✓ 감이 아니라 측정 결과로 비교
측정
• 대기시간✓ RESPONSE TIME✓ LATENCY
• 처리속도✓ THROUPUT
* TURN AROUND TIME
프로파일러
• 직접 만들어 쓴다✓ 부하가 적다 (꼭 필요한 데이터만)✓ 실제 성능과 근접한 수치✓ 번거롭다
• 남이 만든걸 쓴다✓ 자세한 추세 파악이 가능✓ 그중에 으뜸은 인텔 VTune
처리속도 최적화
일을 시작한 후, 일하는 시간동안 얼마나 많은 양의
유효한 결과를
낼 수 있느냐
작업량 최적화
원하는 결과를 내는 데에 쓸모 없는 일을 줄이는 것
데이터 최적화
컴퓨팅 : 데이터를 처리하는 것.
데이터를 줄이는 것이
최적화의 가장 기본
데이터 양을 줄이면 당연히처리가 빨리 끝남!
데이터 양과 계산량
• 빅-오 (Big-O) 표기법✓ 데이터양과 처리시간 사이의 관계를 나타내는 함수
• O( n ) • O( n2 ) • O( en ) • O( 1 )
오래된 기법들
• LOD
• MIPMAP
• HSR
MIPMAP의 예
경험 사례
• 클라이언트 용량 약 10GB✓ 대부분은 고해상도 텍스쳐✓ 국내 OK✓ 해외 NG (중국,태국,남미)
• 텍스쳐 MIP레벨을 강제로 줄여서 배포✓ 클라이언트 용량 약 4GB로 절감
알고리듬 최적화
같은 데이터를 가지고
더 효율적인 과정을
통해 처리하는 것
흔한 최적화
• 삽입 정렬을 퀵 정렬로.
• 선형 검색을 해쉬 함수로.
• 백트래킹을 다이내믹 프로그래밍으로.
• 깊이우선 탐색을 A*로.
알고리듬 최적화 주의
• 동일한 결과 보장
• 속도와 메모리 사용량의 관계
• 데이터 양 고려
저수준 최적화
같은 데이터, 같은 처리 과정을 기계가 더 빠르게 수행할 수 있도록
다듬는 일10% 내외의 성능향상 기대
스크립트 최적화
스크립트를 네이티브로 바꾸면
확실한 성능향상 (해당 부분은 5~10배)
하지만, 전체에서 차지하는 비율이 작은 경우가 대부분
네이티브 최적화
CPU 고유의 특성을 살리는 코드를 짜는 일
분기예측,캐시,정수/소수혼합, 고유 명령셋 등등등
(어셈블리가 동원되기도….)
단, 컴파일러 최적화와 비교해야 함
경험 사례
• 스크립트 병목은 수시로 네이티브로
• 네이티브 최적화는 컴파일러로✓ 컴파일러 선택이 중요✓ 최신버전이 일반적으로 성능이 우수✓ 그중 으뜸은 인텔 컴파일러
중간 정리
• 처리속도 최적화✓ 데이터 최적화✓ 알고리듬 최적화✓ 저수준 최적화
• 대기시간 최적화
메모리와 데이터
컴퓨팅 : 데이터를 처리하는 것
메모리 : 데이터가 담겨 있는 장치
메모리 계층
• Memory Heirachy ✓ 비쌀수록 빠르고 용량이 적다.
응답속도 CPU 클럭 사이클레지스터 0.3 ns 미만 동일
CPU캐시 1~2 ns 4~10 사이클시스템 메모리 30~50 ns 100~150 사이클SSD 0.1 ms 100만 사이클 이상HDD 8 ms 10억 사이클 이상클라우드 10 ms 이상 10억 사이클 이상
대기시간 최적화
데이터가 오가는 데 걸리는 CPU의
대기시간이 줄도록
만드는 일
즉, 줄어든 시간만큼 다른 유용한 일을 할 수 있음
캐시의 사용
데이터를 느린 곳에서 빠른 곳으로
미리 옮겨놓는 일
각 게임만의 고유한 특성을 반영하면 더 지능적인 캐시 가능
캐시 전략
• 싱글플레이어 게임✓ 100% 예측가능
• 온라인 멀티플레이어 게임✓ 다른 사용자의 활동은 예측 불가능✓ 휴리스틱이 중요✓ 통계기반캐싱, Lazy Deletion,
경험 사례
• 캐릭터 그래픽 캐시 전략✓ 기본 : 캐릭터 스폰시 로드✓ AI캐릭터 : 모두 프리캐시✓ 퇴장한 플레이어 : Lazy Deletion
• 물리연산 데이터✓ 코어가 남으면 메인메모리에서 캐싱✓ CPU아키텍쳐에 맞춘 데이터 사이즈
병렬화
컴퓨터가
둘 이상의 작업을 동시에
하게 만드는 일.
병렬화 대상
• 데이터를 이동시키는 시간동안 다른 유의미한 일을 하는 것에 중점
• 그 외에도 렌더링, 물리연산 등 CPU를 대기하게 만드는 작업이 많음.
동기화와 비동기화
• 동기화 : 확인절차를 거치고 다음으로 진행
• 비동기화 : 확인절차 없이 다음으로 진행
• 병렬화 : 비동기적으로 진행한 후 동기화
경험 사례
• 비동기 방식 로딩 도입✓ 플레이어 진입시 자리만 마련하고 로딩 요청
(비동기)✓ 그래픽 데이터 구성은 로딩 완료 신호가 뜰 때
(동기화)
• 100ms 이상의 히치 90% 이상 감소
마무리
• 최적화는 측정이 중요!
• 처리속도 최적화는 데이터, 알고리듬, 저수준
• 대기속도 최적화는 메모리 위계를 염두
• 질문?