Hi, I’m trying to implement Dynamic Resolution on mobile. I’m building with Unity 2018.3.13f and Testing on a Xiaomi Mi A2. Here is my code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class DynamicResolutionManager : MonoBehaviour
{
[SerializeField] float _minHorizontalScale = 0.5f;
[SerializeField] float _minVerticalScale = 0.5f;
[SerializeField] float _horizontalScaleStep = 0.1f;
[SerializeField] float _verticalScaleStep = 0.1f;
[SerializeField] float _minFPS = 30f;
[SerializeField] float _maxFPS = 60f;
[SerializeField] float _upscaleInterval = 1f;
[SerializeField] bool _showDebugInfo = true;
[SerializeField] GameObject _canvas = null;
[SerializeField] Text _text = null;
float _verticalScale = 1f;
float _horizontalScale = 1f;
float _lastScale = 0f;
int _frameCount = 0;
void Start()
{
_text.text = "";
_canvas.SetActive(_showDebugInfo);
}
void Update ()
{
FrameTimingManager.CaptureFrameTimings();
if (++_frameCount < 50) return;
_frameCount = 0;
if (Time.deltaTime < 1f / _minFPS && Time.deltaTime > 1f / _maxFPS) return;
FrameTiming[] frameTimings = new FrameTiming[3];
uint timingsRetrieved = FrameTimingManager.GetLatestTimings(3, frameTimings);
if (timingsRetrieved <= 0) return;
if (frameTimings[0].gpuFrameTime > 1f / _minFPS)
{
long presentCalled = (long)frameTimings[0].cpuTimePresentCalled;
long frameComplete = (long)frameTimings[0].cpuTimeFrameComplete;
long frequency = (long)FrameTimingManager.GetCpuTimerFrequency();
if (frequency == 0) return;
float latency = 1000f * (frameComplete - presentCalled) / frequency;
float latencyFrames = latency / (float)frameTimings[0].gpuFrameTime;
if (latencyFrames <= 0.5f) return;
float horizontalScale = _horizontalScale;
float verticalScale = _verticalScale;
if (horizontalScale > _minHorizontalScale)
{
horizontalScale -= _horizontalScaleStep;
}
else if (verticalScale > _minVerticalScale)
{
verticalScale -= _verticalScaleStep;
}
if (horizontalScale != _horizontalScale || verticalScale != _verticalScale)
{
Scale(horizontalScale, verticalScale);
}
}
else if (Time.realtimeSinceStartup - _lastScale > _upscaleInterval && frameTimings[0].gpuFrameTime < 1f / _maxFPS)
{
float horizontalScale = _horizontalScale;
float verticalScale = _verticalScale;
if (verticalScale < 1f)
{
verticalScale += _verticalScaleStep;
}
else if (horizontalScale < 1f)
{
horizontalScale += _horizontalScaleStep;
}
if (horizontalScale != _horizontalScale || verticalScale != _verticalScale)
{
Scale(horizontalScale, verticalScale);
}
}
}
//=============================================================================
void Scale(float horizontalScale, float verticalScale)
{
_horizontalScale = horizontalScale;
_verticalScale = verticalScale;
ScalableBufferManager.ResizeBuffers(horizontalScale, verticalScale);
_lastScale = Time.realtimeSinceStartup;
if (_showDebugInfo)
{
_text.text = string.Format("{0} x {1}", Screen.currentResolution.width * _horizontalScale, Screen.currentResolution.height * _verticalScale);
}
}
}
It sometimes retrieves 0 frameTimings and sometimes 1, but gpuFrameTime is always 0. Is it something I’m missing?
Cheers,
Aitor