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; } } }