c# - 使用 C# 双缓冲有负面影响

标签 c# winforms graphics doublebuffered

我写了下面这个简单的程序,它每 100 毫秒在屏幕上画一条线(由 timer1 触发)。我注意到绘图有点闪烁(也就是说,窗口并不总是完全是蓝色的,而是透出一些灰色)。所以我的想法是使用双缓冲。但当我这样做时,事情变得更糟了。现在屏幕几乎总是灰色的,只是偶尔会出现蓝色(由 timer2 演示,每 2000 毫秒切换一次 DoubleBuffered 属性)。

对此有何解释?

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Paint(object sender, PaintEventArgs e) {
            Graphics g = CreateGraphics();
            Pen pen = new Pen(Color.Blue, 1.0f);
            Random rnd = new Random();
            for (int i = 0; i < Height; i++)
                g.DrawLine(pen, 0, i, Width, i);
        }

        // every 100 ms
        private void timer1_Tick(object sender, EventArgs e) {
            Invalidate();
        }

        // every 2000 ms
        private void timer2_Tick(object sender, EventArgs e) {
            DoubleBuffered = !DoubleBuffered;
            this.Text = DoubleBuffered ? "yes" : "no";
        }
    }
}

最佳答案

我会把你所有的项目都画到你自己的缓冲区,然后一次把它全部复制进去。我已经在许多应用程序中将它用于图形,它对我来说一直很有效:

    public Form1()
    {
        InitializeComponent();
    }
    private void timer1_Tick(object sender, EventArgs e)
    {
        Invalidate();// every 100 ms
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        DoubleBuffered = true;
    }
    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Bitmap buffer = new Bitmap(Width, Height);
        Graphics g = Graphics.FromImage(buffer);
        Pen pen = new Pen(Color.Blue, 1.0f);
        //Random rnd = new Random();
        for (int i = 0; i < Height; i++)
            g.DrawLine(pen, 0, i, Width, i);
        BackgroundImage = buffer;
    }

编辑:经过进一步调查,您的问题似乎是您将 Graphics 对象设置为:

Graphics g = CreateGraphics();

需要:

Graphics g = e.Graphics();

所以你的问题可以通过像我上面那样创建一个手动缓冲区来解决,或者简单地改变你的 Graphics 对象。我对两者都进行了测试,它们都有效。

关于c# - 使用 C# 双缓冲有负面影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2566126/

相关文章:

c# - 在不退出整个应用程序的情况下关闭 Windows 窗体

c# - 用于制作游戏引擎的C#或C++(深入)

c# - 将扩展方法限制为仅针对 EF 实体

c# - 处理 null 返回的静态方法

c# - 计算日期范围时抛出 System.OutOfMemoryException

c# - 如何自动将 IEnumerable<T> 转换为 csv 文件?

c# - 如何获取任务管理器的网络选项卡中显示的网络利用率、链接速度和适配器状态的信息?

c# - 从 xml 加载信息,使用 c# 保存相关(更改)信息

c# - 是否可以在图表元素上绘制一个矩形?

java - 如何在 Java Swing 中在屏幕上和屏幕外切换形状?