FPS(Frame Per Second)란 1초 동안 화면이 몇번 다시 그려지는지를 의미한다. 즉 FPS가 높을수록 화면이 부드럽게 보이게 된다.
일반적인 게임의 경우 30 FPS 이상이며, FPS가 15보다 낮다면 중대한 성능 문제의 징후라고 볼 수 있다.
FPS는 Game 뷰에서 Stats를 클릭하면 볼 수 있는데,
여기서 표시되는 FPS는 프레임 업데이트 및 게임 뷰의 렌더링에 걸린 시간을 의미하고
에디터 전용 작업을 수행하는데 걸리는 시간 등은 반영되지 않는다.
그리고 에디터에서만 확인할 수 있기 때문에, 실제 기기에서는 Stats를 통해 FPS를 확인할 수 없다.
FPS를 유니티 Game 뷰에 띄우기 위한 스크립트이다.
Time.deltaTime은 프레임 사이 간격을 나타내는데,
이와 비슷하지만 TimeScale의 영향을 받지 않는 것이 Time.unscaledDeltaTime이다.
Update()에서 0.1을 곱하는 이유는 단순히 값이 너무 빨리 바뀌면 보기 어려울수 있기 때문으로, 곱하지 않아도 상관없다.
중간에 사용된 OnGUI() 함수는 IMGUI(Immediate Mode GUI)를 구동시키기 위해 사용하였다.
IMGUI는 우리가 일반적으로 사용하는 GameObject 기반의 UI 시스템인 UGUI가 나오기 전부터 있었던 옛날 방식의 GUI로,
코드에 의해 구동되며 프로그래머의 도구로서(ex. 디버깅, 커스텀 인스펙터 제작 등) 활용될 목적으로만 설계된 시스템이라고 한다.
OnGUI()의 코드는 매 프레임마다 실행되며, 화면에 직접 그려지기 때문에
FPS를 "디버깅용으로, 간단하게, 실시간으로" 화면에 표시하기에 적합하다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FrameCounter : MonoBehaviour
{
private float deltaTime = 0f;
[SerializeField] private int size = 25;
[SerializeField] private Color color = Color.red;
void Update()
{
deltaTime += (Time.unscaledDeltaTime - deltaTime) * 0.1f;
}
private void OnGUI()
{
GUIStyle style = new GUIStyle();
Rect rect = new Rect(30, 30, Screen.width, Screen.height);
style.alignment = TextAnchor.UpperLeft;
style.fontSize = size;
style.normal.textColor = color;
float ms = deltaTime * 1000f;
float fps = 1.0f / deltaTime;
string text = string.Format("{0:0.} FPS ({1:0.0} ms)", fps, ms);
GUI.Label(rect, text, style);
}
}
결과물
참고한 영상
https://www.youtube.com/watch?v=9GFw7GZN7t0&t=436s
'유니티' 카테고리의 다른 글
[Unity] 알아두면 유용한 Mathf 클래스 (1) | 2022.11.07 |
---|---|
[Unity] 캔버스에서 클릭한 UI 이름 알아내기 / IPointerClickHandler / pointerCurrentRaycast (0) | 2022.11.06 |
[Unity] 캔버스 마스크 / UI의 원하는 부분만 보이게 하기 (0) | 2022.11.06 |
[Unity] 마우스 뗄 때 이벤트가 발생하는 슬라이더 만들기 / IPointerUpHandler (0) | 2022.10.07 |
[Unity] Scene과 Game 화면이 다르게 나오는 경우 (1) | 2022.10.06 |