В настоящее время я делаю 2D-игровой движок с использованием C#, GDI и устанавливаю простую рамку. Игра может отображать только 60 кадров в секунду.C# GDI Game Loop (счетчик FPS)
Насколько я знаю, в коде нет никаких проблем, но я бы просто хотел сделать более чистый способ рендеринга 60 кадров в секунду и не более того.
Вот мой код, любая помощь будет большим
public void Run()
{
window.Show();
window.Focus();
Initialize();
isRunning = true;
canRender = true;
timer = new Stopwatch();
timer.Start();
// the amount of milliseconds needed to pass before rendering next frame
double frameCapCounter = 16.666666;
while (isRunning)
{
Application.DoEvents();
if (window.Focused)
{
if (timer.ElapsedMilliseconds >= frameCapCounter)
{
canRender = true;
frames += 1; // update amount of frames
frameCapCounter += 16.666666; // increment counter
}
else
{
canRender = false;
}
// this is used to check if a second has passed, and if so
// we set the fps variable to the amount of frames rendered
// and reset all variables.
if (timer.ElapsedMilliseconds >= 1000)
{
fps = frames;
frames = 0;
frameCapCounter = 0;
timer.Restart();
}
Update();
LateUpdate();
if (canRender)
Render();
else
{
Thread.Sleep(1);
}
}
}
}
Ребята из SlimDX (https://slimdx.org/docs/html/Managed_Message_Loop.htm) использовали это вместо 'Application.DoEvents()': https://blogs.msdn.microsoft.com/tmiller/ 2005/05/05/мой-последний пост-на-рендер-петли, с надеждой / –