Как я могу достичь более высоких fps, когда я выполняю анимацию в WinForms? (Как уменьшить «время цикла» в моем коде?) - PullRequest
0 голосов
/ 27 апреля 2019

Во-первых, я прошу прощения за плохое знание английского языка и неправильное использование грамматики.

Я строил проект в качестве школьной работы, в котором мы хотим, чтобы мы отображали анимацию на экране, поэтому я решил использовать WinForms в C # для достижения этой цели.

Однако, после того, как я наложил два или три изображения и нарисовал несколько линий, анимация стала отставать и получать низкие fps. Поэтому я добавляю две секундомера для записи «времени рисования» и «времени между каждым рисунком» и закомментирую детали, которые добавляют изображения и рисунок, и получаю 0 миллисекунд для рисования детали (это разумно, потому что я закомментирую деталь) и получаю около 15 миллисекунд между рисованием (я думаю, это не разумно, так долго зря!?)

Я надеюсь, что моя анимация работает со скоростью 60 кадров в секунду, что означает, что между каждым рисунком может пройти всего 16 ~ 17 миллисекунд. Однако я могу добавить лишь несколько вещей, если я хочу удовлетворить это требование.

Может кто-нибудь объяснить, что он делает в эти 15 миллисекунд, и могу ли я сократить это время? Или как я могу получить более высокий fps в моей анимации? И как другие люди могут показывать причудливую анимацию на высоких fps в C #?

Я собрал его в Visual Studio 2017 на своем ноутбуке. Тогда это часть моего кода, при необходимости я могу попытаться перенести полный проект сюда.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace Animation
{
    public partial class Form1 : Form
    {
        Stopwatch painttime = new Stopwatch();
        Stopwatch cycletime = new Stopwatch();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            cycletime.Stop();
            painttime.Start();

            //paint whatever you want

            painttime.Stop();
            textBox1.Text = painttime.ElapsedMilliseconds.ToString();
            textBox2.Text = cycletime.ElapsedMilliseconds.ToString();
            cycletime.Restart();
            painttime.Reset();
        }

        //ticks every 1 miliseconds
        private void timer1_Tick(object sender, EventArgs e)
        {
            this.Invalidate();
        }
    }
}

Когда я запускаю над кодом, на экране отображается, что «время рисования» равно 0 миллисекундам, а «время цикла» составляет около 15 миллисекунд, если я ничего не рисую.

...