前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >双缓冲原理在Awt和Swing中实现消除闪烁方法总结

双缓冲原理在Awt和Swing中实现消除闪烁方法总结

作者头像
sr
发布于 2018-08-20 02:16:30
发布于 2018-08-20 02:16:30
2.5K00
代码可运行
举报
文章被收录于专栏:swag codeswag code
运行总次数:0
代码可运行

最近在做Java版贪吃蛇的入门项目,过程中遇到窗口闪烁的问题总结。

一、AWT组件开发

1、AWT

AWT是抽象窗口工具箱的缩写,它为编写图形用户界面提供了用户接口,通过这个接口就可以继承很多方法,省去了很多工作。AWT还能使应用程序更好地同用户进行交互。

AWT中的容器是一种特殊的组件,他可以包含其他组件,即可以把组件方法容器中。Container类是用来存放其他组件的Component类的子类,Frame类又是Component的子类。Frame类用于创建具有标题栏和边界的窗口。这里通过继承Frame类来建立自己的界面。

二、Swing界面编程

       随着Java的发展,AWT已经渐渐被淘汰,它已经不能适应发展的需要,不能满足开发功能强大的用户界面的需要。这时Swing出现了,它是建立在AWT之上的组件集,在不同的平台上都能保持组件的界面样式,因此得到了非常广泛的应用。

1、Swing组件库

在Swing组件中有许多种组件,它们被封装在JFC中,下面我们会对每一种组件进行详细介绍。Swing包很多,但平常用到的只有javax.swing.*和javax.swing.event.*这两个包,其他的很少用到。

       1)、JFC结构

JFC是Java的基础类,是Java Foundation Classes的缩写形式,封装了一组用于构建图形用户界面的组件和特性。JFC包含了图形用户界面构建中需要用到的顶级容器(Applet、Dialog、Frame)、普通容器(面板、滚动面板、拆分窗格组件、选项卡插U能给个和工具条等)、特殊容器(InternalFrame、Layeredpane、root pane)、基本组件(button , combo box , list , menu , slider , spinner和textfild)等。

       2)、与AWT的区别

最大的区别在于Swing组件的实现与本地实现无关。Swing组件比AWT组件具有更多的功能。例如在Swing中添加了按钮组件和标签组件,通过继承来更改Swing组件的行为和外观,访问技术等。


在游戏中相应的实现即主要窗体用Frame和JFrame来构建。

1.Frame:重量级组件

2.JFrame:轻量级组件

出现问题:

①.窗体调用repaint()方法时闪烁严重

②.窗体设置双缓冲重绘后,DrawImage()进行缩放图片时会失真,Graphics2D设置抗锯齿属性也会失效

Ps:问题到目前为止还没有很好的处理,可能相应的用JPanel进行绘制会解决问题(暂未尝试!)


在Awt中对于窗体画布的重绘其条用顺序是repaint() —>update()—>paint();

默认的upadate()中自带clearRect()方法,即清屏功能,程序运行时我们调用repaint()方法刷新则会造成屏幕刚清空,又继续重新调用paint()方法往窗体上绘制,则就造成闪烁问题!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public void update(Graphics g) {     
        if (isShowing()) {     
            if (! (peer instanceof LightweightPeer)) {     
                g.clearRect(0, 0, width, height);     
            }     
            paint(g);     
        }     
}    

所以闪烁问题我们需要重写update()方法来实现双缓冲

代码:(以本人贪吃蛇项目为例)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void update(Graphics g) {


		// 截取窗体所在位置的图片  
                   if (image == null)
			image = this.createImage(this.getWidth(), this.getHeight());
		// 获得截取图片的画布
		Graphics gre = image.getGraphics();
                // 获取画布的底色并且使用这种颜色填充画布(默认的颜色为黑色) 
		gre.setColor(gre.getColor());
                // 有清除上一步图像的功能,相当于gImage.clearRect(0, 0, WIDTH, HEIGHT) 
		gre.fillRect(0, 0, this.getWidth(), this.getHeight());
		// 将截下的图片上的画布传给重绘函数,重绘函数只需要在截图的画布上绘制即可,不必在从底层绘制     
		paint(gre);
	        //将接下来的图片加载到窗体画布上去,才能考到每次画的效果  
		g.drawImage(image, 0, 0, null);
		

	}

而Swing中内置双缓冲,我们首先从继承体系来看,JFrame->Frame->Window->Container->Component,在Frame中的update()方法是从Container中继承而来的,而JFrame中却重写了update()方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void update(Graphics g) {     
    paint(g);     
}   

对比之后会发现直接调用了paint()函数而没有clearRect(),试图不通过清屏来阻止闪烁的发生。这也就是JFrame本身的一种处理方法。

但是我们用JFrame编程并且重新update()实现双缓冲后,窗体一样狂闪不停!原因为何?

下面引用一张图来说明:

repaint()方法在重量级组件的时候会调用update方法,在轻量级组件的时候会调用paint方法

即JFrame根本不会去调用update()方法!

解决方法:在Paint()中直接进行双缓冲操作

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (image == null)
			 
	// 截取窗体所在位置的图片  
                   if (image == null)
			image = this.createImage(this.getWidth(), this.getHeight());
		// 获得截取图片的画布
		Graphics gre = image.getGraphics();
                // 获取画布的底色并且使用这种颜色填充画布(默认的颜色为黑色) 
		gre.setColor(gre.getColor());
                // 有清除上一步图像的功能,相当于gImage.clearRect(0, 0, WIDTH, HEIGHT) 
		gre.fillRect(0, 0, this.getWidth(), this.getHeight());
		//调用父类的重绘方法,传入的是截取图片上的画布,防止再从最底层来重绘      
		 super.paint(imageG );
		 
		//蛇身
		if (snake != null) {
			snake.drawSnake(imageG );
			snake.scoreView(imageG );
		}
                //墙体
		if (wall != null)
			wall.drawWall(imageG );
                //食物(金币)
		if (food != null)
			food.drawFood(imageG );
		
		
		
               //将接下来的图片加载到窗体画布上去,才能考到每次画的效果  
		 g.drawImage(image, 0, 0, null);
	}

其中最重要的是 super.paint(imageG );

这里必须先调用父类Frame的方法刷新屏幕清理上一次repaint画出的图像。

然后可以创建一个线程让程序每隔一段时间后自动调用repaint()方法;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数学 + 统计 + 脑科学 = 破解 AI “黑盒子” 的密匙?
AI 科技评论按:2019 年 5 月 9 日,由北京智源人工智能研究院主办的“智源论坛”在中关村国家自主创新示范区会议中心举行。“智源论坛”是一系列高水平人工智能技术分享活动,将定期邀请业内顶尖学者共同探讨前沿技术、分享经验。围绕当前人工智能所面临的可计算性、可解释性、泛化性和稳定性等基础问题,主办方从数学、统计和计算的角度,设立了人工智能的数理基础重大研究方向,本期论坛主题为“人工智能的数理基础”,由 15 名学者分为三天进行分享。AI 科技评论有幸受邀出席,将现场精华记录如下。
AI科技评论
2019/05/17
8360
数学 + 统计 + 脑科学 = 破解 AI “黑盒子” 的密匙?
机器学习算法地图
很多同学在学机器学习和深度学习的时候都有一个感受:所学的知识零散、不系统,缺乏整体感,这是普遍存在的一个问题。在这里,SIGAI对常用的机器学习和深度学习算法进行了总结,整理出它们之间的关系,以及每种算法的核心点,各种算法之间的比较。由此形成了一张算法地图,以帮助大家更好的理解和记忆这些算法。
SIGAI学习与实践平台
2018/07/05
1.4K1
机器学习算法地图
机器学习、深度学习、演化学习
机器学习是一门涉及统计学、系统辨识、逼近理论、神经网络、优化理论、计算机科学、脑科学等诸多领域的交叉学科,研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,是人工智能技术的核心。基于数据的机器学习是现代智能技术中的重要方法之一,研究从观测数据(样本)出发寻找规律,利用这些规律对未来数据或无法观测的数据进行预测。根据学习模式、学习方法以及算法的不同,机器学习存在不同的分类方法。
深度学习视觉
2022/03/10
7040
首发|机器学习未来十年:你需要把握的趋势和热点
CSDN 出品的《2018-2019 中国人工智能产业路线图》V2.0 版即将重磅面世!
AI科技大本营
2018/12/06
7650
Jupyter笔记本实现,慕尼黑工大220页免费书籍介绍基于物理的深度学习
机器之心报道 编辑:杜伟、陈萍 物理知识和深度学习已经成为了解决现实问题的绝佳组合,但如何更有效地将物理模型引入深度学习领域缺少一个全面的综述。慕尼黑工业大学计算机科学副教授 Nils Thuerey 团队编写的这本书籍对基于物理的深度学习展开了详尽的介绍。 书籍地址:https://arxiv.org/pdf/2109.05237.pdf 项目地址:https://github.com/thunil/Physics-Based-Deep-Learning 网站地址:https://www.physics
机器之心
2023/03/29
5960
Jupyter笔记本实现,慕尼黑工大220页免费书籍介绍基于物理的深度学习
谷歌大脑工程师Eric Jang 2017机器学习总结:从表达能力、训练难度和泛化能力讨论机器学习模型
【导读】谷歌大脑工程师Eric Jang在2017年11月20日发表一篇名为《Expressivity, Trainability, and Generalization in Machine Learning》的博客,本博客是对2017年度机器学习领域研究的一个很好的总结,作者探讨了机器学习中模型的三个最重要的问题:表达能力、训练难度和泛化能力,并利用这三个标准评价机器学习模型的贡献,并分别讨论了有监督学习、无监督学习和强化学习在这些方面的表现。相信你读完本文之后能对机器学习有更全面、更深刻的理解。专知内
WZEARW
2018/04/12
9260
谷歌大脑工程师Eric Jang 2017机器学习总结:从表达能力、训练难度和泛化能力讨论机器学习模型
数学与 AI「融通」 ,徐宗本院士进行超强“迁移学习”
9 月 21 日至 22 日,为期两天的 CCAI 2019 正在秋意浓浓的中国青岛胶州隆重举行。本次会议选址室外体育馆召开,为原本严肃的学术会议增添了几分活泼、惬意的色彩。
AI科技评论
2019/09/25
4470
数学与 AI「融通」 ,徐宗本院士进行超强“迁移学习”
基于Spark的机器学习实践 (一) - 初识机器学习
◆学习一个模型,使用的数据是没有被标记过的,自己默默地在学习隐含的特征,寻找模型与规律
JavaEdge
2019/04/08
1.1K0
机器学习-波澜壮阔40年
人工智能的再次兴起让机器学习(Machine Learning)这个名词进入了公众的视野,它成为当前解决很多人工智能问题的核心基石。
SIGAI学习与实践平台
2018/08/07
4150
机器学习-波澜壮阔40年
零基础程序员数学体系课
AI在可预见的多年内还将以爆发的态势增长,AI人才需求与日俱增,但普通程序员困于没有扎实的专业数学基础,局限在AI应用层开发,在进一步构建自己的AI模型、调参优化、处理数据并评估性能方面无法突破,甚至很多教程也基于有相关高等数学基础而设计,对于大部分毕业后再未接触过数学的开发人员有相当的难度,鉴于此本课程严选AI强关联数学干货,降低学习门槛、可视化呈现、数学与代码结合的程序员友好课程设计,广泛覆盖AI所必备的数学基础,旨在消除程序员在深入AI领域的数学屏障。
奔跑企鹅907340320
2025/04/15
950
机器学习中的最优化算法总结
对于几乎所有机器学习算法,无论是有监督学习、无监督学习,还是强化学习,最后一般都归结为求解最优化问题。因此,最优化方法在机器学习算法的推导与实现中占据中心地位。在这篇文章中,SIGAI将对机器学习中所使用的优化算法做一个全面的总结,并理清它们直接的脉络关系,帮你从全局的高度来理解这一部分知识。
SIGAI学习与实践平台
2018/09/29
3.2K0
机器学习中的最优化算法总结
Machine-Learning 机器学习
机器学习是人工智能的一个重要分支,旨在通过算法使计算机能够从数据中自动学习并做出预测。它结合了统计学、概率论、近似理论和复杂算法等多学科知识,利用计算机作为工具来模拟人类的学习方式。
用户11315985
2024/10/16
1810
Machine-Learning 机器学习
学界 | 不!机器学习才不只是统计学的美化!
题图上这张在社交媒体上疯狂传播的恶搞漫画博得了不少转发,这似乎暗示着,对机器学习的炒作热度开始消退。然而,机器学习真的只是被美化的统计学吗?
大数据文摘
2018/09/20
4070
学界 | 不!机器学习才不只是统计学的美化!
什么是机器学习?有哪些算法和分类?又有哪些应用?看完你就懂了
导读:本文从大数据的概念讲起,主要介绍机器学习的基础概念,以及机器学习的发展过程,用一个形象的例子讲解大数据生态中的机器学习,并按照传统机器学习(包括分类、聚类、回归、关联规则、协同过滤、数据降维等)、深度学习,以及其他机器学习(迁移学习、主动学习、演化学习)进行算法讲解。
IT阅读排行榜
2019/04/24
14K0
什么是机器学习?有哪些算法和分类?又有哪些应用?看完你就懂了
机器学习基础概括
机器学习(Machine Learning, ML)是人工智能(AI)的一项核心技术,它使得计算机通过数据学习,进而做出预测和决策,而不需要明确的编程规则。机器学习的目标是构建能够从数据中自动改进的算法,减少人为干预。机器学习的核心思想是:通过数据的不断积累与分析,机器可以模仿人类的学习过程,完成特定任务。
用户11292525
2025/04/01
1560
【机器学习基础】初探机器学习
  我们生活在一个人工智能的时代!生活中现在已随处可见人工智能技术的影子。在大学的食堂,学生把打好菜的托盘放到摄像头下面,机器就可以自动识别每个餐盘的形状来自动计算这顿饭的价格;而在校园的大部分电梯里,学生可以说例如“我要去3楼”,电梯则可以自动带学生去3楼,这在疫情期间更加方便卫生。或许对于“20后”的孩子们而言,智能就像能源一样从他们记事起就随处可见、随手可得,就像移动互联网之于“10后”一样。
Francek Chen
2025/01/23
830
【机器学习基础】初探机器学习
重磅报告 | 机器学习与物理科学(一)
机器学习包含用于大量数据处理任务的广泛算法和建模工具,这些已进入近年来最科学的学科。我们以选择性的方式回顾了有关机器学习与物理科学之间的交叉领域的最新研究。这包括以物理见解为动力的机器学习(ML)的概念性发展,机器学习技术在物理学中多个领域的应用以及这两个领域之间的交叉应用。在给出了机器学习方法和原理的基本概念之后,我们介绍了如何使用统计物理学来理解机器学习中的方法的例子。然后,我们将介绍机器学习方法在粒子物理学和宇宙学,量子多体物理学,量子计算以及化学和材料物理学中的应用。我们还将重点介绍旨在加速机器学习的新型计算体系结构的研究和开发。在每个部分中,我们都描述了最近的成功以及特定领域的方法和挑战。
数据科学人工智能
2022/03/31
1.1K0
通透!!机器学习、深度学习、人工智能的区别与联系!!
没有接触过机器学习的同学,往往对机器学习、深度学习、甚至是人工智能有着模糊的概念。
Python编程爱好者
2024/01/05
8140
通透!!机器学习、深度学习、人工智能的区别与联系!!
机器学习中的目标函数总结
几乎所有的机器学习算法最后都归结为求解最优化问题,以达到我们想让算法达到的目标。为了完成某一目标,需要构造出一个“目标函数”来,然后让该函数取极大值或极小值,从而得到机器学习算法的模型参数。如何构造出一个合理的目标函数,是建立机器学习算法的关键,一旦目标函数确定,接下来就是求解最优化问题,这在数学上一般有现成的方案。如果你对最优化算法感兴趣,可以阅读SIGAI之前的公众号文章“理解梯度下降法”,“理解牛顿法”,“理解凸优化”,“机器学习中的最优化算法总结”。本文的侧重点是对目标函数的构造进行总结。
SIGAI学习与实践平台
2018/09/17
2.9K0
机器学习中的目标函数总结
如何食用《机器学习》?
如果你没有学过机器学习的话,可能你并不能看懂这几张图,哎哎哎,别丢砖头鸡蛋啊…………
学弱猹
2021/08/09
6530
推荐阅读
相关推荐
数学 + 统计 + 脑科学 = 破解 AI “黑盒子” 的密匙?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验