搜档网
当前位置:搜档网 › 利用双缓存技术解决GDI画图的刷新问题

利用双缓存技术解决GDI画图的刷新问题

利用双缓存技术解决GDI画图的刷新问题
利用双缓存技术解决GDI画图的刷新问题

利用双缓存技术提高GDI+的绘图效果

摘要

在进行图像处理的软件中,一般的图形处理程序需要大量的绘图操作,首要解决的就是绘图的效率和效果问题:前者表现在性能方面,是否有延迟,一个小小的交互操作是否要等上几秒才能看到结果;后者表现在重新绘制或刷新的过程中出现闪烁?本文主要介绍GDI+程序中引用双缓冲技术以解决重绘时出现的闪烁问题—提高绘图效果。

关键字:GDI+;双缓存;快速;缓存位图;效果

引言

在使用GDI+的实际的绘图中,绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示。这样的效率非常低,不仅达不到性能要求,而且还可能会出现闪烁的现象。刷新过程中会导致所有图元重新绘制,而各个图元的重绘操作并不会导致Paint事件发生,因此窗口的每一次刷新只会调用Paint

事件一次。窗口刷新一次的过程中,每一个图元的重绘都会立即显示到窗口,因此整个窗口中,只要是图元所在的位置,都在刷新,而刷新的时间是有差别的,闪烁现象自然会出现。所以说,此时导致窗口闪烁现象的关键因素并不在于Paint事件调用的次数多少,而在于各个图元的重绘。

根据以上分析可知,当图元数目不多时,窗口刷新的位置也不多,窗口闪烁效果并不严重;当图元数目较多时,绘图窗口进行重绘的图元数量增加,绘图窗口每一次刷新都会导致较多的图元重新绘制,窗口的较多位置都在刷新,闪烁现象自然就会越来越严重。特别是图元比较大绘制时间比较长时,闪烁问题会更加严重,因为时间延迟会更长。

1、双缓存技术

为了解决画图的效率问题,我们引进了双缓存技术,双缓冲技术早在GDI的程序开发中,就已经开始使用。在普通的绘图模式下,图像处理程序是按照设计的顺序,将被绘制的元素一个接一个地在目标设备上进行绘制。何谓“双缓冲”?它的基本原理就是:先在内存中开辟一块虚拟画布,然后将所有需要画的图形先画在这块“虚拟画布”上,最后在一次性将整块画布画到真正的窗体上。因为所有的单个图形的绘制都不是真正的调用显示系统“画”,所以不会占用显示系统的开销,极大的提高的绘图效率。其原理如图1所示。[1][3]

图1:双缓存绘制原理示意

2、引进双缓存技术解决实际中的问题

采用双缓冲技术,由于绘图操作大部份都在内存中完成,所以绘图速度没有太大的制约。在. NET 中,由于GDI+的引入,实现双缓冲更加简单:首先建立缓冲区,从缓冲区取得Graphics 对象,使用其进行绘图;然后将缓冲区内已绘制好的图像拷贝到目标设备上显示。

[3]

详细说明一下双缓存的具体实现步骤:

1、 在内存中建立一块“虚拟画布”:

Bitmap bmp = new Bitmap(600, 600);

2、 获取这块内存画布的Graphics 引用:

Graphics g = Graphics.FromImage(bmp);

3、 在这块内存画布上绘图:

4、 将内存画布画到窗口中:

5、最后双缓存的实现:

3、结论

以上方法可以用来去除GDI画图时的闪烁问题,双缓存技术的引用提高了图像程序显示的性能,当然在缓冲区还可以实现很多高级的图形操作,比如透明,合成等等,这取决于具体的算法。

因此用好缓存不仅可以极大地提高程序的交互速度,而且会让应用软件有一个流畅的图形显示。当进行复杂的绘图操作时,使用双缓冲技术,可以有效地防止画面的闪烁。

参考文献:

[1] 姜晓峰,李云飞.计算机图形图像技术与应用教程.北京:北京希望电子出版社,2002.

[2] MaheshChand.GDI+图形程序设计M .北京:电子工业工业出版社, 2005.

[3] 韩丽娜,石昊苏.使用双缓存来解决GDI下的闪烁问题[J].计算机工程与设计,2006.

各类型网站-缓存解决方案

门户类随着互联网不断普及和飞速成长,门户网站已经成为网民获取信息的重要通道。每天大量网民点击访问,网站速度和网络稳定等方面面临着严峻挑战: 1、网站运维技术复杂 2、网站影响力大,对网络灾备要求高 3、网络服务众多,传输机制复杂 4、用户众多,分布广泛,网络情况复杂,响应速度要求高 5、易遭受攻击,网站安全性和稳定性要求高 某门户网站高标准规划、高起点建设,以新闻、信息、下载内容为主,文字、图片与视频、音频结合,目前拥有30 多个频道和子网站。随着自身的不断成长,网站也面临了性能和可用性方面的问题和挑战: 一旦IDC 内的服务器停止工作或ISP 服务中断,如何保证网站始终在线?必须通过更快的响应速度来满足客户的需求,如何为客户提供最及时的响应?应用服务器由于服务器硬件的稳定性、流量压力超载、网络攻击等情况,经常会意外宕机,如何保证网络应用的7 ×24 小时持续性服务? 为解决以上问题,该门户网站使用了PowerCDN服务,确保了关键任务应用的快速、安全和容错性运行。无论该网站的客户所处全球位置如何,PowerCDN的Smart DNS都可将他们引导到具有最佳性能的可用PowerCDN节点,页面响应速度明显提升;同时源站隐藏在CDN节点后,大大减少来自互联网上的直接安全威胁;遇到热点事件的突发流量也不必为此单独购置专门的设备。 sns社区类随着越来越多的个人用户参与到互联网内容的管理、维护、存储、上传、分发等价值链条中,互联网逐渐转变成一个分散存储、读与写并存的多中心交互式平台,社会网络(sns)作为Web2.0的典型应用之一更是遍地开花。由于内容的生产者和组织者越来越多和越来越分散,内容的多节点上传几乎与自上而下的下发变得一样普遍,于是本已拥塞不堪的网络带宽更显拥挤,在现有带宽条件下,如何提高网站接入速度和响应速度,进而改善用户体验,真正做到以用户为中心?这是所有sns社区类网站都必须面对并给出满意解答的一道课题。 1、网站交互性超强 2、文件种类和数量多而且复杂 3、安全保密性要求高

网页视频下载方式大全

网页音视频下载方式大全(编辑完成) 优酷、奇艺、搜狐等网站上有不少好看的、有用的、喜欢的视频,但下载却提示要安装客户端,而绝大多数人都不会只呆在一家视频网站上,要都安装客户端,未免太过麻烦,而且很多时候也基本用不到。那么有没有办法直接下载网页视频?答案是肯定的。 目前,我们可以通过插件、软件、网站和浏览器来下载网页视频。这些东西使用的方式主要有两类:一是从浏览器缓存中提取视频缓存;二是通过分析网页元素等方式查找网页视频的下载地址。下面我就将通过插件下载、软件下载、浏览器下载来介绍网页音视频的下载方式。 一、通过插件来下载网页中的音视频 1、火狐插件 说到通过插件下载网页中的音视频,最有名的果断是火狐上的NetVideoHunter Video Downloader。这款插件目前只开发了火狐版,该插件支持火狐3.0以后的 所有版本。它能从火狐的缓存中提取视频,能够从几乎任何网站上提取视频、音频的下载链接并下载,能在独立窗口中播放音视频,并且,即使是优酷之类的将长视频分段保存的网站,它也能嗅探到所有的视频片段,不会像某些工具只能嗅探到部分。 当页面有音视频时,火狐右下角NetVideoHunter的图标上就会显示网页中包含的音视频数量,点击弹出下载和独立播放窗口。下图为截图:

此外火狐上还有FlashGot、Easy YouTube Video Downloader等优秀插件也能 嗅探到网页中的音视频。 2、chrome及基于chromium开发的浏览器上的插件 作为浏览器市场上的有力竞争者,chrome上也有视频提取的插件:FVD Video Download,它同样能够嗅探到几乎所有网站上的音视频,包括优酷等分段存储 加载的音视频,并调用浏览器自带下载来下载音视频(调用迅雷旋风等需要浏览器或其他插件支持)。 当嗅探到页面上有音视频时,FVD Video Download在插件栏上的图标会变为蓝色的箭头(不然为带红×的灰色箭头),点击即可下载。下图是截图:

GDI双缓冲实现与GDI+双缓冲实现

GDI双缓冲实现与GDI+双缓冲实现 分类:C++ 2013-03-21 13:32 57人阅读评论(0) 收藏举报 我们看电视时,看到的屏幕称为OSD层,也就是说,只有在OSD层上显示图像我们才能看到。现在,我需要创建一个虚拟的、看不见但是可以在上面画图(比如说画点、线)的OSD层,我称之为offscreen(后台缓冲区)。这个offscreen存在于内存中,我们在上面画图,这个offscreen上面的东西可以显示在OSD层上,需要一个创建这个offscreen的函数,返回这个offscreen的句柄(整型指针)、宽度、高度、指向新建offscreen数据缓冲区的指针,该缓冲区是一个在函数外创建的offscreen的数据缓冲区,大小是offscreen的高度*宽度*每个像素点数据的大小。闪烁是图形编程的一个常见问题。需要多重复杂绘制操作的图形操作会导致呈现的图像闪烁或具有其他不可接受的外观。双缓冲的使用解决这些问题。双缓冲使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘图图面。所有绘制操作完成后,内存缓冲区直接复制到与其关联的绘图图面。因为在屏幕上只执行一个图形操作,所以消除了由复杂绘制操作造成的图像闪烁。 如何实现双缓冲 首先给出实现的程序,然后再解释,同样是在OnDraw(CDC *pDC)中: CDC MemDC; //首先定义一个显示设备对象 CBitmap MemBitmap;//定义一个位图对象 //随后建立与屏幕显示兼容的内存显示设备 MemDC.CreateCompatibleDC(NULL); //这时还不能绘图,因为没有地方画^_^ //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小,也可以自己定义(如:有滚动条时就要大于当前窗口的大小,在BitBlt时决定拷贝内存的哪部分到屏幕上) MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); //将位图选入到内存显示设备中 //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap); //先用背景色将位图清除干净,这里我用的是白色作为背景 //你也可以用自己应该用的颜色 MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(255,255,255)); //绘图 MemDC.MoveTo(……);

网站性能优化:页面静态化和二级缓存

网站性能优化:页面静态化和二级缓存 2009-08-29 23:41:20| 分类:java | 标签:无|字号大中小订阅 性能方案: 1.页面静态化。只适合那些不会经常发生变化的页面(不适合条件查询和分页)。 对于经常发生变化的内容,如何进行性能优化 2.缓存方案。 1.页面缓存(性能高与二级缓存) 2.业务层缓存(二级缓存,只缓存对象),hibernate二级缓存 页面缓存 1.页面缓存缓存的是servlet向页面输出的html代码,我们使用OsCahe作为页面缓存产品。OsCahe也可以用作二级缓存。 什么是OSCache OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能。OSCache是个一个广泛采用的高性能的J2EE 缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案。OSCache有以下特点:缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。拥有全面的API--OSCache API给你全面的程序来控制所有的OSCache特性。永久缓存--缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启。支持集群--集群缓存数据能被单个的进行参数配置,不需要修改代码。缓存记录的过期--你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)。 使用OsCahe如何实现页面全局和局部缓存。 只需要学习几个标签 采用map结构的对象缓存内容,这个缓存的key就是我们请求的路径。以后只要我们访问相同的路径,就可以在map中找到这个缓存的内容。但是如果我们在路径后面加上参数,map 中就找不到了。缓存就不会被使用了。 所以我们可以自己指定缓存的key的名称。 scope可以定义这个缓存的使用范围,session只对同一个会话进行缓存 time指定缓存时间,默认是1个小时。过时以后,旧缓存会丢失,重新建立新的缓存。 refresh:强行清除缓存。里面可以接收el表达式,true表示重新建立缓存。默认为false。 下面是一些示例 我们使用Oscache的标签来进行页面的局部缓存.使用方法如下: <%@taglib uri="https://www.sodocs.net/doc/a818832270.html,/oscache" prefix="cache"%>

CDC双缓冲防闪屏绘图总结

CDC双缓冲防闪屏绘图总结 CDC在屏幕绘图可以用以下方法: CDC dc; dc.CreateCompatibleDC(NULL); CBitmap m_bitmap; m_bitmap.LoadBitmap(IDB_BITMAP1); //载入资源文件 dc.SelectObject(&m_bitmap); CDC *pDC = GetDC(); pDC->BitBlt(0,0,200,100,&dc,0,0,SRCCOPY); m_bitmap.DeleteObject(); dc.DeleteDC(); 上面虽然可以在屏幕绘图,但是如里需要绘多张图,并且有重叠的部份,当鼠标改变窗口大小时,重叠部份有严重的闪烁。非常难看 CDC *pDC = GetDC(); pDC->BitBlt(0,0,200,100,&dc,0,0,SRCCOPY); 这个方式是直接在屏幕绘图,如果多张图,即多次调用此方法。 为了避免闪烁,可采用双缓冲的方法,不管你要绘多少张图,先把它们绘在一个内存DC,之后再在屏幕显示

DC小知识点: CDC dc; 这个是内存dc, 使用BitBlt只会在内存中,不会在屏幕显示 一旦dc=GetDC(); 此时dc就与屏幕有关了,BitBlt方法就会输出的屏幕 CDC双缓冲防闪屏绘图实例 下面的nWidth,nHeight 是屏幕的宽高 CDC *pDC=this->GetDC(); //此DC负责在屏幕显示 CDC dc,sub_dc; //dc 负责组建对话框整张大图,sub_dc负责里面小块 dc.CreateCompatibleDC(NULL); sub_dc.CreateCompatibleDC(&dc); //注意参数,&dc就指定了sub_dc是基于dc的。 CBitmap bg_bmp,load_bmp; // bg_bmp负责构造背景,load_bmp负责从资源文件载入位图 bg_bmp.CreateCompatibleBitmap(pDC,nWidth,nHeight); //先创建一张与对话框当前大小一致的位图 dc.SelectObject(&bg_bmp); dc.FillSolidRect(0,0,nWidth,nHeight,RGB(236,236,234)); //构造背景 bg_bmp.DeleteObject(); //构造第一张图

教你如何提取网页中的视频、音乐歌曲、

教你如何提取网页中的视频、音乐歌曲、flash、图片等多媒体文件(很实用) 打开网页后,发现里面有好看的视频、好听的音乐、好看的图片、很炫的flash,是不是想把它们弄到自己电脑上或手机、mp4上?但很多时候视频无法下载,音乐只能试听,或者好听的背景音乐根本就不知道什么名字,更别说怎么下了;至于图片直接右键另存为即可,不过如果网页突然关掉了,但又想把看过的图片弄下来,而忘了图片网页地址或者不想再通过历史记录打开,这时又该怎么办? 其实这些问题都能很好的解决,并且很简单,只要用一个软件 来替你从电脑的缓存中搜索一下就OK了,因为网页中显示的内容基本 上全部都在缓存中,如果自己手动搜索,那将是很累人滴,又不好找,东西太多,又没分类。 无意中发现一个小软件很强(对此感兴趣,本人玩过无数小软件),我一直在用,也是用它帮了很多网友的忙,为了让更多的网友解决问题,于是拿来和亲们分享一下。不废话了,下面进入主题: 这款免费小软件就是YuanBox(元宝箱)v1.6,百度一搜就能下载。 下面是我自己整理的使用步骤,供亲们参考(其实不用看就行,软件简单,不用学就会),我只是用的时间长了,很熟练罢了: 软件下好后,解压,打开里面的YuanBox.exe即可,不用安装;打开此软件前,先打开你要提取东西的网页(之后再关掉也行),这是为了保证电脑缓存中有你要的东西。 运行软件,初始界面如下图:

之后直接是flv格式视频搜索结果的界面,原因就是此软件的全称是 元宝箱FLV视频下载专家,不想要视频的话,点击最上面的设置或者最下面的高级设置,即可进行搜索范围设定

下面是搜索条件设定界面 以swf格式flash为例,进行搜索,选择类型中的第二项 点击确定,开始搜索,结果如下:

图片控件上实现双缓冲绘图防止闪烁

1.添加图片控件 2.对话框初始化函数(或其他函数中获得控件的绘图指针) /*******获得图片区绘图指针*******/ pWnd = GetDlgItem(IDC_STA TIC_SHOWPICTURE);//获得控件窗口 //获得控件大小,PictureRect是全局变量,用于存放控件大小 pWnd->GetClientRect(&PictureRect); pDC = pWnd->GetDC();//定义pDC为控件绘图设备指针 3.内存中绘图并将图形复制到当前区域中 void CShockSensorConfiguratorDlg::OnPaint() { …; else { if(m_iWitchPicture==3)//如果要显示的是第三张也就是自己绘制的图形 { CBitmap memBitmap; CBitmap* pOldBmp = NULL; memDC.CreateCompatibleDC(pDC); memBitmap.CreateCompatibleBitmap(pDC,PictureRect.right,PictureRect.bottom); pOldBmp = memDC.SelectObject(&memBitmap); memDC.BitBlt(PictureRect.left,PictureRect.top,PictureRect.right,PictureRect.bottom,pDC, 0,0,SRCCOPY); memDC.FillSolidRect(1,1,PictureRect.right-2,PictureRect.bottom-2,RGB(255,255,255)); DrawPicture(&memDC);//自绘函数,传入的是内存指针,也就是在内存中绘图pDC->BitBlt(PictureRect.left,PictureRect.top,PictureRect.right,PictureRect.bottom,&m emDC,0,0,SRCCOPY); memDC.SelectObject(pOldBmp); memDC.DeleteDC(); memBitmap.DeleteObject(); } else if(m_iWitchPicture==2) { CDC *pDC1; pDC1=GetDC(); CBitmap m_bmpBK;

下载网页视频方法

微博上看到的视频下载到电脑上的方法 分步阅读 我们刷微博时经常会看到网友发表视频,看到一些很棒的视频你是不是想下载到电脑上呢?网上可以找到很多所谓的教程,适用范围都不普遍。现在分类介绍下载那些视频的方法。 工具/原料 ?浏览器(建议使用IE) ?迅雷 ?部分视频网站的专用下载工具(如优酷、土豆) 第一类:有专用下载器的(如优酷、土豆) 1. 1 首先,下载视频的第一步就是进入原网页。在微博上就能找到(红框所示)。 每一条分享视频的微博都会有一个这样的图标,点它就能进入原网页。 2. 2 进入了原网页,接下来就是用那些下载器来下载了。第一类是比较简单的。 END 第二类:美拍视频 1. 1

由美图秀秀推出的“美拍”应用如今越来越受欢迎,使用人数也很多。美拍的视频在电脑上可以用迅雷来下载。第一步依然是进入原网页。 2. 2 进入原网页后,在网页内空白处右击鼠标,选择“查看源代码”。 3. 3 在源代码界面里你会看到一个“http://…….mp4”的地址,如果找不到,可以按组合键Ctrl+F打开查找功能,输入“.mp4”查找。找到这个地址后复制它,这时如果你的迅雷已经打开,就会自动弹出建立新任务的提示。这样就能把美拍的视频下载好了。美拍这一类视频的网页在源代码中有完整视频地址,下载相对也比较方便。 END 第三类:只能找缓存文件的(如秒拍、微博视频) 1. 1 秒拍似乎已经过气了,“微博视频”也是现在手机微博的功能,经常被使用。这两种视频是以Flash的形式播放的,地址在源代码里找不到。很多网友都说可以在缓存文件里找到,但如今的主流浏览器(如360、百度)为了减少内存占用量,是不保存大部分视频的缓存文件的,实践证明用360看过这两种视频后,缓存文件里根本找不到对应文件。因此假如你对这个视频有比较执着的喜爱,那就麻烦一下找IE浏览器帮忙吧。 2. 2

绘图的双缓冲技术

绘图的双缓冲技术 简介 幸运的是当编写一个典型的Windows 窗体程序时,窗体和控件的绘制、效 果等操作是不需要特别加以考虑的。这是为什么呢?因为通过使用 .Net 框架,开发人员可以拖动一系列的控件到窗体上,并书写一些简单的与事件相关联的 代码然后在IDE中按F5,一个完完全全的窗体程序就诞生了!所有控件都将自 己绘制自己,窗体或者控件的大小和缩放都调整自如。在这里经常会用到的, 且需要引起一点注意的就是控件效果。游戏,自定义图表控件以及屏幕保护程 序的编写会需要程序员额外撰写用于响应 Paint 事件的代码。 本文针对那些Windows 窗体开发人员并有助于他们在应用程序编制过程中 使用简单的绘图技术。首先,我们会讨论一些基本的绘图概念。到底谁在负责 进行绘制操作?Windows 窗体程序是如何知道何时该进行绘制的?那些绘制代 码究竟被放置在哪里?之后,还将介绍图像绘制的双重缓冲区技术,你将会看 到它是怎样工作的,怎样通过一个方法来实现缓存和实际显示的图像间的交替。最后,我们将会探讨”智能无效区域”,实际就是仅仅重绘或者清除应用程序 窗体上的无效部分,加快程序的显示和响应速度。希望这些概念和技术能够引 导读者阅读完本文,并且有助于更快和更有效的开发Windows 窗体程序。 Windows 窗体使用GDI+图像引擎,在本文中的所有绘图代码都会涉及使用 托管的.Net 框架来操纵和使用Windows GDI+图像引擎。 尽管本文用于基本的窗体绘图操作,但是它同样提供了快速的、有效的且 有助于提高程序性能的技术和方法。所以,在通读本文之前建议读者对.Net框 架有个基本的了解,包括Windows 窗体事件处理、简单的GDI+对象譬如Line,Pen和Brush等。熟悉Visual Basic .Net或者C#编程语言。 概念 Windows 应用程序是自己负责绘制的,当一个窗体”不干净”了,也就是 说窗体改变了大小,或者部分被其它程序窗体遮盖,或者从最小化状态恢复时,程序都会收到需要绘制的信息。Windows把这种”不干净”状态称为”无效的(Invalidated)”状态,我们理解为:需要重绘,当Windows 窗体程序需要重 绘窗体时它会从Windows消息队列中获取绘制的信息。这个信息经过.Net框架 封装然后传递到窗体的 PaintBackground 和 Paint 事件中去,在上述事件中 适当的书写专门用于绘制的代码即可。 简单的绘图示例如下: using System;

MFC双缓冲画图

在实现绘图的过程中,显示的图形总是会闪烁,笔者曾经被这个问题折磨了好久,通过向高手请教,搜索资料,问题基本解决,现将文档整理出来以供大家参考. 1.显示的图形为什么会闪烁 我们的绘图过程大多放在OnDraw或者OnPaint函数中,OnDraw在进行屏幕显示时是由OnPaint进行调用的。当窗口由于任何原因需要重绘时,总是先用背景色将显示区清除,然后才调用OnPaint,而背景色往往与绘图内容反差很大,这样在短时间内背景色与显示图形的交替出现,使得显示窗口看起来在闪。如果将背景刷设置成NULL,这样无论怎样重绘图形都不会闪了。当然,这样做会使得窗口的显示乱成一团,因为重绘时没有背景色对原来绘制的图形进行清除,而又叠加上了新的图形。有的人会说,闪烁是因为绘图的速度太慢或者显示的图形太复杂造成的,其实这样说并不对,绘图的显示速度对闪烁的影响不是根本性的。例如在OnDraw(CDC *pDC)中这样写: pDC->MoveTo(0,0); pDC->LineTo(100,100); 这个绘图过程应该是非常简单、非常快了吧,但是拉动窗口变化时还是会看见闪烁。其实从道理上讲,画图的过程越复杂越慢闪烁应该越少,因为绘图用的时间与用背景清除屏幕所花的时间的比例越大人对闪烁的感觉会越不明显。比如:清楚屏幕时间为1s绘图时间也是为1s,这样在10s内的连续重画中就要闪烁5次;如果清楚屏幕时间为1s不变,而绘图时间为9s,这样10s内的连续重画只会闪烁一次。这个也可以试验,在OnDraw(CDC *pDC)中这样写: for(int i=0;i<100000;i++) { pDC->MoveTo(0,i); pDC->LineTo(1000,i); } 程序有点极端,但是能说明问题。 说到这里可能又有人要说了,为什么一个简单图形看起来没有复杂图形那么闪呢?这是因为复杂图形占的面积大,重画时造成的反差比较大,所以感觉上要闪得厉害一些,但是闪烁频率要低。那为什么动画的重画频率高,而看起来却不闪?这里,我就要再次强调了,闪烁是什么?闪烁就是反差,反差越大,闪烁越厉害。因为动画的连续两个帧之间的差异很小所以看起来不闪。如果不信,可以在动画的每一帧中间加一张纯白的帧,不闪才怪呢。 2、如何避免闪烁 在知道图形显示闪烁的原因之后,对症下药就好办了。首先当然是去掉MFC提供的背景绘制过程了。实现的方法很多: * 可以在窗口形成时给窗口的注册类的背景刷付NULL * 也可以在形成以后修改背景 static CBrush brush(RGB(255,0,0)); SetClassLong(this->m_hWnd,GCL_HBRBACKGROUND,(LONG)(HBRUSH)brush); * 要简单也可以重载OnEraseBkgnd(CDC* pDC)直接返回TRUE(屏蔽掉系统的自动刷新)

页面缓存

页面缓存 1前言 页面缓存一直是前端开发中我们关注比较少的,研究了一些资料,总结了一些心得,记录下来共同探讨。 合理的页面缓存可以让页面执行的效率提高很多(在第一次访问或者CTRL+F5强制刷新的时候,缓存的效果是体现不出来的),而不是我们一味的设置cache-control为no-cache。 当然了如果缓存使用不当,也会带来麻烦,比如缓存参数设置不合理,会导致请求得到的是旧的页面元素。 2缓存原理 首先一开始我们要明确页面缓存的原理以及过程。 缓存的原理大体是在浏览器对资源的第一次请求之后,把资源中的一部分存储在计算机的临时文件空间,再次请求的时候,按照特定的策略加载缓存的资源,减少HTTP请求次数与传输数据量,以此提高浏览效率。 以下是一个请求的过程讲解。 2.1 第一次请求 打开一个浏览器如IE,这时候浏览器会对自身设置的参数进行加载,其中就包括缓存设置参数。 接下来我们在地址栏输入一个url,这时候浏览器会发送一个简单的HTTP请求报文头给应用服务器,这个报文头主要包含的信息是请求的url,接受的编码约定,缓存控制等信息。 典型的请求报文头:

服务器接受到了请求报文头,一堆业务处理完毕之后,会给出HTTP响应报文,响应报文格式分为报文头和报文体,响应报文头中的信息是很重要的,我们以一个图片响应报文头为例讲解相关内容: 这个响应报文头可以看到以下信息: 响应状态码是200,说明是正确返回。 cache-control设定了有效时间,在这个时间内新打开新网页(或者地址栏回车)不 需要去请求服务器。 报文内容类型是image/gif。 最近修改时间是2008-7-30 10:23:00,最近修改时间在浏览器刷新的时候有很大的 用处,浏览器刷新的时候,会发送对该图片请求的报文,得到的响应报文中如果最 近修改时间和缓存的一致,那么浏览器将会从缓存中读取该图片的信息(状态码是 304),如果两个时间不一致,会从服务器请求得到最新的文件,并缓存。 服务器类型等其他信息。 该响应报文接受到之后,浏览器解读报文体内容,并打开显示给用户,这是主要的工作。 除此之外,浏览器还根据报文头的信息,确定一些缓存规则,比如no-cache的不缓存,设置了max-age的再次打开不请求等,更多的信息可以参考三、四章节。 2.2 再次请求 再次请求的时候,才是缓存显现身手的时候。 还是以上面请求的那个图片(设置了max-age)为例。

三种网页视频下载方法介绍

三种网页视频下载方法介绍 如何将网页上的视频下载是常遇到的问题,常规做法是注册网页所属的视频网站后再用其专属播放插件下载。视频网站众多,这就要安装繁多播放插件,另外记忆众多的户名和密码也顶麻烦,况且不少网站就没有视频下载界面。为此将本人最近常用的三种视频下载方法和软件介绍给大家,以供参考。 一、不用软件工具下载方法: 1、下载前打开网页的【工具】、【Internet选项】、点【删除文件】、【确定】,清空多余的缓存文件。 2、当网页视频播看快到结束,只要进度条走满就应刻暂仃(因为播完后播放软件有可能会自动清除缓存文件)。 3、再打开【Internet选项】、【设置、【查看文件】,这时打开了一个文件夹:c:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files(当然也可直接打开这个文件夹),为了方便查找缓存文件夹中视频文件,应按大小排列一次文件,一般视频文件就比较大,大部分都是FLV (或者试改为后缀名为:flv),找到视频文件后将其复制到指定文件夹,用暴风影音或者其它播放软件打开核对确认。 4、一般来说缓冲文件夹中视频文件大多是几个小段,尚需用软件合并方好连续播看。 不过,这种方法虽简单但实际上效果不是太好,因为大多播放软件的临时缓存文件视频存放文件夹都不一定在上述文件夹(c:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files)内。 这时可用下面介绍的两个软件下载。 二、使用维棠FLV视频下载软件下载: 1、打开维棠FLV视频下载软件 2、打开视频所在网页 3、复制视频所在网页的地址(用鼠标拉黑后按Ctrl+ C) 4、点开维棠FLV视频下载软件菜单【文件】【新建】后出如下图的【[添

C#绘图双缓冲技术总结

C#绘图双缓冲技术总结 GDI+的双缓冲问题 一直以来的误区:.net1.1 和.net 2.0 在处理控件双缓冲上是有区别的。 .net 1.1 中,使用:this.SetStyle(ControlStyles.DoubleBuffer, true); .net 2.0中,使用:this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); VS2005 是2.0 怪不说老是提示参数无效,一直也不知道是这个问题,呵呵 要知道,图元无闪烁的实现和图元的绘制方法没有多少关系,只是绘制方法可以控制图元的刷新区域,使双缓冲性能更优! 导致画面闪烁的关键原因分析: 一、绘制窗口由于大小位臵状态改变进行重绘操作时 绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示。刷新过程中会导致所有图元重新绘制,而各个图元的重绘操作并不会导致Paint事件发生,因此窗口的每一次刷新只会调用Paint事件一次。窗口刷新一次的过程中,每一个图元的重绘都会立即显示到窗口,因此整个窗口中,只要是图元所在的位臵,都在刷新,而刷新的时间是有差别的,闪烁现象自然会出现。 所以说,此时导致窗口闪烁现象的关键因素并不在于Paint事件调用的次数多少,而在于各个图元的重绘。

根据以上分析可知,当图元数目不多时,窗口刷新的位臵也不多,窗口闪烁效果并不严重;当图元数目较多时,绘图窗口进行重绘的图元数量增加,绘图窗口每一次刷新都会导致较多的图元重新绘制,窗口的较多位臵都在刷新,闪烁现象自然就会越来越严重。特别是图元比较大绘制时间比较长时,闪烁问题会更加严重,因为时间延迟会更长。 解决上述问题的关键在于:窗口刷新一次的过程中,让所有图元同时显示到窗口。 二、进行鼠标跟踪绘制操作或者对图元进行变形操作时 当进行鼠标跟踪绘制操作或者对图元进行变形操作时,Paint事件会频繁发生,这会使窗口的刷新次数大大增加。虽然窗口刷新一次的过程中所有图元同时显示到窗口,但也会有时间延迟,因为此时窗口刷新的时间间隔远小于图元每一次显示到窗口所用的时间。因此闪烁现象并不能完全消除! 所以说,此时导致窗口闪烁现象的关键因素在于Paint事件发生的次数多少。解决此问题的关键在于:设臵窗体或控件的几个关键属性。 下面来介绍解决办法的具体细节: 解决双缓冲的关键技术: 1、设臵显示图元控件的几个属性:必须要设臵,否则效果不是很明显!this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true);

c++双缓冲程序设计

《1》普通绘图就是直接在我们看得到的黑板上绘图 《2》双缓冲就是先在一个虚拟的黑板上画完,等用到的时候在把虚拟黑板上的图画复制到我们看得到的黑板上去; 利用双缓冲的优点就是能够使画面流畅,可以想象把画好的图直接粘贴到黑板上一定比在黑板上重新画要快的多。 ——————————————————————开始 第一步:新建一个对话框工程 第二步:添加两个按钮: 一个命名为双缓冲绘图; 一个命名为普通绘图; 第三步:声明变量: 在CMyDlg类上右击添加变量如下: CDC MyDC; CBitmap bmp; CBitmap *oldbmp; 首先声明一个与窗口DC兼容的内存DC(MyDC)和两个与内存相兼容的位图(bmp,*oldbmp) 第四步:在OnInitDialog()函数中添加以下代码: //窗口DC CDC *dc=GetDC(); //创建与窗口DC兼容的内存DC(MyDC)及位图(bmp,*oldbmp ) MyDC.CreateCompatibleDC(dc); bmp.CreateCompatibleBitmap(dc,200,200); //把内存位图选进内存DC中用来保存在内存DC中绘制的图形 oldbmp=MyDC.SelectObject(&bmp); //在内存DC中绘制一些小的圆形,数量要多(体现双缓存的优点) for(int i=0;i<200;i+=6) for(int j=0;j<200;j+=6) MyDC.Ellipse(i-3,j-3,i+3,j+3); 第五步:右击CMyDlg类添加windows消息响应函数WM_CLOSE,添加以下代码:MyDC.SelectObject(oldbmp); bmp.DeleteObject(); MyDC.DeleteDC(); //选进原来的位图,删除内存位图对象和内存DC 第六步:双击”双缓冲“按钮添加以下代码: GetDC()->StretchBlt(0,0,200,200,&MyDC,0,0,200,200,SRCCOPY); //把内存DC中的图形粘贴到窗口中; 第七步:双击“普通绘图”按钮添加以下代码: for(int i=0;i<200;i+=6) for(int j=0;j<200;j+=6) GetDC()->Ellipse(i-3,j-3,i+3,j+3);

利用IE缓存下载网页中的动画和视频

利用IE缓存下载网页中的动画和视频 经常有同事和朋友叫我帮忙下载网页中的动画或视频等资源,其实我们可以利用IE缓存来找到这些资源。为了提高访问网页的速度,Internet Explorer浏览器会采用累积式加速的方法,将你曾经访问的网页内容(包括图片、flash动画、flv视频以及cookie文件等)存放在电脑里。这个存放空间,我们就称它为IE缓存。以后我们每次访问网站时,IE会首先搜索这个目录,如果其中已经有访问过的内容,那IE就不必从网上下载,而直接从缓存中调出来,从而提高了访问网站的速度。这就是为什么第一次打开一个网站时比较慢,第二次打开却快很多的原因。 也就是说,其实我们打开网页时,那些资源已经存储到我们的电脑缓存空间里了,根本不用下载,只要找到它们,复制出来就行了。那如何找到这些资源呢?我把自己 的经验总结一下,希望以后有需要的朋友不用再找我了 一、打开IE的缓存文件夹。打开IE(最好用IE,因为IE是我测试过无数次的了,其他浏览器的缓存文件夹比较难找,我也没有测试过。),依次单击“工具”>“Internet 选项”,然后在“Internet选项”对话框的“常规”选项下依次单击“设置”>“查看文件”,就能打开IE的缓存目录了。当然其实这个目录可以自己指定的,如果指定了,就更容易找。操作步骤如下图:

二、这个缓存目录里的文件非常多,为了方便查找可以先依次单击“编辑”>“全部选定”选中全部文件,然后把文件删除,这时可能会提示你是否删除选定的cookie,直接单击“是”就行了,删除这些cookie文件对电脑也不会有影响。如果Win7系统在这一步没有“编辑”菜单,可先单击任意一个文件,再同时按“Ctrl”和“A”两 个键也能选中全部文件。如下图:

vc双缓冲

双缓冲:VC++双缓冲实现方法 在图形图象处理编程过程中,双缓冲是一种基本的技术。我们知道,如果窗体在响应WM_PAINT消息的时候要进行复杂的图形处理,那么窗体在重绘时由于过频的刷新而引起闪烁现象。解决这一问题的有效方法就是双缓冲技术。 因为窗体在刷新时,总要有一个擦除原来图象的过程OnEraseBkgnd,它利用背景色填充窗体绘图区,然后在调用新的绘图代码进行重绘,这样一擦一写造成了图象颜色的反差。当WM_PAINT的响应很频繁的时候,这种反差也就越发明显。于是我们就看到了闪烁现象。 我们会很自然的想到,避免背景色的填充是最直接的办法。但是那样的话,窗体上会变的一团糟。因为每次绘制图象的时候都没有将原来的图象清除,造成了图象的残留,于是窗体重绘时,画面往往会变的乱七八糟。所以单纯的禁止背景重绘是不够的。我们还要进行重新绘图,但要求速度很快,于是我们想到了使用BitBlt函数。它可以支持图形块的复制,速度很快。我们可以先在内存中作图,然后用此函数将做好的图复制到前台,同时禁止背景刷新,这样就消除了闪烁。以上也就是双缓冲绘图的基本的思路。 一、普通方法: 先按普通做图的方法进行编程。即在视类的OnDraw函数中添加绘图代码。在此我们绘制若干同心圆,代码如下: CBCDoc* pDoc = GetDocument(); ASSERT_V ALID(pDoc); CPoint ptCenter; CRect rect,ellipseRect; GetClientRect(&rect); ptCenter = rect.CenterPoint(); for(int i=20;i>0;i--){ ellipseRect.SetRect(ptCenter,ptCenter); ellipseRect.InflateRect(i*10,i*10); pDC->Ellipse(ellipseRect); } 编译运行程序,尝试改变窗口大小,可以发现闪烁现象。 二、双缓冲方法: 在双缓冲方法中,首先要做的是屏蔽背景刷新。背景刷新其实是在响应WM_ERASEBKGND消息。我们在视类中添加对这个消息的响应,可以看到缺省的代码如下:

GDI+测井曲线绘图中效率提升的研究

龙源期刊网 https://www.sodocs.net/doc/a818832270.html, GDI+测井曲线绘图中效率提升的研究 作者:王宇飞赵正文李瑶 来源:《数字技术与应用》2013年第03期 摘要:GDI+提供了快速、简单、有效的程序开发方式。大量测井原始数据生成测井曲线时,绘制对象的增加严重制约了GDI+的绘图效率。双缓冲技术的使用,可以有效避免图形的闪烁;使用内存中已有图形,可以减少测井曲线的绘制过程,显著提高图形绘制效率。 关键词:测井曲线双缓冲内存图形绘图效率 中图分类号:P631.84 文献标识码:A 文章编号:1007-9416(2013)03-0083-02 1 前言 GDI(Graphics Device Interface,图形设备接口)的主要任务是负责系统与绘图程序之间 的信息交换,处理所有Windows程序的图形输出。通过GDI众多函数,软件开发人员不需要关心设备驱动及具体硬件设备,就可以将应用程序的输出转化为硬件设备上的输出,实现程序与硬件设备的隔离,方便开发工作。 GDI+是GDI的升级版本,在GDI的基础上进行了了大量的优化和改进工作,使得它的易用性更好。GDI其中的一个好处就是用户不必知道任何关于数据怎样在设备上绘制图像的细节,GDI+更好地拓展了这一优点,GDI是一个中低层API,用户必须需要知道设备情况,而GDI+是一个高层的API,用户可以不必知道设备情况,GDI+的体系结构如图1。此外,GDI+不但在功能上比GDI强大很多,而且在代码编写方面也要显得更加简单方便,这将使得其很 快成为Windows图形图像程序开发的首选。 2 测井曲线绘制中存在问题 测井是油田勘探与开发过程中确定和评价油、气层的重要方法之一,是解决地质问题的重要手段。通过测井能直接为石油地质和工程技术人员提供各项资料和数据,以指导油田生产。然而,通过测井设备测量出的大多是一系列离散或连续的数值型数据,同时这也是它们在数据库中的存储形式,即使经验丰富的测井解释人员要想在几百甚至几千米井深的海量测井数据中获得解释结论也是相当困难的,不利于测井数据发挥其功用。将各类测井数据以图像的形式直观的展示在测井解释人员面前,更方便于测井数据的解释与分析。 由于油田勘探与开发过程中,井深一般都在几百米甚至几千米。以一米八个采样点,井深1000米就有8000个采样点。按照1280×800的分辨率进行绘制,也需要10个屏幕长度的界面来绘制。同时,测井曲线图中的对象需要进行、调整显示顺序等操作。如果在绘制过程中,将所有对象进行绘制,图形会出现严重闪烁和操作延迟现象。因此,有效提升绘图效率的方法是必需的,以此达到测井解释人员的使用要求。

C#高效绘图

C#高效绘图 来源:https://www.sodocs.net/doc/a818832270.html,/suncherrydream/article/details/17585201 双缓冲技术 双缓冲是将图片在显示到DC前,现在要内存建一个DC,也就是用于存储这张图片的内存区,然后在将这部分update到你要显示的地方 这样,可以防止画面抖动很大 这样和你说吧,如果要实现你要的效果,你必须用指针访问内存 比如,把程序声明成unsafe的,然后按照上面的操作进行 this.clear(this.BackColor)不行的invalidate(),闪的厉害所以不行 我再来详细解释一下刚才实现双缓冲的具体步骤: 1、在内存中建立一块“虚拟画布”: Bitmap bmp = new Bitmap(600, 600); 2、获取这块内存画布的Graphics引用: Graphics g = Graphics.FromImage(bmp); 3、在这块内存画布上绘图: g.FillEllipse(brush, i * 10, j * 10, 10, 10); 4、将内存画布画到窗口中 this.CreateGraphics().DrawImage(bmp, 0, 0); 重点: 现在的cpu飞快,其实数学计算一般很快,cpu大部分时间是在处理绘图,而绘图有三种境界:1>每次重绘整体Invalidate() 2>每次局部绘制Invalidate(Rect); 3>有选择的局部绘制。 不能说,一定是第三种方式好,得视情况,境界高程序肯定就复杂,如果对效率要求不高或者绘图量小当然直接用第一种方式。然而,稍微专业点的绘图程序,第一第二种方式肯

利用双缓存技术解决GDI画图的刷新问题

利用双缓存技术提高GDI+的绘图效果 摘要 在进行图像处理的软件中,一般的图形处理程序需要大量的绘图操作,首要解决的就是绘图的效率和效果问题:前者表现在性能方面,是否有延迟,一个小小的交互操作是否要等上几秒才能看到结果;后者表现在重新绘制或刷新的过程中出现闪烁?本文主要介绍GDI+程序中引用双缓冲技术以解决重绘时出现的闪烁问题—提高绘图效果。 关键字:GDI+;双缓存;快速;缓存位图;效果 引言 在使用GDI+的实际的绘图中,绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示。这样的效率非常低,不仅达不到性能要求,而且还可能会出现闪烁的现象。刷新过程中会导致所有图元重新绘制,而各个图元的重绘操作并不会导致Paint事件发生,因此窗口的每一次刷新只会调用Paint 事件一次。窗口刷新一次的过程中,每一个图元的重绘都会立即显示到窗口,因此整个窗口中,只要是图元所在的位置,都在刷新,而刷新的时间是有差别的,闪烁现象自然会出现。所以说,此时导致窗口闪烁现象的关键因素并不在于Paint事件调用的次数多少,而在于各个图元的重绘。 根据以上分析可知,当图元数目不多时,窗口刷新的位置也不多,窗口闪烁效果并不严重;当图元数目较多时,绘图窗口进行重绘的图元数量增加,绘图窗口每一次刷新都会导致较多的图元重新绘制,窗口的较多位置都在刷新,闪烁现象自然就会越来越严重。特别是图元比较大绘制时间比较长时,闪烁问题会更加严重,因为时间延迟会更长。 1、双缓存技术 为了解决画图的效率问题,我们引进了双缓存技术,双缓冲技术早在GDI的程序开发中,就已经开始使用。在普通的绘图模式下,图像处理程序是按照设计的顺序,将被绘制的元素一个接一个地在目标设备上进行绘制。何谓“双缓冲”?它的基本原理就是:先在内存中开辟一块虚拟画布,然后将所有需要画的图形先画在这块“虚拟画布”上,最后在一次性将整块画布画到真正的窗体上。因为所有的单个图形的绘制都不是真正的调用显示系统“画”,所以不会占用显示系统的开销,极大的提高的绘图效率。其原理如图1所示。[1][3]

相关主题