c# - 绘图图形性能问题

标签 c# .net performance graphics

我正在尝试创建 slider 运动图形。代码更好地解释了这一点。

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) 画一条直线。

  • 错误的算法?

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

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

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

    因此,一切都是为了使用正确的工具来完成这项工作。

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

    相关文章:

    .net - 为什么.net 的许多语言端口都以 'Iron' 为前缀?

    MySQL慢查询日志——慢到什么程度才算慢?

    c# - ASP.NET Core MetaDataType 属性不起作用

    c# - 第一个完成后播放第二个SoundEffect

    c# - 在多个线程上运行 COM 组件控件

    c# - ExecuteReader() 使程序退出类

    c# - 创建相册查看器

    .net - 在 SQL Server 中执行 MDX 查询需要 2 秒,但通过 ADOMD 执行并检索数据需要 5 分钟

    performance - 在 Bash 中高效计算数十万次浮点运算

    c# - list.count 是在物理上遍历列表来计算它,还是保留一个指针