구획 나눔을 통한 충돌 연산 최적화 연습

권혁찬
∙∙조회 9
구획 나눔을 통한 충돌 연산 최적화 연습

개요

-적과 탄환의 충돌 판정을 체크하는데 연산을 너무 많이 함

-적마다 현재 존재하는 모든 탄환에 대해 충돌 체크 연산을 시행

-부딫힐 가능성이 제로인 저 멀리 있는 탄환과도 연산을 시행하고 있음

-이에 따라 게임 공간을 구역(Cell)으로 나눠 적이 있는 구역과 인접한 구역에 있는 탄환하고만 충돌 연산을 시행하도록 변경함

-구역은 10x10, 총 100개 192x108크기로 나눠짐

-현재 적의 좌표에 속하는 Cell과 인접한 8개의 Cell내에 있는 탄환을 가져옴

-탄환은 컨테이너에서 매 Update마다 Cell에 미리 넣어둬 매 충돌마다 위치 체크를 하지 않도록 함

 

 

실험 환경

-최대 프레임 120으로 설정

-플레이어는 매 프레임마다 탄환을 발사

-적은 100마리 소환

-탄환은 적에게 적중하거나 발사후 3초가 지나면 사라짐

-적에게 계속 쏘는 상황과 적에게 적중하지 않고 옆으로 지나치는 상황 2개를 체크

 

 

기존 모든 탄환 충돌 연산

-적에게 계속 쏠때(탄환이 지워질때) 70~80 정도의 프레임 유지

-적중하지 않고 옆으로 지나치자 게임 내 탄환 개수가 급증해 30~40프레임까지 내려감

 

Cell 기반 탄환 충돌 연산

-적에게 계속 쏠때 100~110 정도의 프레임 유지

-적중하지 않고 옆으로 지나치자 70~80프레임으로 감소

-인접 Cell에 걸치지 않도록 완전히 빗나가게 쏘자 충돌 연산 틱이 감소하고 프레임이 소폭 개선됨

결과

-Tick 체크상 대략 연산량이 60~70% 정도 감소함

-특히 탄환이 빗나가 적과 전혀 접촉하지 않는 상황에서 큰 개선 폭을 보임(90% 이상)

-적이 한데 뭉쳐 구획을 나눈 의미가 약간 퇴색되는 상당히 특수한 환경에서 진행했기에 실제 게임 환경(탄환과 적이 고르게 퍼져있는)에서는 각 적들이 자기 인접 셀에 있는 탄환만 체크하여 좀 더 나은 효율을 보여 주리라 기대됨