프레임(Frame) : 정지된 게임상황, 장면
FPS(Frame per Second) : 1초 동안 표현한 프레임수
단위시간(DeltaTime) : 1프레임 동안 소모한 시간
DeltaTime == 1 / FPS
<프레임>
만화영화의 움직이는 그림들은 연속된 정지 그림들을 빠르게 전환하며 보여주어 움직이는 듯한 착각을 일으키는 방법이다.
게임도 마찬가지로 정지된 게임상황을 연속적으로 빠르게 교체하여 움직이는 게임상황처럼 표현한다.
이 각각의 정지 게임상황을 '프레임(Frame)'이라 하며 Unity의 경우 1프레임 당 1Update 가 진행된다.
<*FPS>
1초 동안 표현한 프레임수이다.
보통의 경우 30FPS 이상일 경우 움직이는 듯한 시각효과를 보여주며,
30FPS 이하일 경우 눈으로도 게임의 정지상황을 포착할 수 있게 된다.
<단위시간>
1프레임 동안 소모한 시간
Unity의 경우 Update마다 소요된 시간
<시간동기화>
게임의 FPS은 가변적이며 확정되어 있지 않다.
컴퓨터의 사양에 따라 처리시간이 다르거나, 외부의 요인으로 지연시간이 발생할 수 있기 때문이다.
게임이 다양한 상황에 따라 처리시간이 다를 수 있지만, 어떠한 기기에서든 동일한 게임진행이 되어야한다.
단위시간을 기반으로 게임을 구성할 경우 처리시간과 무관하게 모든 기기에서 동일한 게임진행이 가능하다.
(ex)
게임이 10FPS 일 경우 : 1 / 10초마다 10번씩 움직임 -> 결과는 1초동안 1 움직임
게임이 100FPS 일 경우 : 1 / 100초마다 100번씩 움직임 -> 결과는 1초동안 1 움직임
게임이 x FPS 일 경우 : 1 / x 초마다 x번씩 움직임 -> 결과는 1초동안 1 움직임
작업을 다수의 프레임에 분산할 수 있는 비동기식 작업이다.
반복가능한 작업을 분산하여 진행하며, 실행을 일시정지하고 중단한 부분부터 다시시작할 수 있다.
단, 코루틴은 스레드가 아니며 코루틴의 작업은 여전히 메인 스레드에서 실행한다.
// <코루틴 진행>
// 반복가능한 작업을 StartCorouine을 통해 실행
IEnumerator SubRoutine()
{
for (int i = 0; i < 10; i++)
{
yield return new WaitForSeconds(1);
Debug.Log("코루틴 1초");
}
}
private Coroutine routine; //코루틴 변수 생성
private void CoroutineStart()
{
routine = StartCoroutine(SubRoutine());
}
// <코루틴 종료>
// StopCoroutine을 통해 진행 중인 코루틴 종료
// StopAllCoroutine을 통해 진행 중인 모든 코루틴 종료
// 반복가능한 작업이 모두 완료되었을 경우 자동 종료
// 코루틴을 진행시킨 스크립트가 비활성화된 경우 자동 종료
private void CoroutineStop()
{
StopCoroutine(routine); // 지정한 코루틴 종료
//StopCoroutine(SubRoutine()); 잘못된 사용법, 함수를 멈추는게 아닌 routine을 멈추는 기능이다.
StopAllCoroutines(); // 모든 코루틴 종료
}
// <코루틴 시간 지연>
// 코루틴은 시간 지연을 정의하여 반복가능한 작업의 진행 타이밍을 지정할 수 있음
IEnumerator CoRoutineWait()
{
yield return new WaitForSeconds(n); // n초간 시간지연
yield return null; // 시간지연 없음
}