Что, по моему мнению, является причиной проблемы:
Кажется, проблема возникает в методе GameLoop, где метод OnUpdate работает не так быстро, как ожидалось. Несмотря на то, что я включил Thread.Sleep(1), чтобы предотвратить высокую загрузку процессора, обновления происходят значительно медленнее, чем должны быть. В моем классе DemoGame метод OnUpdate увеличивает таймер и уничтожает объект игрока через определенное время, но этот процесс занимает гораздо больше времени, чем следовало бы.
Что я пробовал и чего ожидал:
Я пытался упростить метод OnUpdate, чтобы он только увеличивал счетчик и проверял условие для уничтожения объект игрока. Я ожидал, что это займет всего несколько миллисекунд, что позволит игре плавно обновляться в каждом кадре. Однако я наблюдаю гораздо более длительное время обновления, что влияет на общую производительность моего игрового движка.
Код:
GameEngine.cs:
Код: Выделить всё
using System;
using System.Collections.Generic;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;
namespace GameEngine.GameEngine
{
class Canvas : Form
{
public Canvas()
{
this.DoubleBuffered = true;
}
}
public abstract class GameEngine
{
private Vector2 screenSize = new Vector2(512, 512);
private string title = "New Game";
private Canvas window = null;
private Thread gameLoopThread = null;
private static List allShapes = new List();
public Color backgroundColor;
public GameEngine(Vector2 screenSize, string title)
{
Log.Info("Game is starting...");
this.screenSize = screenSize;
this.title = title;
window = new Canvas();
window.Size = new Size((int)this.screenSize.x, (int)this.screenSize.y);
window.Text = this.title;
window.Paint += Renderer;
gameLoopThread = new Thread(GameLoop);
gameLoopThread.Start();
Application.Run(window);
}
public static void RegisterShape(Shape2D shape)
{
allShapes.Add(shape);
}
public static void UnRegisterShape(Shape2D shape)
{
allShapes.Remove(shape);
}
void GameLoop()
{
OnLoad();
while (gameLoopThread.IsAlive)
{
try
{
OnDraw();
window.BeginInvoke((MethodInvoker)delegate { window.Refresh(); });
OnUpdate();
Thread.Sleep(1); // Sleep for 1ms to prevent high CPU usage
}
catch
{
Log.Eror("Game is not found...");
}
}
}
private void Renderer(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.Clear(backgroundColor);
foreach (Shape2D shape in allShapes)
{
g.FillRectangle(new SolidBrush(Color.Red), shape.postion.x, shape.postion.y, shape.scale.x, shape.scale.y);
}
}
public abstract void OnLoad();
public abstract void OnUpdate();
public abstract void OnDraw();
}
}
Код: Выделить всё
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GameEngine.GameEngine;
namespace GameEngine.GameEngine
{
class DemoGame : GameEngine
{
Shape2D player;
public DemoGame() : base(new Vector2(615, 615), "Game") {}
public override void OnDraw()
{
}
public override void OnLoad()
{
backgroundColor = Color.Black;
player = new Shape2D(new Vector2(10, 10), new Vector2(10, 10), "test");
}
int time = 0;
public override void OnUpdate()
{
if (time > 400)
{
player.DestroySelf();
}
time++;
}
}
}
Что может быть причиной низкой производительности моего метода OnUpdate? Как я могу это исправить, чтобы каждый кадр выполнялся без такой большой задержки?
Подробнее здесь: https://stackoverflow.com/questions/791 ... -correctly