mirror of
https://git.naxdy.org/Mirror/Ryujinx.git
synced 2024-12-29 03:53:05 +00:00
326749498b
* dotnet format style --severity info Some changes were manually reverted. * dotnet format analyzers --serverity info Some changes have been minimally adapted. * Restore a few unused methods and variables * Silence dotnet format IDE0060 warnings * Silence dotnet format IDE0052 warnings * Address or silence dotnet format IDE1006 warnings * Address dotnet format CA1816 warnings * Address or silence dotnet format CA2208 warnings * Address or silence dotnet format CA1806 and a few CA1854 warnings * Address dotnet format CA2211 warnings * Address dotnet format CA1822 warnings * Address or silence dotnet format CA1069 warnings * Make dotnet format succeed in style mode * Address or silence dotnet format CA2211 warnings * Address review comments * Address dotnet format CA2208 warnings properly * Make ProcessResult readonly * Address most dotnet format whitespace warnings * Apply dotnet format whitespace formatting A few of them have been manually reverted and the corresponding warning was silenced * Add previously silenced warnings back I have no clue how these disappeared * Revert formatting changes for while and for-loops * Format if-blocks correctly * Run dotnet format style after rebase * Run dotnet format whitespace after rebase * Run dotnet format style after rebase * Run dotnet format analyzers after rebase * Run dotnet format after rebase and remove unused usings - analyzers - style - whitespace * Disable 'prefer switch expression' rule * Add comments to disabled warnings * Fix a few disabled warnings * Fix naming rule violation, Convert shader properties to auto-property and convert values to const * Simplify properties and array initialization, Use const when possible, Remove trailing commas * Start working on disabled warnings * Fix and silence a few dotnet-format warnings again * Run dotnet format after rebase * Use using declaration instead of block syntax * Address IDE0251 warnings * Address a few disabled IDE0060 warnings * Silence IDE0060 in .editorconfig * Revert "Simplify properties and array initialization, Use const when possible, Remove trailing commas" This reverts commit 9462e4136c0a2100dc28b20cf9542e06790aa67e. * dotnet format whitespace after rebase * First dotnet format pass * Fix naming rule violations * Fix typo * Add trailing commas, use targeted new and use array initializer * Fix build issues * Fix remaining build issues * Remove SuppressMessage for CA1069 where possible * Address dotnet format issues * Address formatting issues Co-authored-by: Ac_K <acoustik666@gmail.com> * Add GetHashCode implementation for RenderingSurfaceInfo * Explicitly silence CA1822 for every affected method in Syscall * Address formatting issues in Demangler.cs * Address review feedback Co-authored-by: Ac_K <acoustik666@gmail.com> * Revert marking service methods as static * Next dotnet format pass * Address review feedback --------- Co-authored-by: Ac_K <acoustik666@gmail.com>
167 lines
5.1 KiB
C#
167 lines
5.1 KiB
C#
using Ryujinx.Common;
|
|
using System.Timers;
|
|
|
|
namespace Ryujinx.HLE
|
|
{
|
|
public class PerformanceStatistics
|
|
{
|
|
private const int FrameTypeGame = 0;
|
|
private const int PercentTypeFifo = 0;
|
|
|
|
private readonly double[] _frameRate;
|
|
private readonly double[] _accumulatedFrameTime;
|
|
private readonly double[] _previousFrameTime;
|
|
|
|
private readonly double[] _averagePercent;
|
|
private readonly double[] _accumulatedActiveTime;
|
|
private readonly double[] _percentLastEndTime;
|
|
private readonly double[] _percentStartTime;
|
|
|
|
private readonly long[] _framesRendered;
|
|
private readonly double[] _percentTime;
|
|
|
|
private readonly object[] _frameLock;
|
|
private readonly object[] _percentLock;
|
|
|
|
private readonly double _ticksToSeconds;
|
|
|
|
private readonly Timer _resetTimer;
|
|
|
|
public PerformanceStatistics()
|
|
{
|
|
_frameRate = new double[1];
|
|
_accumulatedFrameTime = new double[1];
|
|
_previousFrameTime = new double[1];
|
|
|
|
_averagePercent = new double[1];
|
|
_accumulatedActiveTime = new double[1];
|
|
_percentLastEndTime = new double[1];
|
|
_percentStartTime = new double[1];
|
|
|
|
_framesRendered = new long[1];
|
|
_percentTime = new double[1];
|
|
|
|
_frameLock = new[] { new object() };
|
|
_percentLock = new[] { new object() };
|
|
|
|
_resetTimer = new Timer(750);
|
|
|
|
_resetTimer.Elapsed += ResetTimerElapsed;
|
|
_resetTimer.AutoReset = true;
|
|
|
|
_resetTimer.Start();
|
|
|
|
_ticksToSeconds = 1.0 / PerformanceCounter.TicksPerSecond;
|
|
}
|
|
|
|
private void ResetTimerElapsed(object sender, ElapsedEventArgs e)
|
|
{
|
|
CalculateFrameRate(FrameTypeGame);
|
|
CalculateAveragePercent(PercentTypeFifo);
|
|
}
|
|
|
|
private void CalculateFrameRate(int frameType)
|
|
{
|
|
double frameRate = 0;
|
|
|
|
lock (_frameLock[frameType])
|
|
{
|
|
if (_accumulatedFrameTime[frameType] > 0)
|
|
{
|
|
frameRate = _framesRendered[frameType] / _accumulatedFrameTime[frameType];
|
|
}
|
|
|
|
_frameRate[frameType] = frameRate;
|
|
_framesRendered[frameType] = 0;
|
|
_accumulatedFrameTime[frameType] = 0;
|
|
}
|
|
}
|
|
|
|
private void CalculateAveragePercent(int percentType)
|
|
{
|
|
// If start time is non-zero, a percent reading is still being measured.
|
|
// If there aren't any readings, the default should be 100% if still being measured, or 0% if not.
|
|
double percent = (_percentStartTime[percentType] == 0) ? 0 : 100;
|
|
|
|
lock (_percentLock[percentType])
|
|
{
|
|
if (_percentTime[percentType] > 0)
|
|
{
|
|
percent = (_accumulatedActiveTime[percentType] / _percentTime[percentType]) * 100;
|
|
}
|
|
|
|
_averagePercent[percentType] = percent;
|
|
_percentTime[percentType] = 0;
|
|
_accumulatedActiveTime[percentType] = 0;
|
|
}
|
|
}
|
|
|
|
public void RecordGameFrameTime()
|
|
{
|
|
RecordFrameTime(FrameTypeGame);
|
|
}
|
|
|
|
public void RecordFifoStart()
|
|
{
|
|
StartPercentTime(PercentTypeFifo);
|
|
}
|
|
|
|
public void RecordFifoEnd()
|
|
{
|
|
EndPercentTime(PercentTypeFifo);
|
|
}
|
|
|
|
private void StartPercentTime(int percentType)
|
|
{
|
|
double currentTime = PerformanceCounter.ElapsedTicks * _ticksToSeconds;
|
|
|
|
_percentStartTime[percentType] = currentTime;
|
|
}
|
|
|
|
private void EndPercentTime(int percentType)
|
|
{
|
|
double currentTime = PerformanceCounter.ElapsedTicks * _ticksToSeconds;
|
|
double elapsedTime = currentTime - _percentLastEndTime[percentType];
|
|
double elapsedActiveTime = currentTime - _percentStartTime[percentType];
|
|
|
|
lock (_percentLock[percentType])
|
|
{
|
|
_accumulatedActiveTime[percentType] += elapsedActiveTime;
|
|
_percentTime[percentType] += elapsedTime;
|
|
}
|
|
|
|
_percentLastEndTime[percentType] = currentTime;
|
|
_percentStartTime[percentType] = 0;
|
|
}
|
|
|
|
private void RecordFrameTime(int frameType)
|
|
{
|
|
double currentFrameTime = PerformanceCounter.ElapsedTicks * _ticksToSeconds;
|
|
double elapsedFrameTime = currentFrameTime - _previousFrameTime[frameType];
|
|
|
|
_previousFrameTime[frameType] = currentFrameTime;
|
|
|
|
lock (_frameLock[frameType])
|
|
{
|
|
_accumulatedFrameTime[frameType] += elapsedFrameTime;
|
|
|
|
_framesRendered[frameType]++;
|
|
}
|
|
}
|
|
|
|
public double GetGameFrameRate()
|
|
{
|
|
return _frameRate[FrameTypeGame];
|
|
}
|
|
|
|
public double GetFifoPercent()
|
|
{
|
|
return _averagePercent[PercentTypeFifo];
|
|
}
|
|
|
|
public double GetGameFrameTime()
|
|
{
|
|
return 1000 / _frameRate[FrameTypeGame];
|
|
}
|
|
}
|
|
}
|