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 bool FramerateCapped = false;
|
||||||
private TimeSpan FramerateCapTimeSpan = TimeSpan.Zero;
|
private TimeSpan FramerateCapTimeSpan = TimeSpan.Zero;
|
||||||
|
|
||||||
public Window Window { get; }
|
|
||||||
public GraphicsDevice GraphicsDevice { get; }
|
public GraphicsDevice GraphicsDevice { get; }
|
||||||
public AudioDevice AudioDevice { get; }
|
public AudioDevice AudioDevice { get; }
|
||||||
public Inputs Inputs { get; }
|
public Inputs Inputs { get; }
|
||||||
|
|
||||||
private Dictionary<PresentMode, RefreshCS.Refresh.PresentMode> moonWorksToRefreshPresentMode = new Dictionary<PresentMode, RefreshCS.Refresh.PresentMode>
|
public Window MainWindow { get; }
|
||||||
{
|
|
||||||
{ 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 Game(
|
public Game(
|
||||||
WindowCreateInfo windowCreateInfo,
|
WindowCreateInfo windowCreateInfo,
|
||||||
PresentMode presentMode,
|
PresentMode presentMode,
|
||||||
FramerateSettings framerateSettings,
|
FrameLimiterSettings frameLimiterSettings,
|
||||||
int targetTimestep = 60,
|
int targetTimestep = 60,
|
||||||
bool debugMode = false
|
bool debugMode = false
|
||||||
)
|
)
|
||||||
|
@ -53,12 +46,7 @@ namespace MoonWorks
|
||||||
Timestep = TimeSpan.FromTicks(TimeSpan.TicksPerSecond / targetTimestep);
|
Timestep = TimeSpan.FromTicks(TimeSpan.TicksPerSecond / targetTimestep);
|
||||||
gameTimer = Stopwatch.StartNew();
|
gameTimer = Stopwatch.StartNew();
|
||||||
|
|
||||||
FramerateCapped = framerateSettings.Mode == FramerateMode.Capped;
|
SetFrameLimiter(frameLimiterSettings);
|
||||||
|
|
||||||
if (FramerateCapped)
|
|
||||||
{
|
|
||||||
FramerateCapTimeSpan = TimeSpan.FromTicks(TimeSpan.TicksPerSecond / framerateSettings.Cap);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < previousSleepTimes.Length; i += 1)
|
for (int i = 0; i < previousSleepTimes.Length; i += 1)
|
||||||
{
|
{
|
||||||
|
@ -75,15 +63,18 @@ namespace MoonWorks
|
||||||
|
|
||||||
Inputs = new Inputs();
|
Inputs = new Inputs();
|
||||||
|
|
||||||
Window = new Window(windowCreateInfo);
|
|
||||||
|
|
||||||
GraphicsDevice = new GraphicsDevice(
|
GraphicsDevice = new GraphicsDevice(
|
||||||
Window.Handle,
|
|
||||||
Backend.Vulkan,
|
Backend.Vulkan,
|
||||||
moonWorksToRefreshPresentMode[presentMode],
|
|
||||||
debugMode
|
debugMode
|
||||||
);
|
);
|
||||||
|
|
||||||
|
MainWindow = new Window(windowCreateInfo, GraphicsDevice.WindowFlags);
|
||||||
|
|
||||||
|
if (!GraphicsDevice.ClaimWindow(MainWindow, presentMode))
|
||||||
|
{
|
||||||
|
throw new System.SystemException("Could not claim window!");
|
||||||
|
}
|
||||||
|
|
||||||
AudioDevice = new AudioDevice();
|
AudioDevice = new AudioDevice();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -97,12 +88,26 @@ namespace MoonWorks
|
||||||
Destroy();
|
Destroy();
|
||||||
|
|
||||||
AudioDevice.Dispose();
|
AudioDevice.Dispose();
|
||||||
|
MainWindow.Dispose();
|
||||||
GraphicsDevice.Dispose();
|
GraphicsDevice.Dispose();
|
||||||
Window.Dispose();
|
|
||||||
|
|
||||||
SDL.SDL_Quit();
|
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 Update(TimeSpan delta);
|
||||||
protected abstract void Draw(double alpha);
|
protected abstract void Draw(double alpha);
|
||||||
protected virtual void Destroy() {}
|
protected virtual void Destroy() {}
|
||||||
|
@ -225,7 +230,14 @@ namespace MoonWorks
|
||||||
{
|
{
|
||||||
if (evt.window.windowEvent == SDL.SDL_WindowEventID.SDL_WINDOWEVENT_SIZE_CHANGED)
|
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