can change FrameLimiterSettings at runtime
parent
7d3bf4843a
commit
1a07a71745
|
@ -0,0 +1,14 @@
|
|||
namespace MoonWorks
|
||||
{
|
||||
public enum FrameLimiterMode
|
||||
{
|
||||
Uncapped,
|
||||
Capped
|
||||
}
|
||||
|
||||
public struct FrameLimiterSettings
|
||||
{
|
||||
public FrameLimiterMode Mode;
|
||||
public int Cap;
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
namespace MoonWorks
|
||||
{
|
||||
public enum FramerateMode
|
||||
{
|
||||
Uncapped,
|
||||
Capped
|
||||
}
|
||||
|
||||
public struct FramerateSettings
|
||||
{
|
||||
public FramerateMode Mode;
|
||||
public int Cap;
|
||||
}
|
||||
}
|
54
src/Game.cs
54
src/Game.cs
|
@ -29,23 +29,16 @@ namespace MoonWorks
|
|||
private bool FramerateCapped = false;
|
||||
private TimeSpan FramerateCapTimeSpan = TimeSpan.Zero;
|
||||
|
||||
public Window Window { get; }
|
||||
public GraphicsDevice GraphicsDevice { get; }
|
||||
public AudioDevice AudioDevice { get; }
|
||||
public Inputs Inputs { get; }
|
||||
|
||||
private Dictionary<PresentMode, RefreshCS.Refresh.PresentMode> moonWorksToRefreshPresentMode = new Dictionary<PresentMode, RefreshCS.Refresh.PresentMode>
|
||||
{
|
||||
{ PresentMode.Immediate, RefreshCS.Refresh.PresentMode.Immediate },
|
||||
{ PresentMode.Mailbox, RefreshCS.Refresh.PresentMode.Mailbox },
|
||||
{ PresentMode.FIFO, RefreshCS.Refresh.PresentMode.FIFO },
|
||||
{ PresentMode.FIFORelaxed, RefreshCS.Refresh.PresentMode.FIFORelaxed }
|
||||
};
|
||||
public Window MainWindow { get; }
|
||||
|
||||
public Game(
|
||||
WindowCreateInfo windowCreateInfo,
|
||||
PresentMode presentMode,
|
||||
FramerateSettings framerateSettings,
|
||||
FrameLimiterSettings frameLimiterSettings,
|
||||
int targetTimestep = 60,
|
||||
bool debugMode = false
|
||||
)
|
||||
|
@ -53,12 +46,7 @@ namespace MoonWorks
|
|||
Timestep = TimeSpan.FromTicks(TimeSpan.TicksPerSecond / targetTimestep);
|
||||
gameTimer = Stopwatch.StartNew();
|
||||
|
||||
FramerateCapped = framerateSettings.Mode == FramerateMode.Capped;
|
||||
|
||||
if (FramerateCapped)
|
||||
{
|
||||
FramerateCapTimeSpan = TimeSpan.FromTicks(TimeSpan.TicksPerSecond / framerateSettings.Cap);
|
||||
}
|
||||
SetFrameLimiter(frameLimiterSettings);
|
||||
|
||||
for (int i = 0; i < previousSleepTimes.Length; i += 1)
|
||||
{
|
||||
|
@ -75,15 +63,18 @@ namespace MoonWorks
|
|||
|
||||
Inputs = new Inputs();
|
||||
|
||||
Window = new Window(windowCreateInfo);
|
||||
|
||||
GraphicsDevice = new GraphicsDevice(
|
||||
Window.Handle,
|
||||
Backend.Vulkan,
|
||||
moonWorksToRefreshPresentMode[presentMode],
|
||||
debugMode
|
||||
);
|
||||
|
||||
MainWindow = new Window(windowCreateInfo, GraphicsDevice.WindowFlags);
|
||||
|
||||
if (!GraphicsDevice.ClaimWindow(MainWindow, presentMode))
|
||||
{
|
||||
throw new System.SystemException("Could not claim window!");
|
||||
}
|
||||
|
||||
AudioDevice = new AudioDevice();
|
||||
}
|
||||
|
||||
|
@ -97,12 +88,26 @@ namespace MoonWorks
|
|||
Destroy();
|
||||
|
||||
AudioDevice.Dispose();
|
||||
MainWindow.Dispose();
|
||||
GraphicsDevice.Dispose();
|
||||
Window.Dispose();
|
||||
|
||||
SDL.SDL_Quit();
|
||||
}
|
||||
|
||||
public void SetFrameLimiter(FrameLimiterSettings settings)
|
||||
{
|
||||
FramerateCapped = settings.Mode == FrameLimiterMode.Capped;
|
||||
|
||||
if (FramerateCapped)
|
||||
{
|
||||
FramerateCapTimeSpan = TimeSpan.FromTicks(TimeSpan.TicksPerSecond / settings.Cap);
|
||||
}
|
||||
else
|
||||
{
|
||||
FramerateCapTimeSpan = TimeSpan.Zero;
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract void Update(TimeSpan delta);
|
||||
protected abstract void Draw(double alpha);
|
||||
protected virtual void Destroy() {}
|
||||
|
@ -225,7 +230,14 @@ namespace MoonWorks
|
|||
{
|
||||
if (evt.window.windowEvent == SDL.SDL_WindowEventID.SDL_WINDOWEVENT_SIZE_CHANGED)
|
||||
{
|
||||
Window.SizeChanged((uint) evt.window.data1, (uint) evt.window.data2);
|
||||
var window = Window.Lookup(evt.window.windowID);
|
||||
window.SizeChanged((uint) evt.window.data1, (uint) evt.window.data2);
|
||||
}
|
||||
else if (evt.window.windowEvent == SDL.SDL_WindowEventID.SDL_WINDOWEVENT_CLOSE)
|
||||
{
|
||||
var window = Window.Lookup(evt.window.windowID);
|
||||
GraphicsDevice.UnclaimWindow(window);
|
||||
window.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue