Проблемы с открытием окна - Формы - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь создать простую 2-мерную игру с C# с использованием форм, но когда я запускаю ее со скоростью 60 кадров в секунду, она использует 50% моего процессора и вообще не использует мой графический процессор. Я искал несколько часов и не мог найти другого способа сделать это. Как заставить его работать на моем графическом процессоре?

Также я использую поток для ожидания между кадрами с Thread.Sleep(15). Я не знаю, хороший ли это способ сделать это.

Я следил за этим видео в окне https://www.youtube.com/watch?v=JnGM1p2vsbE

Это мой код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using System.Drawing;

namespace RadiantEngine
{
    class Canvas : Form
    {
        public Canvas()
        {
            this.DoubleBuffered = true;
        }
    }


    public abstract class RadiantWindow
    {
        public Vector2 ScreenSize;
        public string Title;
        private Canvas Window;
        private Thread GameLoopThread;

        public float num;

        Bitmap image = (Bitmap)Image.FromFile("F:/VS/RadiantEngine/RadiantEngine/dog.png");

        public RadiantWindow(Vector2 ScreenSize, string Title)
        {
            this.ScreenSize = ScreenSize;

            this.Title = Title;

            EngineInit();
        }

        public RadiantWindow(float x, float y, string Title)
        {
            Vector2 _ScreenSize = new Vector2();
            this.ScreenSize = _ScreenSize;

            this.Title = Title;

            EngineInit();
        }

        void EngineInit()
        {
            Window = new Canvas();

            Window.Text = Title;
            Window.Size = new Size((int)ScreenSize.x, (int)ScreenSize.y);
            Window.Paint += Renderer;


            GameLoopThread = new Thread(GameLoop);
            GameLoopThread.Start();

            Application.Run(Window);
        }


        private void Renderer(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.Clear(Color.Aqua);


            g.DrawImage(RadiantEngine.engine.renderer.FrameRender(), 0, 0);
        }


        void GameLoop()
        {
            OnLoad();
            while (GameLoopThread.IsAlive)
            {
                try
                {
                    OnDraw();

                    Window.BeginInvoke((MethodInvoker)delegate { Window.Refresh(); });
                }
                catch
                {
                    Console.WriteLine("Game Is Loading");
                }
                Thread.Sleep(15);
            }
        }

        public abstract void OnDraw();
        public abstract void OnLoad();
    }
}

Спасибо за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...