우리 게임은 방치형 게임이기에 BigInteger를 사용하여 큰 정수들을 관리하고 있는데 ,
int 자료형으로는 값 감당이 되지않아 ulong으로 변경하여 사용하였다 .
1:1 전투시에는 문제가 없지만
1 : 다 전투 + 다단히트 + 광역 기술을 사용할경우 콜라이더 충돌 처리 하여 데미지 계산을 함과 동시에
BigInteger 클래스 -> ulong 으로 변경할때 너무 많은 연산처리가 일어나 유니티 크래쉬가 일어난다.
이전 코드
public void TakeDamage(BigInteger damage, StatHandler statHandler)
{
var maxHelth = BigInteger.ToUInt64(statHandler.CurrentStat.maxHealth);
var curHelth = BigInteger.ToUInt64(statHandler.CurrentStat.health);
var result = BigInteger.ToUInt64(damage);
if(curHelth - result > result) //unsinged 자료형이기에
{
statHandler.CurrentStat.health = 0;
}
else
{
statHandler.CurrentStat.health = curHelth - result;
}
HpUpdate();
}
BigInteger.ToUInt64를 통해 변환하는과정을 겪는데, 해당 과정의 처리비용이 정말 높다.
하지만 Int 값으로 조정될떄는 처리비용이 낮다고는 할수없지만, ulong으로 변경되며 처리비용을 생각하지 못하고
해당 코드를 그대로 작성하여 사용한 결과
유니티 크래쉬가 발생하며 , 원인이 어디서 발생했는지 찾기가 어려웠다.
찾기위해서 유니티 크래쉬가 일어나는 시점을 찾기위해 런타임 + 디버그 모드를 통해 크래쉬 발생 지점을 유추하고
해당 코드를 보면서 대략적으로 몇번의 루프문이 도는지 , 오버플로우가 일어나는지 생각해보았다.
근데 이 코드에서는 변환과정이 필요하지 않은데 억지로 변환하여 사용하고 있고 또한 그 전 메서드에서 damage 값을 처리해서 오는데 그걸 또 비교문을 통해서 동작하고 있었던것이 원인이였다.
개선된 코드
//플레이어와 Enemy가 공동으로 사용하는 TakeDamage 메서드
public void TakeDamage(BigInteger damage, StatHandler statHandler)
{
statHandler.CurrentStat.health = statHandler.CurrentStat.health - damage;
HpUpdate();
}
해당 코드로 변경하고 나서 많은 연산처리가 줄어 정상적으로 유니티크래쉬가 발생하지 않게 되었다.