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

댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
개요
-적과 탄환의 충돌 판정을 체크하는데 연산을 너무 많이 함
-적마다 현재 존재하는 모든 탄환에 대해 충돌 체크 연산을 시행
-부딫힐 가능성이 제로인 저 멀리 있는 탄환과도 연산을 시행하고 있음
-이에 따라 게임 공간을 구역(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% 이상)
-적이 한데 뭉쳐 구획을 나눈 의미가 약간 퇴색되는 상당히 특수한 환경에서 진행했기에 실제 게임 환경(탄환과 적이 고르게 퍼져있는)에서는 각 적들이 자기 인접 셀에 있는 탄환만 체크하여 좀 더 나은 효율을 보여 주리라 기대됨

개요 -유니티에서 게임오브젝트를 움직이게 하기 위해서 Tranform에 접근함 -작업 한번이 무거운건 아니지만, 탄환-플레이어-적 등을 이동시키다보면 매프레임 이에 접근하게 되고 쌓여서 작지 않은 부하가 됨 -특히 구현중인 리플레이 시스템에서 매 프레임마다 개체들의 위치,각도,크기 를 저장하고 있기 때문에 접근횟수가 몇배로 뻥튀기되어 무시 못할 정도 -따라

개요 -탄환이 많을때 되감기 시 급격한 프레임 드랍이 발생함 -이론적 지표가 아닌 현실적으로 가능한 수치인 수백개 선에서도 상당한 버벅임 발생 -이는 컨테이너의 Load 메소드가 비효율적으로 동작하기 때문 -따라서 알고리즘을 개선하여 Load 메소드 작동 시간복잡도를 낮춤 기존 작동방식 -컨테이너 아이템들의 IndexId,ObjId,각 아이템의 SaveDa

개요 -통상적, 편의상으로 데이터들의 ID는 문자열값으로 부여함 -리플레이 시스템 구현을 위해서 해당 개체의 베이스 데이터 ID값을 저장해둬야함. 그래야 로드 시 해당 개체가 존재하지 않을때 DB에서 데이터를 찾아와 인스턴싱 가능 -하지만 문자열을 SaveData로 하면 byte[]로 변환할때 많은 용량을 사용하고 성능도 좋지 않음 -따라서 DB딴에서 처음

개요 -유니티에서 게임오브젝트를 움직이게 하기 위해서 Tranform에 접근함 -작업 한번이 무거운건 아니지만, 탄환-플레이어-적 등을 이동시키다보면 매프레임 이에 접근하게 되고 쌓여서 작지 않은 부하가 됨 -특히 구현중인 리플레이 시스템에서 매 프레임마다 개체들의 위치,각도,크기 를 저장하고 있기 때문에 접근횟수가 몇배로 뻥튀기되어 무시 못할 정도 -따라

개요 -탄환이 많을때 되감기 시 급격한 프레임 드랍이 발생함 -이론적 지표가 아닌 현실적으로 가능한 수치인 수백개 선에서도 상당한 버벅임 발생 -이는 컨테이너의 Load 메소드가 비효율적으로 동작하기 때문 -따라서 알고리즘을 개선하여 Load 메소드 작동 시간복잡도를 낮춤 기존 작동방식 -컨테이너 아이템들의 IndexId,ObjId,각 아이템의 SaveDa

개요 -통상적, 편의상으로 데이터들의 ID는 문자열값으로 부여함 -리플레이 시스템 구현을 위해서 해당 개체의 베이스 데이터 ID값을 저장해둬야함. 그래야 로드 시 해당 개체가 존재하지 않을때 DB에서 데이터를 찾아와 인스턴싱 가능 -하지만 문자열을 SaveData로 하면 byte[]로 변환할때 많은 용량을 사용하고 성능도 좋지 않음 -따라서 DB딴에서 처음