간단한 모바일 에셋 제작하면서 모바일로 테스트하는데 프레임이 떨어져서 조사해본 내용.
겸사겸사 나중에 프레임 테스트용으로 쓰려고 포스팅해둠.
아래 내용의 테스트 기종은 Samsung Z flip3 입니다.
모바일에서는 프레임 디폴트 값이 30fps 로 나옴
Application.targetFrameRate
프로퍼티로 조절 가능
Application.targetFrameRate
세팅 안하고 그냥 찍어보면 PC에서는 '-1'로 나옴
Project Settings
에 기본 프레임 세팅하는 곳이 있나 찾아봤지만 없었음
Project Settings - Quality Setting
이 있음. Level에 따라 세팅값들을 바꿀 수 있음 (그런데 왜 프레임 세팅은 없냐고...)
테스트 해본 결과 120fps 까지도 모바일에서 세팅 가능(폰에 따라 다를지도?)
하지만 모바일에서 30, 60, 120 등과 같이 특정 값이 아닌 70, 80 이런 값으로는 세팅 안됨. (이는 모바일에서는 vSync가 항상 On 되어있기 때문)
아래 코드는 대략적인 FPS 를 표시하는 용도. 매우 정확한 FPS 를 표시해주지는 않음. (정확한 FPS 를 체크하고 싶다면 Precise frame rates in Unity 참조)
_fpsUpdateTimer
는 실제 기능과 상관없지만 세팅 안해두면 Update 마다 텍스트가 바뀌는 탓에 눈이 피곤해서 추가함
using System.Collections.Generic;
using TMPro;
using UnityEngine;
public class GameManager : MonoBehaviour
{
[SerializeField] TMP_Dropdown _dropdown = null;
[SerializeField] TMP_Text _fpsText = null;
List<string> _dropDownOptionList = new();
float _fpsUpdateTimer = 0f;
void Start()
{
_dropDownOptionList.Add(Application.targetFrameRate.ToString());
_dropDownOptionList.Add("30");
_dropDownOptionList.Add("60");
_dropDownOptionList.Add("80");
_dropDownOptionList.Add("120");
_dropDownOptionList.Add("144");
_dropdown.AddOptions(_dropDownOptionList);
_dropdown.onValueChanged.AddListener(ChangeFPS);
}
void Update()
{
float fps = 1.0f / Time.deltaTime;
float ms = Time.deltaTime * 1000.0f;
_fpsUpdateTimer += Time.deltaTime;
if (_fpsUpdateTimer >= 0.1f)
{
_fpsUpdateTimer = 0f;
_fpsText.text = $"{(int)fps} FPS ({ms:.0}ms)";
}
}
private void ChangeFPS(int idx)
{
int fps = int.Parse(_dropDownOptionList[idx]);
Application.targetFrameRate = fps;
}
}