我正在尝试创建滑块运动图形。该代码对此进行了更好的解释。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace temp
{

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private System.Drawing.Graphics g;
        private System.Drawing.Pen pen1 = new System.Drawing.Pen(Color.Black, 1F);

        //timer for animation
        private void Form1_Load(object sender, EventArgs e)
        {
            Timer a = new Timer();
            a.Interval = 60;
            a.Tick += new EventHandler(a_Tick);
            a.Start();
        }

        void a_Tick(object sender, EventArgs e)
        {
            button1_Click(this, null);

        }

        //draws randomly generated point array.
        int cnt = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            rAr();
            g = pictureBox1.CreateGraphics();

            g.Clear(Color.Violet);
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.DrawCurve(pen1, points2);
            cnt++;
        }

        Random r = new Random();
        Point[] p = new Point[100];
        Point[] points2 = new Point[100];
        int c = 4;
        //fills new random point array
        private void rAr()
        {
            points2.CopyTo(p, 0);
            int cc = 1;
            for (int i = points2.Length - 1; i > 0; i--)
            {
                points2[i - 1] = new Point(100 - cc, p[i].Y);
                cc++;
            }
            points2[99] = new Point(100, r.Next(1, 50));
        }

    }
}


这段代码可以很好地解决问题,它占用了很多CPU且自动化程度不是很高。有没有其他方法可以以更少的cpu来实现相同的目标。
感谢重播

最佳答案

(过早)优化

除了已经发布的其他答案之外,您还尝试通过100点绘制样条曲线。

这可能是个坏主意,原因有两个:首先,在任何情况下将曲线拟合到100点并不是一件特别快的事情。其次,由于所有点都相隔1个像素,因此使用曲线可能没有视觉上的好处。

因此,您还可以执行其他几项操作来提高速度:


尝试使用折线而不是曲线,
如果需要使用曲线,则可能不需要在图形的100个像素上使用100个点-在该宽度上使用10个或20个位置可能会为您提供更好的结果,并且会大大减少.net必须要做。
您也许还可以删除一些位于直线/曲线上的中间点,以便绘制的直线更少。例如如果在(10,57)(11,57)(12,57)处有点,则可以放下中间点,然后从(10,57)到(12,57)画一条直线。


算法错误?

可是等等!在优化代码之前-它实际上是解决问题的正确方法吗?

听起来好像内容不是要“更改”,而只是横向滚动。在这种情况下,实际上只有在图像一侧引入的新像素才随着每一帧而“变化”,其余像素只是向侧面移动。在这种情况下,您可以滚动(移动)包含“旧”曲线图像的图形区域,然后仅绘制“滚动到视图”中的一两个像素。可以通过几种不同的方式来实现这种方式的滚动(例如,通过使用Windows窗体滚动命令,使图形变淡,或者如果整个窗口的内容正在滚动)

同样,如果数据没有变化,而只是简单地“滚动”,那么为每一帧重建阵列都不必要地昂贵。使用循环缓冲区,您可以简单地在数组的“末端”添加一个新点,并从开头删除一个点,而不必重新分配数组或完全复制所有中间点。

因此,这就是使用正确的工具完成工作的全部。

关于c# - 绘图图形性能问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1149892/

10-16 08:01