DotsTween
[Unity] Update() vs Job, Burst 성능 비교
EveryDay.DevUp
2020. 7. 12. 23:03
ITween은 MonoBehaviour의 Update() 를 통해 Tween이 동작하는데, DotsTween도 동일하게 Update() 를 사용하지만 Job, Burst를 구현하여 동작하는 방식을 사용한다.
ITween에서 동작하는 방식이 Job,Burst 보다 성능적으로 좋다면 Job, Burst를 사용할 의미가 없기 때문에 두 방식의 성능 차이를 비교하고자 한다.
Update에서 1000000개의 float 데이터를 변경할 때의 성능을 비교함으로써 Job, Burst의 효과를 알아보고자 한다.
public class JobMain : MonoBehaviour
{
int count = 1000000;
float[] testValues;
private void Start()
{
testValues = new float[count];
for( int i = 0; i < count; i++ )
{
testValues[i] = 0;
}
}
void Update()
{
for( int i = 0; i < count; i++ )
{
testValues[i] += math.sin( Time.deltaTime );
}
Debug.LogWarning( "0 Index : " + testValues[0] );
}
}
Update() 만을 사용했을 때, 12 fps 정도의 성능을 보인다.
public struct JobTest : IJobParallelFor
{
public float deltaTime;
public NativeArray<float> result;
public void Execute(int index)
{
result[index] += math.sin( deltaTime );
}
}
public class JobMain : MonoBehaviour
{
int count = 1000000;
float[] testValues;
private void Start()
{
testValues = new float[count];
for( int i = 0; i < count; i++ )
{
testValues[i] = 0;
}
}
void Update()
{
NativeArray<float> results = new NativeArray<float>( testValues, Allocator.TempJob );
JobTest testJob = new JobTest();
testJob.deltaTime = Time.deltaTime;
testJob.result = results;
JobHandle handle = testJob.Schedule( results.Length, 32 );
handle.Complete();
results.CopyTo( testValues );
results.Dispose();
Debug.LogWarning( "0 Index : " + testValues[0] );
}
}
Update() + Job System을 이용했을 때 33 fps 정도의 성능을 보인다.
[BurstCompile( CompileSynchronously = true )]
public struct JobTest : IJobParallelFor
{
public float deltaTime;
public NativeArray<float> result;
public void Execute(int index)
{
result[index] += math.sin( deltaTime );
}
}
public class JobMain : MonoBehaviour
{
int count = 1000000;
float[] testValues;
private void Start()
{
testValues = new float[count];
for( int i = 0; i < count; i++ )
{
testValues[i] = 0;
}
}
void Update()
{
NativeArray<float> results = new NativeArray<float>( testValues, Allocator.TempJob );
JobTest testJob = new JobTest();
testJob.deltaTime = Time.deltaTime;
testJob.result = results;
JobHandle handle = testJob.Schedule( results.Length, 32 );
handle.Complete();
results.CopyTo( testValues );
results.Dispose();
Debug.LogWarning( "0 Index : " + testValues[0] );
}
}
Update() + Job System + Burst을 이용했을 때 216 fps 정도의 성능을 보인다.
Update() 만을 사용했을 때에 비해 Job+Burst를 사용하면 약 18배의 성능 향상이 되는 것을 확인 할 수 있다. 이 때문에 ITween을 대신하여 Job+Burst로 Tween을 구현하려는 것이다.