트랜스폼 참조 캐싱을 통한 성능 향상 체크

댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
개요
-유니티에서 게임오브젝트를 움직이게 하기 위해서 Tranform에 접근함
-작업 한번이 무거운건 아니지만, 탄환-플레이어-적 등을 이동시키다보면 매프레임 이에 접근하게 되고 쌓여서 작지 않은 부하가 됨
-특히 구현중인 리플레이 시스템에서 매 프레임마다 개체들의 위치,각도,크기 를 저장하고 있기 때문에 접근횟수가 몇배로 뻥튀기되어 무시 못할 정도
-따라서 Tranform의 여러 값들을 변경할때 변경 정보를 각 개체의 필드값에 캐싱해두고 수정, 참조 요청이 들어올때 트랜스폼을 호출하는 대신 캐싱한 정보를 반환하도록 함
코드 상세
private Vector2 m_curPos = new Vector2(int.MaxValue,int.MaxValue);
private Vector2 m_Scale = new Vector2(int.MaxValue,int.MaxValue);
private float m_angle = 99999;
public Vector2 Position
{
get
{
if(m_curPos.x == int.MaxValue)
{
Position = transform.position;
return transform.position;
}
return m_curPos;
}
set
{
if(m_curPos == value) return;
m_curPos = value;
transform.position = value;
}
}
public virtual Vector2 Scale
{
get
{
if(m_Scale.x == int.MaxValue)
{
Scale = transform.localScale;
return transform.localScale;
}
return m_Scale;
}
set
{
if(m_Scale == value) return;
m_Scale = value;
transform.localScale = value;
}
}
public virtual float Angle
{
get
{
if(m_angle == 99999)
{
Angle = transform.eulerAngles.z;
return transform.eulerAngles.z;
}
return m_angle;
}
set
{
if(m_angle == value) return;
m_angle = value;
transform.eulerAngles = new Vector3(0,0,value);
}
}
-2D 게임이므로 Z축 이동 및 스케일과 XY회전을 활용하지 않음. 이에 맞춰서 Position,Scale,Angle 프로퍼티 작성
-트랜스폼 접근은 모두 해당 프로퍼티를 통해 이뤄져야함
실험
-캐싱을 하지 않고 항상 트랜스폼에 참조할때, 위 캐싱 프로퍼티들을 사용할때 두 경우를 프로파일러로 관찰
-적이 우측에서 소환되고 초당 10발씩 탄환을 플레이어를 향해 발사
캐싱 X
-저장 시 탄환의 Position,Scale,Angle을 저장하며 각 2%, 총 6% 정도의 연산 발생
-업데이트에서 탄환의 위치를 변경하며 3.7% 정도의 연산 발생(get_transform과 get_right는 현 최적화와 무관한 연산. 추후 따로 조치)
-결과적으로 탄환의 위치정보를 저장하고 매 프레임마다 위치를 변경하는데 총 연산의 10%를 소모함


캐싱 O
-저장 시 연산이 0.5% 미만으로 거의 사라짐
-업데이트에서 탄환 위치 변경시 set_posititon에서 1.8% 정도 연산 발생
-결과적으로 총 연산의 2% 정도를 소모


결과
-변경한 트랜스폼 값을 캐싱한걸로 현재 게임내 관련 연산량이 80% 감소함. 특히 핵심 시스템인 되감기의 Save에선 90%이상의 높은 효율을 보임
-탄환을 임의로 대량 생산한 실험이었기에 실제 게임에서 총 연산 대비 효과는 이정도로 극적이진 않을 것

개요 -적과 탄환의 충돌 판정을 체크하는데 연산을 너무 많이 함 -적마다 현재 존재하는 모든 탄환에 대해 충돌 체크 연산을 시행 -부딫힐 가능성이 제로인 저 멀리 있는 탄환과도 연산을 시행하고 있음 -이에 따라 게임 공간을 구역(Cell)으로 나눠 적이 있는 구역과 인접한 구역에 있는 탄환하고만 충돌 연산을 시행하도록 변경함 -구역은 10x10, 총 100

PPU에서말하는 Units는 Gird타일의 한 칸을 의미합니다.

우리들의 게임 발매 이야기

개요 -적과 탄환의 충돌 판정을 체크하는데 연산을 너무 많이 함 -적마다 현재 존재하는 모든 탄환에 대해 충돌 체크 연산을 시행 -부딫힐 가능성이 제로인 저 멀리 있는 탄환과도 연산을 시행하고 있음 -이에 따라 게임 공간을 구역(Cell)으로 나눠 적이 있는 구역과 인접한 구역에 있는 탄환하고만 충돌 연산을 시행하도록 변경함 -구역은 10x10, 총 100

