javaone_JavaOne 2012:JavaFX图形技巧和窍门

javaone

我回到希尔顿(皇家宴会厅B)看了Richard Bair的(Oracle Java Client Architect)的“ 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 Bitmap中的浏览器快得多,而JavaFX Canvas是所有浏览器中最快的。 由于速度有限,GUIMark 2 Text测试无法为Windows提供有用的数据,但是JavaFX在Linux和Mac OS X上表现出色。Bair打算发布基准测试方法以供公众使用,他展示了一个图表,该图表表明从JavaFX 2.2到2000 JavaFX 8。

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

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

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

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

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

javaone

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

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

相关文章

php pdo 参数绑定,PDO预处理之参数绑定和列绑定

摘要:PDO查询中,2个绑定操作:参数绑定与列绑定;参数绑定:bindParm() 和 bindValue();bindParm(:占位符,变量,类型常量) 类型常量默认为字符串bindValue(:占位符,值或变量,类型常量) 如果直接传值,可省略类型…

自定义C++异常处理

例1&#xff1a;自定义一个继承自excepton的异常类myException C标准中&#xff0c;定义在<stdexcept>中的任何异常类都派生自exception Class&#xff0c;本例也只是简单地由exception继承&#xff0c;在try段抛出一个异常并捕捉。代码如下&#xff1a; /* test.cpp ve…

DCL并非单例模式专用

我相信大家都很熟悉DCL&#xff0c;对于缺少实践经验的程序开发人员来说&#xff0c;DCL的学习基本限制在单例模式&#xff0c;但我发现在高并发场景中会经常遇到需要用到DCL的场景&#xff0c;但并非用做单例模式&#xff0c;其实DCL的核心思想和CopyOnWrite很相似&#xff0c…

使用CLI扩展和重新平衡Couchbase集群

Couchbase通过多种方式提供高可用性和灾难恢复 &#xff1a; 同质簇 复写 集群内复制 备份还原 机架区意识 该博客将展示如何使用Couchbase命令行界面&#xff08;CLI&#xff09;创建Couchbase集群。 此外&#xff0c;还可以使用Couchbase REST API和Couchbase Web Consol…

将php源码修改成存在注入的源码,天融信关于ucms系统存在代码注入漏洞的分析...

一、背景介绍UCMS是一款简单的开源内容管理系统&#xff0c;可以非常方便的通过它来快速开发各种各种企业站、文章站、站群系统。系统兼容PHP5.2–PHP7.0&#xff0c;在APACHE、NGINX、IIS上都能使用&#xff0c;支持MySQL SQLite两种数据库。后台简洁高效&#xff0c;上手容易…

第1章 计算机系统漫游(深入理解计算机系统)

1 #include <stdio.h> 2 3 int main() 4 { 5 printf("hello, world\n"); 6 } 1.1 信息就是位上下文 hello程序的声明周期是从一个源程序开始的&#xff0c;即程序员利用编辑器创建并保存的文本文件&#xff0c;文件名是hello.c。源程序实际上就是一个由值…

java impliments,dubbo使用GenericService泛化调用

我们项目中常见场景&#xff0c;java应用内部接口都是使用dubbo&#xff0c;某个非java应用需要调用我们的接口的时候&#xff0c;无法使用dubbo&#xff0c;这是我们需要给它提供其他形式的接口&#xff0c;如restful api等等&#xff0c;这时我们需要为这个接口开发而增加额外…

使用Eclipse 创建 搭建SpringBoot项目

之前用IDEA 创建Springboot 项目感觉十分简单&#xff0c;但是常用的毕竟是Eclipse 所以开一个帖子记录一下Eclipse 如何创建 Springboot 项目 第一步&#xff1a;Help -> Eclipse Marketplace… 在search 中输入 STS install 即可&#xff01; 第二部&#xff1a;new -&g…

static函数与普通函数区别

全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式&#xff0c; 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序&#xff0c; 当一个源程序由多个源文件…

zendguard php5.4,ZendGuardLoader6.0.0支持PHP5.4.x系列

不知不觉&#xff0c;现在Zend Guard Loader发布了6.0.0版本&#xff0c;支持PHP 5.4.x系列。官方地址&#xff1a;http://www.zend.com/en/products/guard/downloads (需要注册用户后下载)这里提供下常用的版本Windows&#xff1a;附件&#xff1a;ZendGuardLoader-70429-PHP-…

camel mq_Camel:构建基于消息的应用程序

camel mq这是一篇长文章&#xff0c;包含三个单独的主题&#xff1a; Java的Apache Camel入门 使用CamelRunner改善路线的启动 使用Camel构建基于消息的应用程序 但是&#xff0c;由于我准备了包含所有这些材料的camel-demo-1.0.0-SNAPSHOT-project.zip &#xff0c;因此我认…

what??|诞生才一年的BCH竟面临硬分叉的抉择

BCH才刚过一周岁生日一个星期&#xff0c;BCH社区的主力之一Bitcoin ABC&#xff08;BCH全网接近三分之二节点运行的软件系统由Bitcoin ABC开发&#xff09;就搅动了社区的涟漪。8月8号&#xff0c;Bitcoin ABC公布了自己的路线图提出修改BCH的共识协议。而BCH社区的大V之一Cra…

改变div php,JS改变DIV样式

摘要&#xff1a;var boxwindow.οnlοadfunction(){box document.getElementById("box")}function aa(){box.style.height "400px"}function bb(){box.style.width "400px"}function cc(){box.style.backgroundColor "blue"}批改老…

switch变量的作用 域问题

&#xfeff;&#xfeff;switch是我们做条件选择时&#xff0c;经常用到的一个语句。一直以来对于他的使用相信大家也都是得心应手&#xff0c;前几天在linux下写一个c程序时遇到了这样的一个问题&#xff0c;请看例子&#xff1a;#include<iostream>using namespace st…

返回CompletableFuture:Java 8功能亮点

CompletableFuture与未来&#xff1a;与Java 8新功能保持异步 Java 8于2014年3月发布&#xff0c;并附带了许多新功能。 鲜为人知的&#xff0c;极为有用却被人误解的功能之一是对Future接口的全新改进&#xff0c;即扩展&#xff1a;CompletableFuture <T>。 在下面的…

php 操作 mysql 数据库常用方法集合

参考&#xff1a; https://www.runoob.com/php/php-pdo.html https://www.cnblogs.com/feng18/p/6523646.html https://blog.csdn.net/zuiliannvshen/article/details/78247244 转载于:https://www.cnblogs.com/gavinyyb/p/9543844.html

接口功能测试策略

由于平台服务器是通过接口来与客户端交互数据提供各种服务&#xff0c;因此服务器测试工作首先需要进行的是接口测试工作。测试人员需要通过服务器接口功能测试来确保接口功能实现正确&#xff0c;那么其他测试人员进行客户端与服务器结合的系统测试过程中&#xff0c;就能够排…

matlab中sort(d),MATLAB中排序函数sort()的用法

MATLAB中排序函数sort()可以对参数的元素进行升序排序或降序排序。具体的用法如下&#xff1a;Ysort(X)sort()的参数可以是向量&#xff0c;矩阵&#xff0c;数组等等。当X是向量时&#xff0c;sort(X)对X的元素进行升序排序&#xff1b;当X是矩阵时&#xff0c;sort(X)对X的每…

cin、cin.get()、cin.getline()、getline()、gets()函数的用法

1、cin>> 用法1&#xff1a;最基本&#xff0c;也是最常用的用法&#xff0c;输入一个数字&#xff1a; #include <iostream> using namespace std; main () { int a,b; cin>>a>>b; cout<<ab<<endl; } 输入&#xff1a;2[回车]3…

BootCDNApi使用记录

通过API获取BootCDN所加速的所有前端开源库的基本信息和文件列表 API 将一下API链接中的.min字样去掉后,获取到的JSON格式的返回信息是经过良好的格式化的,便于查看. 所有开源库简要信息列表 https://api.bootcdn.cn/libraries.min.json 该列表是一个json数组,数组中的每一个条…