우리 게임은 방치형 게임이기에 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();
  }

 

해당 코드로 변경하고 나서 많은 연산처리가 줄어 정상적으로 유니티크래쉬가 발생하지 않게 되었다. 

+ Recent posts