`
Strive_sprint
  • 浏览: 22669 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

浅谈java双缓冲解决闪烁

 
阅读更多

 

 

      很久没打开eclipse了,把电脑重装了系统,重新装了JDK,重新装了eclipse,花了几天时间重新适应一下程序的编写,发现以前非常熟悉的东西现在也就仅仅是知道有那么个东西而基本不会写了。哎!杯具。。。

 

 

       今天写了个swing+Thread最简单的小游戏,就是手动控制两个小方块的碰撞(包括方块和墙的碰撞),因为我准备写个小时候玩的小霸王游戏—坦克大战,今天就算是起步。

 

       在线程run()方法中调用repaint()方法来对界面重绘,也就达到动画的效果。一切over,当运行程序的时候发现,屏幕闪的厉害。查看程序,发现线程run()中while()循环每循环一次界面就要重绘一次,这才导致屏幕频繁的闪烁。。

 

       深入分析,这个repaint()方法是从父类JFrame继承来的,当repaint方法执行的时候会调用update(Graphics g)方法,而update()方法里面首先判断是否轻量组件,如果是那么用背景色覆盖掉界面g.clearRect(0,0,width,height),然后再调用paint()方法,意思就是先清理掉当前,然后画下一个画面,所谓屏幕闪烁就是清理和重绘的过程,那么如何解决呢,貌似要达到动画的效果就必须先清理再重绘。。。咋办呢

 

       屏幕闪动总是那么的让人无法忍受,于是我上网搜了一下解决方法,乍看下去都是说的用双缓冲技术来解决。。小弟为了让屏幕冷静下来不要那么激动就自学了一下,下面我来说说我的理解。。

       所谓双缓冲,就是在内存中重新开辟新空间,作为后台图像,然后把本来要在界面上进行的清理和重绘在后台处理好,生成一幅新的画面,最后再显示在界面上。

       原理总是很简单的,实现起来时怎样呢?

 

       首先要定义两个私有变量,一个是后台图像iBuffer,一个是后台图像的画布对象gBuffer。这也就是所谓的双缓冲。然后通过一段程序来帮助理解:

//重写paint方法
public void paint(Graphics scr){
    //判断后台图像是否为空
	if(iBuffer == null){
        //如果为空,则创建一个和当前界面一样大小的缓冲图像,再取得这个图像的画布对象gBuffer
		iBuffer = createImage((int)this.getSize().getWidth(),(int)this.getSize().getHeight());
		gBuffer = iBuffer.getGraphics();
	}
    //用背景色填充图像(清理画面)
	gBuffer.setColor(getBackground());
	gBuffer.fillRect(0, 0, (int)this.getSize().getWidth(), (int)this.getSize().getHeight());
	//然后再绘制下一幅画面在缓冲图像
	gBuffer.setColor(Color.RED);
	gBuffer.fillOval(90, ypos, 80, 80);
	//在界面上直接画出缓冲图像
	scr.drawImage(iBuffer,0,0,this);
}
//重写update方法,不用再实现画面的
public void update(Graphics scr){
	paint(scr);
}

 

      将本来要在界面上实现的操作(画面的清理和重绘)在后台就实现好,然后绘制成一幅画面,最后在界面上显示这个画面,从而消除屏幕的闪烁,问题也随之解决。

 

 

       然而,一个目的的达到,当然也会大大小小的付出相应的代价,只是付出代价值不值得的问题了。利用双缓冲消除闪烁到底付出了什么代价呢?哦,原来是加大了内存的开销,因为这一过程是在新开辟的内存中实现的,那到底开销了多少呢?值不值得呢?这个我还真没研究过。但是不是界面上所有的东西都要在后台清理了重绘呢,为了减少内存不必要的开销,我觉得只需要把变的东西放在iBuffer中就行了,这样付出的代价也就小一点,何乐而不为呢。。

 

 

       小试牛刀还真找到了以前的感觉,把一件事做好很简单,难就难在一直把事做好。这就需要坚持不懈的精神。。。

       铁杵不是一天或者一个周或者一个月甚至不是一个年能磨成针的~

分享到:
评论

相关推荐

    java双缓冲消除闪烁

    ### Java双缓冲消除闪烁 #### 一、问题的引入与分析 在进行Java游戏开发或者多媒体动画处理时,经常会遇到屏幕闪烁的问题。这种现象不仅影响视觉体验,还可能降低应用程序的专业性和用户满意度。屏幕闪烁主要发生...

    VC6下的GDI+双缓冲 解决闪烁问题

    总的来说,GDI+双缓冲技术在解决Windows应用程序中的闪烁问题上发挥了重要作用。对于开发者来说,理解并熟练运用这一技术能够显著改善用户的交互体验,使得应用程序看起来更加流畅和专业。通过实践和研究提供的源码...

    C# 双缓冲区实现解决屏幕闪烁问题

    总结起来,双缓冲是解决C#中屏幕闪烁问题的有效策略。通过在内存中创建额外的缓冲区,可以避免直接在屏幕上连续绘制造成的闪烁现象,提供更平滑的视觉体验。无论是GDI+的手动实现,还是Windows Forms和WPF的内置支持...

    Java双缓冲技术.doc

    总结来说,Java双缓冲技术是解决屏幕闪烁问题的关键。通过在内存中创建一个额外的缓冲区,可以先在缓冲区中完成所有绘制,然后再一次性将缓冲区内容绘制到屏幕上,从而避免了频繁的屏幕刷新,显著提升了动画的视觉...

    Java双缓冲技术原理详细讲解例子

    Java双缓冲技术是一种提高图形界面性能的策略,尤其在绘制复杂的UI组件时,能有效避免闪烁现象,提供平滑的视觉体验。双缓冲的核心思想是将屏幕上的绘图操作先在一个临时缓冲区进行,待全部操作完成后再一次性将缓冲...

    双缓冲解决图像闪烁

    解决动画实现中出现的图像闪烁问题,罗列出各种解决方案,主要介绍双缓冲技术

    Java双缓冲技术原理详细讲解例子Java实用源码整理learns

    Java双缓冲技术是一种图形渲染优化策略,主要用于提高GUI(图形用户界面)的性能和减少屏幕闪烁,提升用户体验。在Java中,它主要应用于Swing和JavaFX等图形库。本教程将深入探讨Java双缓冲技术的原理,并通过实例...

    Java双缓冲技术Java双缓冲技术

    关键词:Java双缓冲技术、屏幕闪烁、动画处理、Java游戏编程 一、问题的引入 在编写Java多媒体动画程序或用Java编写游戏程序的时候,我们得到的动画往往存在严重的闪烁(或图片断裂)。这种闪烁虽然不会给程序的...

    java画图(双缓冲)

    总结一下,双缓冲技术在Java中的应用可以显著提升GUI程序的画图性能和用户体验,防止画面闪烁,提供流畅的动画效果。通过重写`paintComponent`方法和利用`Graphics2D`对象,开发者可以实现自定义的画图功能,创建出...

    VC++ 双缓冲技术解决刷新闪烁的源代码实例

    VC++ 双缓冲技术解决刷新闪烁的源代码实例 VC++利用双缓冲技术解决刷新闪烁问题的源代码实例,经常从事VC编程的朋友可能知道,如果窗体的内容刷新次数过快,会导致屏幕或窗口闪烁问题,如何解决这个难题呢?那就看...

    双缓冲技术解决刷新闪烁

    双缓冲技术是计算机图形学和GUI编程中一种重要的优化手段,主要目的是解决界面元素在更新时出现的闪烁问题。在日常使用计算机时,比如浏览网页、玩图形化游戏或者观看视频,我们可能会注意到屏幕上的某些内容在快速...

    Java双缓冲技术[参考].pdf

    在 update(Graphics g) 函数中,我们可以使用双缓冲技术来解决屏幕闪烁的问题。我们可以创建一个 BufferedImage 对象,然后将其作为后缓冲区。每当我们需要更新屏幕时,我们将当前屏幕的内容绘制到后缓冲区,然后...

    双缓冲技术解决刷新闪烁_thenq78_Vc_

    在标题提到的"VC++利用双缓冲技术解决刷新闪烁问题"的源代码实例中,我们将深入探讨这一技术。 VC++是Microsoft的C++编译器,它支持Windows API,使得开发者能够创建高效、高性能的应用程序。在VC++中,当一个窗口...

    vb.net中listview双缓冲解决数据刷新时假死和闪频

    综上所述,解决VB.NET中ListView控件的假死和闪烁问题,主要涉及到双缓冲技术的运用,以及对.NET框架数据结构的理解。通过自定义控件并优化绘制过程,可以显著提升用户体验。同时,不断学习和借鉴其他语言的解决方案...

    双缓冲解决屏幕闪烁问题

    在计算机图形学和GUI编程中,"双缓冲"是一种有效解决屏幕闪烁问题的技术。当程序在屏幕上绘制图形或更新界面时,如果没有采取适当的措施,可能会出现闪烁现象,这主要是因为屏幕刷新与数据更新不同步导致的。双缓冲...

    双缓冲方法解决屏幕刷新闪烁的问题.rar_C# 双缓冲C#_LCD开双缓冲_双缓冲_鍙岀紦鍐_闪烁

    在计算机图形学和编程领域,尤其是在游戏开发和用户界面设计中,"双缓冲"是一种有效解决屏幕刷新闪烁问题的技术。本主题主要关注如何在C#环境下应用双缓冲方法,以提高用户体验并消除屏幕闪烁现象。 标题中的“双...

    基于VS2010的MFC时钟绘制(双缓冲防闪烁)

    在本文中,我们将深入探讨如何使用Visual Studio 2010中的MFC(Microsoft Foundation Classes)库来开发一个基于双缓冲技术的时钟程序,以此防止屏幕闪烁并提供平滑的用户界面体验。 首先,MFC是微软为Windows平台...

    引用 MFC GDI双缓冲避免图形闪烁

    ### 引用MFC GDI双缓冲避免图形闪烁 #### 显示图形为何会出现闪烁现象? 在探讨如何通过MFC和GDI实现双缓冲以避免图形闪烁之前,我们首先需要了解为何在绘制图形的过程中会出现闪烁的现象。 **闪烁的本质是视觉上...

    贪吃英雄(四) GDI+双缓冲解决闪烁问题

    在本篇中,我们将深入探讨如何使用GDI+的双缓冲技术来解决Windows应用程序中常见的图形更新闪烁问题。这个问题在开发游戏,特别是像"贪吃英雄"这样的动态图形应用时尤为显著。闪烁通常是由于在屏幕刷新率与应用程序...

    双缓冲显示位图 解决刷新时的闪烁问题

    在计算机图形学中,"双缓冲显示位图"是一种优化技术,主要用来解决在更新屏幕内容时出现的闪烁现象,特别是在动态显示图像或者动画时。这种现象通常发生在单缓冲机制中,当屏幕上的图像被逐行刷新时,用户可能会看到...

Global site tag (gtag.js) - Google Analytics