Мой метод OnUpdate игрового движка работает неправильноC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Мой метод OnUpdate игрового движка работает неправильно

Сообщение Anonymous »

Я работаю над простым игровым движком на C#, и мой метод OnUpdate работает не так, как ожидалось. Он должен обновлять каждый кадр, но вместо этого требуется около 6 секунд для обновления того, что должно занимать всего около 0,4 миллисекунды. Я не уверен, что вызывает эту задержку.

Что, по моему мнению, является причиной проблемы:
Кажется, проблема возникает в методе 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();
}
}
DemoGame.cs:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Странная ошибка при разработке игрового движка [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Указатели функций против полиморфизма в архитектуре ECS игрового движка
    Anonymous » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Указатели функций против полиморфизма в архитектуре ECS игрового движка
    Anonymous » » в форуме C++
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Как написать игру на C++ для Android/iOS без игрового движка? [закрыто]
    Anonymous » » в форуме Android
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Запуск задачи WorkManager из AppWidgetProvider приводит к бесконечным вызовам onUpdate.
    Anonymous » » в форуме Android
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»