JavaOne 2012:JavaFX图形技巧和窍门

我回到希尔顿(皇家宴会厅B)看了Richard Bair的(Oracle Java客户架构师)的“ JavaFX图形技巧和窍门”。 Bair与FX Experience相关联,并且显然了解JavaFX。

拜尔说,他演讲的主题是表演。 他告诫说,与大多数与性能相关的事情一样,请避免性能预先优化。 他有一个黄色的大警告屏幕,上面写着“写清楚的代码,然后再显示个人资料!”。 他说,他的演讲基于JavaFX 2.2,其中一些技巧可能不适用于JavaFX 8。

Bair为Windows,Linux和Mac OS X这三种不同的操作系统(未指定版本)上的几种浏览器提供了“ GUIMark 2 Vector”基准测试。Bair将JavaFX与这些浏览器的本机支持进行了比较。 他还指出,有时SceneGraph更快,有时Canvas更快。 Bair提出的许多观点在较小的设备上比在台式机上更为重要。

JavaFX比GUIMark 2位图中的浏览器快得多,而JavaFX Canvas是所有浏览器中最快的。 由于速度有限,GUIMark 2 Text测试无法为Windows提供有用的数据,但是JavaFX在Linux和Mac OS X上表现出色。Bair打算发布基准测试方法以供公众使用,他展示了一个图表,该图表表明从JavaFX 2.2到2007年的显着性能改进。 JavaFX 8。

拜尔的绩效准则#1是“少做点工作”。 Bair说:“更小的系统需要更激烈的性能调整。” 他补充说,“每行计数”和“额外的方法调用加起来”。 尽管在传统的桌面Java中,我们已经学会了不要担心方法调用的数量,但这在较小的设备上可能是个问题(“过多的内联非常昂贵”,而“过多的方法调用很昂贵”)。 Bair展示了如何使用局部final变量来减少方法调用的次数。 他承认这是台式机上的“绝对微性能预优化”,但对于较小的设备来说是一种有用的策略。

Bair说,“填充率”是“几乎100%确定性”的限制。 除非您有“成千上万的顶点”,否则几何率不太可能成为JavaFX中的重要限制。 CSS开销和布局计算一样都是可能的限制。 JavaFX进行了大量的缓存,而后者可能并不总是一个问题。 系统I / O很有可能会限制您,特别是在较小的设备上。

拜尔(Bair)展示了一个“滥用填充率”的示例,该方法首先绘制最远的背景,然后用另一填充绘制大部分。 他有一些避免这种不必要填充的观点,例如“只画变化了”。 Bair指出开发人员会在Swing中识别“脏区”,但是JavaFX SceneGraph会“自动执行此操作!” 他确实警告JavaFX Canvas要求开发人员识别“脏区”。

提高填充率的另一种方法是“限制使用(某些)效果”。 “效果在您的台式机系统上几乎是免费的,”但可能需要在较小的设备上更仔细地观察。 拜尔讨论了一项子弹,指出“限制使用非矩形,无轴对齐的夹子”是提高填充率的另一种策略。 直接剪切对齐的图像很快,但是抗锯齿,渲染为背景图像以及旋转未对齐的像素边界的过程会“花费更多”(但在大多数桌面应用程序中您不会注意到)。

Bair表示,减少透支是提高填充率的有效方法。 与减少透支有关,他讨论了使用“图像蒙皮”的问题。 Bair在这里还提到JavaFX 8包括自动区域纹理缓存。 减少透支的其他想法包括简化样式(Metro,Android),合并背景填充以及减少重叠节点的数量。

Bair表示,Microsoft故意在Metro中提出了易于绘制的样式。 同样,Android样式更快,更容易绘制。

“ 遮挡剔除”可以避免绘制(剔除)不可见的东西。” 这样做可以使我们“减少过度绘制并提高渲染性能”。 JavaFX引擎可以响应JavaFX CSS不透明的插图,以了解何时不重绘这些区域。

有一些CSS成本需要注意,例如解析样式表。 贝尔(Bair)展示了一个带有.parent:hover .child {...}的“ CSS Horror Show”幻灯片,并解释了为什么如此恐怖:每次将父项悬停时,都必须重新审视所有子项。 同样,如果有大量.parent .child {...}.parent .child {...}可能会很糟糕,因为“当我们遇到一个带有.child样式类的节点时,我们必须沿着整个场景图走动直到找到它。” 最好将搜索限制为直接父级。

Bair指出,setStyle CSS属性非常方便,但代价可能很高。 解析和其他支持会增加性能问题。 CSS提供了功能,灵活性和便利性,但这确实是以性能为代价的。

Bair的技巧之一是“避免对SceneGraph进行结构更改”。 从变更点开始的所有CSS必须重新计算。 除了重新应用CSS外,更改SceneGraph时还需要“结构完整性检查”。 JavaFX已经优化了toFront / toBack,因此请使用它们而不是删除并添加回来。

另一个Bair技巧是“使用FXCollections”。 他对此的第一句话说:“争取最小的通知开销。” 建议使用setAll而不是clear和addAll的子项目符号。 添加了另一个子项目,“避免多次添加呼叫”。

最好使用FXColections.sort(),因为它“发送”排列”更改事件。 这意味着JavaFX引擎知道更改了什么,因此仅重新计算该特定类型更改所需的内容。 这些“排列”由“单独的快速路径处理”。

Bair表示“ ListView快速起泡”,因为它“重用节点”并保持最小的更改。 Bair总结说,该幻灯片带有“重用ListView来满足您所有的虚拟化需求!”

Bair的“手动布局”技巧包括了Region的自定义扩展的想法。 他警告说,扩展Region时,几乎总是需要实现computePrefWidthcomputePrefHeight

Bair有一张幻灯片列出了处理布局时“ JavaFX会问”的问题。 这些问题是“您想要多大/多高?” 和“您可以调整大小吗?” 当尝试渲染布局时,JavaFX至少会问这些问题一次,有时甚至是问更多次。 定制的布局可以减少尝试的次数和提出的问题的数量。 “ JavaFX提出了很多问题”,并且“在布局期间每个节点都被问到了”。

拜尔有一个“重要提示!” 与“内容偏差”相关。 如果高度取决于宽度,则表示水平偏差。 如果宽度取决于高度,则表示您有偏见。 Bair表示“((contentBias = null)到目前为止是最快的”(所有计算出的高度和宽度首选项都将被缓存)。 内容偏差通常为null或水平。 内在错误是“内置布局实际上未很好地支持contentBias!= null”。

到目前为止,所有内容均已符合Bair的第一条规则(减少工作量)。 规则2现在为“了解您的设备”。 Bair展示了一张幻灯片,其中将功能强大的NVidia GForce GTX 690与功能较弱的NVidia GForce 310甚至更​​低的PowerVR SGX543MP3进行了比较。 Bair的观点当然是,“ JavaFX为您提供了一个开发平台和一套API,但是您可以使用和不能使用哪些API将取决于设备的固有性能特征。”

Bair对设备上的JavaFX有一些经验法则。 使用桌面应用程序处理2万到10万个节点。 500到1000个节点是嵌入式的最佳范围。 对于非常小的嵌入式设备,对于JavaFX应用程序,坚持使用100到200个节点。

Bair提供了另一个与缓存有关的技巧。 他谈到要缓存图表,因为然后将其仅绘制到图像一次,然后可以快速绘制到屏幕“数十亿次”。 但是,Bair警告说,“如果节点发生很大变化,则会适得其反”。 拜尔说,他经常将缓存设置为true,制作动画,然后再次将缓存设置为false。

旋转和缩放时可以将CacheHint设置为SPEED,以获得更好的性能。 如果您希望它在旋转时能重绘以提高准确性,则可以使用除SPEED之外的其他缓存提示。

JavaFX 8具有Pulse Logger( -Djavafx.pulseLogger=true系统属性),可以“打印出很多有关JavaFX引擎执行的废话”(很好的方式)。 在每个脉冲的基础上有很多提供的信息,包括脉冲数(自动递增的整数),脉冲持续时间以及自最后一个脉冲以来的时间。 该信息还包括线程详细信息和事件详细信息。 此数据使开发人员可以查看大部分时间。

Bair用相同的鲜黄色警告幻灯片结束了会议:编写干净代码,然后分析! 幻灯片还指出,“不要过度操作,否则您将陷入无法维护的困境。

参考: JavaOne 2012:来自JCG合作伙伴 Dustin Marx的JavaFX图形技巧和窍门,内容来自Inspired by Actual Events博客。


翻译自: https://www.javacodegeeks.com/2012/10/javaone-2012-javafx-graphics-tips-and.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web前端知识点1

1. input属于窗体元素,层级显示比flash、其它元素都高。请判断这句话的正确与否。 错误 层级显示优先级: frameset > 表单元素 > 非表单元素 在html中,帧元素(frameset)的优先级最高,表单元素比非表单元素的优…

java单元测试算初级_Java____Eclipse下JUnit单元测试(初级)

给大家分享一个链接希望对你们有帮助 http://blog.csdn.net/huangbiao86/article/details/6709742今天看图片命名唯一的策略时看到有个大大用JUnit测试,神奇的样子,遂上网搜集来三篇JUnit测试的入门文章,作为参考。原作地址在上面&#xff0c…

有没有更好的Marker方法?

自Java 1.5推出以来,就是否在Java中使用Marker接口进行了广泛的讨论和辩论。 这是因为Java 1.5引入了注释功能,这些功能几乎可以解决Marker接口的目的。 本文将涵盖这场辩论的一个有趣的部分。 定义: Java中的标记接口是一个空接口&#xff…

php jquery ajax登录,jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)

弹出层主要用于展示丰富的页面信息,还有一个更好的应用是弹出表单层丰富交互应用。常见的应用有弹出登录表单层,用户提交登录信息,后台验证登录成功后,弹出层消失,主页面局部刷新用户信息。本文我们将给大家介绍如何使…

# 20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践+myod

20155337 2017-2018-1 《信息安全系统设计基础》第二周课堂实践myod 因为在课上已经提交了四个实验,还欠缺最后一个实验,反省一下自己还是操作不熟练,平时在课下应该多多练习linux的命令训练。 实践一 每个* .c一个文件,每个*.h一…

CometD:Java Web应用程序的Facebook类似聊天

聊天就像吃一块蛋糕或喝一杯热咖啡一样容易。 您是否曾经考虑过自己开发聊天程序? 您知道,聊天不容易。 但是,如果您是开发人员,并且阅读了本文的结尾,则可以尝试自己开发一个聊天应用程序,并允许您的用户通…

怎么用PHP建立购物网站,如何使用PHP建设一个购物网站

本系统以PHP为主要制作工具,实现了用户注册、登录、验证身份及用户数据的采集、物品的预览查询、搜索/查看物品信息,站内最新物品信息发布,可进入在线下单从而实现了网络销售。网上购物,这个逐渐流行于二十世纪的购物方式已经为越…

团队作业2——需求分析原型设计

需求分析: 软件的最终目的是用来解决用户的某些问题,需求分析就是要理解要解决的问题,真正明确用户需求。请发表一篇随笔,完成初步的需求分析: 1.访问软件项目的真实用户(至少10个),…

给div命名,使逻辑更加清晰

我们把一些标签放进<div>里&#xff0c;划分出一个独立的逻辑部分。为了使逻辑更加清晰&#xff0c;我们可以为这一个独立的逻辑部分设置一个名称&#xff0c;用id属性来为<div>提供唯一的名称&#xff0c;这个就像我们每个人都有一个身份证号&#xff0c;这个身份…

css边框颜色渐变

在实际开发中&#xff0c;我们经常遇见边框需要背景渐变的实现要求&#xff0c;那么如何去实现呢&#xff0c;今天给大家分享依稀几种情况 1.直角的背景渐变 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta…

170406、用uid分库,uname(用户名)上的查询怎么办

【缘起】 用户中心是几乎每一个公司必备的基础服务&#xff0c;用户注册、登录、信息查询与修改都离不开用户中心。 当数据量越来越大时&#xff0c;需要多用户中心进行水平切分。最常见的水平切分方式&#xff0c;按照uid取模分库&#xff1a; 通过uid取模&#xff0c;将数据分…

bzoj2144: 跳跳棋(二分/倍增)

思维好题&#xff01; 可以发现如果中间的点要跳到两边有两种情况&#xff0c;两边的点要跳到中间最多只有一种情况。 我们用一个节点表示一种状态&#xff0c;那么两边跳到中间的状态就是当前点的父亲&#xff0c;中间的点跳到两边的状态就是这个点的两个儿子&#xff0c;从而…

电脑投屏软件哪个好_目前当贝市场中投屏软件哪个好,最全面投屏技巧盘点

现在不管是在家里还是公司里&#xff0c;为了看一些是视频和资料&#xff0c;投屏到电视上是一件非常必要的事情&#xff0c;但是现在投屏的技巧各种各样&#xff0c;投屏的软件也是五花八门&#xff0c;小编平常也是经常投屏&#xff0c;也试过非常多的方法&#xff0c;这边分…

从零开始的全栈工程师——html篇1.2

起名方式与CSS 一.起名方式(起名方式也叫选择器) 起名的目的是为了给标签添加属性 常见的3种选择器有 标签选择器 id选择器(使用的时候加#) class选择器(使用的时候加.) 样式的要求是由选择器的权重来决定的 标签的权重为1 class的权重是10 id的权重是100 权重是可…

Spring:设置日志依赖项

这篇文章描述了如何在Spring中设置日志依赖。 它基于Dave Syer的帖子中提供的信息 。 这里提供有关Java日志记录框架的提醒。 该代码示例可在GitHub的Spring-Logging-Dependencies目录中找到。 Spring使用Jakarta Commons Logging API&#xff08;JCL&#xff09;。 不幸的是&…

安卓app开发工具_怎么开发app软件需要多少钱?主流app开发工具盘点

现在智能手机的快速普及让手机app在生活中越来越重要&#xff0c;很多企业及创业者也意识到了app的重要性&#xff0c;但是怎么开发app软件&#xff1f;有哪些主流app开发工具呢&#xff1f;这里就为大家分享一下如何快速开发app软件。一、编程app开发工具主要针对专业的程序员…

大话设计模式读书笔记(十一) 观察者模式

观察者模式&#xff1a; 书中通过小菜描述同事在公司看股票行情&#xff0c;并请求前台帮忙在老板回来时提醒同事&#xff0c;引出需求。将前台通知同事老板回来的事写成程序。未用模式实现&#xff1a; 1 //前台类2 public class Secretary {3 private List<StockObser…

解决高度塌陷

<!DOCTYPE html> <html lang"en" dir"ltr"><head><meta charset"utf-8"><title>高度塌陷解决</title><style media"screen">.box1{border: 10px #bfc993 solid;}.box2{width: 100px;height…

IBM AIX:Java进程大小监视

本文将为您提供有关如何计算在IBM AIX 5.3 OS上运行的Java VM进程的Java进程大小内存占用量的快速参考指南。 这是我关于该主题的原始文章的补充文章&#xff1a; 如何在AIX上监视Java本机内存 。 我强烈建议所有参与生产支持或AIX上部署Java应用程序开发的人员阅读此书。 为…

pstate0 vid数值意义_天体运动的简单数值计算

&#xff08;建议阅读全文&#xff09; 预备知识 万有引力&#xff0c; 弹簧振子受迫运动的简单数值计算    下面我们来用一种极其简单的算法对单个天体在中心天体的万有引力作用下的运动进行数值计算&#xff0e; 事实上该问题存在解析解&#xff08;见开普勒三定律&#x…