C# Graphics解决闪烁问题的方法

自从米格的仁兄向我推荐C#之后,偶就误入歧途的渐渐脱离了Java阵营。最近在写工具的时候,忽然发现了一个老生常谈的闪烁问题,要知道这样的问题在Java Swing里只要把DoubleBuffer设置为true基本上是不会发生的,但在C#上却怎么也搞不定,竟然连双缓冲都有问题,GDI+不会这么脆弱吧。

偶再一次被微软的花头给戏弄了,无奈只好踏上了漫漫搜索之路,也不知道搜了多少帖子,找了多少资料,基本上都是无功而返,更可气的是网上有些资料还骗人,偶试了试基本上都不行的,该闪的照样闪的欢。有些方法像脏矩阵一样要Invalide部分更新区域,偶嫌他麻烦,幸好偶找到了一篇文章,讲闪烁原理的,虽然偶过去自认为了解闪烁原理,比如什么刷新周期,显存之类的,不过偶还是耐着性子看了一遍,收获颇丰,看来孔夫子的温故而知新颇有道理!

于是偶按照原理自己改起了代码,没想到还真让我给解决了。C#控件之所以会闪烁,是因为Refresh会把整个控件给清成背景色,然后再把图像绘制上去,就算先把所有待画的图像绘制到缓冲上,然后再Render到控件上,因为清屏时的颜色,相当于中间插了一空白帧,当刷新过快时也是会有闪烁的。

偶的做法是:

1.每帧控件创建一个Graphics,记得一定是CreateGraphics而不是通过Paint函数的那个参数e获得。

2.把待绘制的图像绘制到缓冲上,缓冲大小为控件大小。

3.刷新的时候调用Invalidate(new Rectangle(0, 0, 1, 1));

4.在Paint函数绘制缓冲,搞定!

哈哈,相信大家看了都会了解,Invalidate(new Rectangle(0, 0, 1, 1));相当于调用Paint函数,但却不重绘控件,这样中间那个空白帧就没有了,闪烁当然就消失啦!

原理很重要啊很重要!

时间: 2024-09-15 09:45:29

C# Graphics解决闪烁问题的方法的相关文章

解决Android SurfaceView绘制触摸轨迹闪烁问题的方法_Android

本文分享了解决SurfaceView触摸轨迹闪烁问题的方法,供大家参考,具体内容如下 第一种解决SurfaceView触摸轨迹闪烁问题的方法: 由于SurfaceView使用双缓存机制,两张画布轮流显示到屏幕上.那么,要存储触摸轨迹并避免两张画布内容不一致造成的闪烁问题,完全可以利用保存绘制过程并不断重新绘制的方法解决闪烁,而且这样还顺带解决了多次试验中偶尔出现的因为moveTo()函数不能读取到参数执行默认设置(参数设为上次的触摸点)而出现的断线连接闪烁问题,详细代码如下: package c

AngularJS使用ng-Cloak阻止初始化闪烁问题的方法_AngularJS

本文实例讲述了AngularJS使用ng-Cloak阻止初始化闪烁问题的方法.分享给大家供大家参考,具体如下: 在做angular的SPA开发时,我们经常会遇见在如Chrome这类能够快速解析的浏览器上出现表达式({% raw %} {{ express }} {% endraw %} ),或者是模块(div)的闪烁.对于这个问题由于JavaScript去操作DOM,都会等待DOM加载完成(DOM ready).对于angular会在DOM ready完会才回去解析html view Templ

android实现字体闪烁动画的方法

  本文实例讲述了android实现字体闪烁动画的方法.分享给大家供大家参考.具体如下: 这里基于线程和Timer实现Android的字体闪烁动画效果. ? public class ActivityMain extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); spark();

WPS演示中的文字连续闪烁的设置方法

  WPS演示中的文字连续闪烁的设置方法 1.选中要闪烁的文字,右击,选中自定义动画. 2.在添加效果中选择强调--其他效果. 3.在添加强调效果菜单中,选择闪动,点击确定. 4.在设置栏中选择计时一项. 5.在计时栏里把重复项改为直到下一次点击,确定后完成.你会发现文字开始连续闪烁了.

IE.JS解决IE兼容性问题方法汇总

官网 http://dean.edwards.name/weblog/2008/01/ie7-2/ 一 参考资料 1 解决IE5.IE6.IE7与W3C标准的冲突,使用(IE7.js IE8.js)兼容 http://apps.hi.baidu.com/share/detail/15407414 2 IE7.JS解决IE兼容性问题方法 http://www.chonggou.net/show/2824.html 3 消除IE浏览器系列的相关BUG(IE7-JS) http://www.fly13

jQuery实现不断闪烁文字的方法

  这篇文章主要介绍了jQuery实现不断闪烁文字的方法,涉及jQuery中fadeOut.fadeIn方法及递归调用的技巧,需要的朋友可以参考下 本文实例讲述了jQuery实现不断闪烁文字的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 <script type="text/javascript" > function blink(selector){ $(selector).fadeOut('slow', fun

win8.1系统进入安全模式解决故障问题的方法

  win8.1系统进入安全模式解决故障问题的方法.微软发布win8.1系统已经有好几年了,如果遇到故障问题直接进入安全模式解决即可.通常win7系统进入系统安全模式都是在电脑开机的时候,按F8键即可进入.但是升级到win8.1系统后怎么进入安全模式呢?其实win8.1系统进入安全模式的方法有很多种,接下去本教程给大家介绍win8.1系统进入安全模式解决故障问题的方法. 1.在电脑中按下[win]+[R]快捷键打开"运行"窗体,您也可以通过其他方式打开"运行"窗体,

servlet- 出现下面错误怎么解决啊 ,求方法,请大神们帮我看看!

问题描述 出现下面错误怎么解决啊 ,求方法,请大神们帮我看看! if(agent.contains("MSIE")){ 这句报错, 错误提示The method contains(CharSequence) from the type String refers to the missing type CharSequence package cn.itcast.response; import java.io.FileInputStream; import java.io.IOExc

jQuery实现不断闪烁文字的方法_jquery

本文实例讲述了jQuery实现不断闪烁文字的方法.分享给大家供大家参考.具体实现方法如下: <script type="text/javascript" > function blink(selector){ $(selector).fadeOut('slow', function(){ $(this).fadeIn('slow', function(){ blink(this); }); }); } $(document).ready(function(){ blink(