132 lines
4.9 KiB
C#
132 lines
4.9 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Sirenix.OdinInspector;
|
|
using TMPro;
|
|
using UnityEngine;
|
|
|
|
namespace Beyond
|
|
{
|
|
public class DynamicResolution : MonoBehaviour
|
|
{
|
|
public TextMeshProUGUI screenText;
|
|
|
|
FrameTiming[] frameTimings = new FrameTiming[3];
|
|
|
|
public float maxResolutionWidthScale = 1.0f;
|
|
public float maxResolutionHeightScale = 1.0f;
|
|
public float minResolutionWidthScale = 0.3f;
|
|
public float minResolutionHeightScale = 0.3f;
|
|
public float scaleWidthIncrement = 0.1f;
|
|
public float scaleHeightIncrement = 0.1f;
|
|
public float startScale = 0.5f;
|
|
|
|
float m_widthScale = 1.0f;
|
|
float m_heightScale = 1.0f;
|
|
|
|
// Variables for dynamic resolution algorithm that persist across frames
|
|
uint m_frameCount = 0;
|
|
|
|
const uint kNumFrameTimings = 2;
|
|
|
|
double m_gpuFrameTime;
|
|
double m_cpuFrameTime;
|
|
|
|
// Use this for initialization
|
|
void Start()
|
|
{
|
|
ScalableBufferManager.ResizeBuffers(startScale,startScale);
|
|
int rezWidth = (int)Mathf.Ceil(ScalableBufferManager.widthScaleFactor * Screen.currentResolution.width);
|
|
int rezHeight = (int)Mathf.Ceil(ScalableBufferManager.heightScaleFactor * Screen.currentResolution.height);
|
|
var rezText = string.Format("Scale: {0:F3}x{1:F3}\nResolution: {2}x{3}\n",
|
|
m_widthScale,
|
|
m_heightScale,
|
|
rezWidth,
|
|
rezHeight);
|
|
if (screenText)
|
|
screenText.text = rezText;
|
|
Debug.Log(rezText);
|
|
|
|
}
|
|
|
|
[Button]
|
|
void ScaleUp()
|
|
{
|
|
m_heightScale = Mathf.Max(minResolutionHeightScale, m_heightScale + scaleHeightIncrement);
|
|
m_widthScale = Mathf.Max(minResolutionWidthScale, m_widthScale + scaleWidthIncrement);
|
|
ScalableBufferManager.ResizeBuffers(m_widthScale, m_heightScale);
|
|
|
|
}
|
|
|
|
[Button]
|
|
void ScaleDown()
|
|
{
|
|
m_heightScale = Mathf.Max(minResolutionHeightScale, m_heightScale - scaleHeightIncrement);
|
|
m_widthScale = Mathf.Max(minResolutionWidthScale, m_widthScale - scaleWidthIncrement);
|
|
ScalableBufferManager.ResizeBuffers(m_widthScale, m_heightScale);
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void Update()
|
|
{
|
|
float oldWidthScale = m_widthScale;
|
|
float oldHeightScale = m_heightScale;
|
|
|
|
// // One finger lowers the resolution
|
|
// if (Input.GetButtonDown("Fire1"))
|
|
// {
|
|
// m_heightScale = Mathf.Max(minResolutionHeightScale, m_heightScale - scaleHeightIncrement);
|
|
// m_widthScale = Mathf.Max(minResolutionWidthScale, m_widthScale - scaleWidthIncrement);
|
|
// }
|
|
//
|
|
// // Two fingers raises the resolution
|
|
// if (Input.GetButtonDown("Fire2"))
|
|
// {
|
|
// m_heightScale = Mathf.Min(maxResolutionHeightScale, m_heightScale + scaleHeightIncrement);
|
|
// m_widthScale = Mathf.Min(maxResolutionWidthScale, m_widthScale + scaleWidthIncrement);
|
|
// }
|
|
|
|
if (m_widthScale != oldWidthScale || m_heightScale != oldHeightScale)
|
|
{
|
|
ScalableBufferManager.ResizeBuffers(m_widthScale, m_heightScale);
|
|
}
|
|
DetermineResolution();
|
|
int rezWidth = (int)Mathf.Ceil(ScalableBufferManager.widthScaleFactor * Screen.currentResolution.width);
|
|
int rezHeight = (int)Mathf.Ceil(ScalableBufferManager.heightScaleFactor * Screen.currentResolution.height);
|
|
var rezText = string.Format("Scale: {0:F3}x{1:F3}\nResolution: {2}x{3}\nScaleFactor: {4:F3}x{5:F3}\nGPU: {6:F3} CPU: {7:F3}",
|
|
m_widthScale,
|
|
m_heightScale,
|
|
rezWidth,
|
|
rezHeight,
|
|
ScalableBufferManager.widthScaleFactor,
|
|
ScalableBufferManager.heightScaleFactor,
|
|
m_gpuFrameTime,
|
|
m_cpuFrameTime);
|
|
//Debug.Log(rezText);
|
|
if (screenText)
|
|
screenText.text = rezText;
|
|
}
|
|
|
|
// Estimate the next frame time and update the resolution scale if necessary.
|
|
private void DetermineResolution()
|
|
{
|
|
++m_frameCount;
|
|
if (m_frameCount <= kNumFrameTimings)
|
|
{
|
|
return;
|
|
}
|
|
FrameTimingManager.CaptureFrameTimings();
|
|
FrameTimingManager.GetLatestTimings(kNumFrameTimings, frameTimings);
|
|
if (frameTimings.Length < kNumFrameTimings)
|
|
{
|
|
Debug.LogFormat("Skipping frame {0}, didn't get enough frame timings.",
|
|
m_frameCount);
|
|
|
|
return;
|
|
}
|
|
|
|
m_gpuFrameTime = (double)frameTimings[0].gpuFrameTime;
|
|
m_cpuFrameTime = (double)frameTimings[0].cpuFrameTime;
|
|
}
|
|
}
|
|
}
|