JavaFX移动应用程序最佳实践,第1部分

到现在为止,所有对JavaFX感兴趣的人都会知道,JavaFX Mobile发行了不久
前。 可以肯定的是,这真是令人难以置信。 我感到筋疲力尽,在发行期间我什至没有精力去写博客……

但是到目前为止,我感到很恢复,并且希望开始一些有关在准备发行版时所学到的经验的系列文章,并提供一些如何提高JavaFX Mobile应用程序性能的提示。

警告 :我在这里给出的提示适用于JavaFX Mobile的当前版本,该版本是JavaFX 1.1 SDK的一部分。 在以后的版本中,行为会改变,
当前提到的工件的不良性能将被优化或至少得到显着改善。 我在这里写的所有内容都是快照,不应理解为 最后!

项目1:避免不必要的绑定
绑定非常方便,毫无疑问是JavaFX Script中最有价值的创新之一。 不幸的是,它们带有代价。 生成的样板代码通常不那么小,并且 就像手动执行一样快。 尤其是复杂的依存关系结构往往会严重影响性能和占用空间。

因此,建议尽可能避免绑定。 通常,可以使用触发器来实现相同的功能。 人们不应该使用绑定来避免处理初始化顺序的麻烦。 绑定一个常数当然没有任何意义。
如果绑定变量的更新次数更多,然后读取,则懒惰的绑定在大多数情况下(但并非总是如此!)会更快(但并非总是如此!),但它们仍不如手动实现的速度快。


一个常见的用例是位置和大小取决于阶段大小的多个节点。 一个典型的实现使用绑定来实现这一点。 在这里,我们将看一个类似于这种情况的简单示例。 场景由三个矩形组成,这些矩形从左上角到右下角倾斜排列。 矩形的大小是屏幕大小的四分之一。 代码示例1显示了具有绑定的实现。

def rectangleWidth: Number = bind stage.width * 0.25;def rectangleHeight: Number = bind stage.height * 0.25;def stage: Stage = Stage {scene: Scene {content: for (i in [0..2])Rectangle {x: bind stage.width * (0.125 + 0.25*i)y: bind stage.height * (0.125 + 0.25*i)width: bind rectangleWidthheight: bind rectangleHeight}}}

代码示例1:使用绑定计算的布局
人们应该考虑的第一个问题是绑定是否真的必要。 在实际的设备上,仅当切换屏幕方向时(前提是设备支持此功能),屏幕大小才会更改。 如果我们的应用程序不支持屏幕旋转,则可以将布局定义为常量。 代码示例2中显示了一种减少绑定数量的可能解决方案。引入了两个变量width和height,分别绑定到stage.width和stage.height。 它们的唯一目的是为stage.width和stage.height提供触发器,因为我们不想覆盖原始触发器。 矩形的位置和大小是在触发器中手动计算的。

def r = for (i in [0..2]) Rectangle {}def stage = Stage {scene: Scene {content: r}}def height = bind stage.height on replace {def rectangleHeight = height * 0.25;for (i in [0..2]) {r[i].height = rectangleHeight;r[i].y = height * (0.125 + 0.25*i)}}def width = bind stage.width on replace {def rectangleWidth = width * 0.25;for (i in [0..2]) {r[i].width = rectangleWidth;r[i].x = width * (0.125 + 0.25*i)}}

代码示例2:在触发器中计算的布局
毫无疑问,代码示例1中的代码更加优雅。 但是测量模拟器中两个代码片段的性能后,结果发现代码示例2中的代码几乎快了一倍。

在下面的内容中,我们将介绍提高JavaFX Mobile应用程序性能的第二个技巧。 我认为这和上一个是最重要的。

警告 :我在这里给出的提示适用于JavaFX Mobile的当前版本,该版本是JavaFX 1.1 SDK的一部分。 在以后的版本中,行为会改变,
当前提到的工件的不良性能将被优化或至少得到显着改善。 我在这里写的所有内容都是快照,不应理解为 最后!

第2项:使场景图尽可能小
在运行时的幕后,进行了大量通信以更新场景图中节点的变量。 场景图包含的元素越多,需要的交流越多。 因此,使场景图尽可能小至关重要。 尤其是动画往往会遭受大型场景图的困扰。 不好的做法是始终将节点保留在场景图中,并通过可见标志或不透明度控制其可见性。 场景图中的不可见节点仍然是背景通讯马戏的一部分。 相反,应该从场景图中删除节点并仅在需要时添加它们。 但是这种方法有一个缺点。 添加或删除节点比设置可见性花费的时间更长。 因此,在紧急响应至关重要的情况下,这可能不合适。

例子1
通常一个人有一组节点,其中只有一个可见。 例如,这些可以是不同的页面,也可以是可视化元素不同状态的节点。 可能会尝试将所有节点添加到场景图中,并仅将当前节点设置为可见。

代码示例1显示了此方法的简化版本。 创建三个彩色圆圈以可视化某种状态(红色,黄色,绿色)。 随时仅可见一个节点。 (让我们忽略一秒钟,这可以简单地通过更改单个圆圈的填充颜色来实现。在现实应用中,可能会有图像或更复杂的形状用于可视化,而仅仅改变颜色是行不通的。)

def colors = [Color.GREEN, Color.YELLOW, Color.RED];var state: Integer;Stage {scene: Scene {content: for (i in [0..2])Circle {centerX: 10centerY: 10radius: 10fill: colors[i]visible: bind state == i}}}

代码示例1:使用可见性在节点之间切换
尽管只显示了一个节点,但这会在场景图中产生三个节点。 应该对其进行重构,以确保场景图中只有可见节点。 代码示例2显示了一种可能的实现。

def colors = [Color.GREEN, Color.YELLOW, Color.RED];var state: Integer on replace oldValue {insert nodes[state] into stage.scene.content;delete nodes[oldValue] from stage.scene.content;}def nodes = for (i in [0..2])Circle {centerX: 10centerY: 10radius: 10fill: colors[i]}def stage = Stage {scene: Scene{}}

代码示例2:在需要时添加和删除节点
代码示例1中的代码更加紧凑,但是代码示例2将场景图中的节点数从3个减少到1个。 在调整JavaFX Mobile版本的一些演示时,我们仅通过确保仅可见节点参与其中就可以将场景图中的节点数量减少50%或更多。

例子2
如果使用某种动画显示和隐藏节点,则在场景图中添加和删除节点将变得非常简单。 一个人只需要在fadeIn-animation的开头和fadeOut-animation的结尾执行一个动作即可添加或删除该节点。 代码示例3显示了这种用法,其中通过更改不透明度来显示和隐藏一个简单的消息框。

def msgBox = Group {opacity: 0.0content: [Rectangle {width: 150, height: 40, fill: Color.GREY},Text {x: 20, y: 20, content: "Hello World!"}]}def fadeIn = Timeline {keyFrames: [KeyFrame {action: function() {insert msgBox into stage.scene.content}},at (1s) {msgBox.opacity => 1.0 tween Interpolator.LINEAR}]}def fadeOut = Timeline {keyFrames: KeyFrame {time: 1svalues: msgBox.opacity => 0.0 tween Interpolator.LINEARaction: function() {delete msgBox from stage.scene.content}}}def stage = Stage {scene: Scene{}}

代码示例3:使用fadeIn-和fadeOut-animations添加和删除节点。

参考:来自JCG合作伙伴的 JavaFX Mobile应用程序最佳实践和JavaFX Mobile应用程序 最佳实践2   迈克博客(Mike's Blog)上的迈克尔·海因里希(Michael Heinrichs)。


翻译自: https://www.javacodegeeks.com/2012/03/best-practices-for-javafx-mobile.html

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

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

相关文章

Spark程序运行报错解决(1)

报错内容:System memory 259522560 must be at least 4.718592E8. Please use a larger heap size. 解决:Window——Preference——Java——Installed JREs——选中一个Jre 后 Edit 在Default VM arguments 里加入:-Xmx512M 转载于:https://w…

java setsolinger_java socket 的参数选项解读(转)

在MulticastSocket的源代码里有设置多播的方法:public void setInterface(InetAddress inf) throwsSocketException {if(isClosed()) {throw new SocketException("Socket is closed");}checkAddress(inf, "setInterface");synchronized(infLoc…

【转】Linux终端下 dstat 监控工具

转自https://linux.cn/article-3215-1.html dstat 是一个可以取代vmstat,iostat,netstat和ifstat这些命令的多功能产品。dstat克服了这些命令的局限并增加了一些另外的功能,增加了监控项,也变得更灵活了。dstat可以很方便监控系统…

Tomcat和IntelliJ –在webapps文件夹之外部署war文件

目前,我正在开发一个Android应用程序,该应用程序需要云中托管的大量REST服务来支持。 我基于对Java,Groovy以及最重要的Spring的支持选择了Google App Engine 。 我开发了一个基于Spring MVC的REST应用程序,并使用ContentNegotiat…

[HDU1232] 畅通工程 (并查集 or 连通分量)

Input 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数&#xff0c;分别是城镇数目N ( < 1000 )和道路数目M&#xff1b;随后的M行对应M条道路&#xff0c;每行给出一对正整数&#xff0c;分别是该条道路直接连通的两个城镇的编号。为简单起见&#xff0c;城镇…

java jdbc连接db2数据库_Java连接db2数据库(常用数据库连接五)

1.安装好db2数据库&#xff0c;并建立表如下&#xff1a;2.eclipse或myeclipse中建立工程并导入java连接db2所需要的jar包db2java.jar 下载地址&#xff1a;http://download.csdn.net/detail/whzhaochao/64149813.建立iConn接口&#xff0c;代码如下&#xff1a;package com.zh…

在Windows上,迁移VisualSVN server

最近在搭建自动化测试框架&#xff0c;顺便了解了一下SVN的搭建。对于一般的使用场景&#xff0c;VisualSVN还是挺方便的&#xff0c;而且上手特别快。 由于是第一个demo&#xff0c;后期要迁移到其他服务器上面&#xff0c;所以就熟悉了一下server的迁移。以下是一些记录信息&…

练习脚本三:日志清除

日志清除 #!/bin/bash #清除日志脚本&#xff0c;版本2 LOG_DIR/var/logROOT_UID0 #$UID为0的时候&#xff0c;用户才具有root用户的权限#判断是否使用root用户来运行 if [ "$UID" -ne "$ROOT_UID" ];thenecho "Must be root to run this script.&qu…

Oracle通过邀请Weaver和Chin推动JavaFX向前发展

我昨天发布了愚人节帖子&#xff0c;内容涉及加入NASA协助探索红色大行星。 那个帖子与事实相距不远... NASA开发的技术的所有细节都是100&#xff05;准确的。 哎呀&#xff0c;即使我辞职也是事实&#xff01; 唯一不正确的部分是我将加入的公司。 在NASA协助探索火星的工作也…

java privilege的用法_java反射--注解的定义与运用以及权限拦截

自定义注解类编写的一些规则:1. Annotation型定义为interface, 所有的Annotation会自动继承java.lang.Annotation这一接口,并且不能再去继承别的类或是接口.2. 参数成员只能用public或默认(default)这两个访问权修饰3. 参数成员只能用基本类型byte,short,char,int,long,float,d…

WinForm------TextEdit只能输入数字

代码: this.textEdit1.Properties.Mask.EditMask "\d"; this.textEdit1.Properties.Mask.MaskType MaskType.RegEx; 转载于:https://www.cnblogs.com/tianhengblogs/p/6093634.html

mysql使用随笔

mysql 删除语句 &#xff1a;delete from 表名 where 条件; 例如 delete from tbuserinfo where id 2;mysql 查询语句 &#xff1a;select * 列名 from 表名 where 条件;mysql 模糊查询 &#xff1a; SELECT * FROM 表名 WHERE 列名 LIKE "3%&qu…

JavaFX:创建Sprite动画

到目前为止&#xff0c;尽管我的大多数文章都涉及JavaFX属性和绑定&#xff0c;但今天我想写一讲我也致力于JavaFX运行时的另一部分&#xff1a;动画API。 在本文中&#xff0c;我将解释如何在JavaFX中编写自定义动画&#xff0c;以及如何使用这种方法为Sprite动画创建类。 &am…

java tick_Java中的Clock tick()方法

可以使用tick()Java中Clock类中的方法在所需的时间范围内舍入基本时钟的瞬间。此方法需要两个参数&#xff0c;即基本时钟和滴答的持续时间。同样&#xff0c;返回在所需持续时间内四舍五入的基本时钟时刻。演示此的程序如下所示-示例import java.time.*;public class Main {pu…

JAVA 常用框架和工具

集成开发工具&#xff08;IDE&#xff09;&#xff1a;Eclipse、MyEclipse、Spring Tool Suite&#xff08;STS&#xff09;、Intellij IDEA、NetBeans、JBuilder、JCreator JAVA服务器&#xff1a;tomcat、jboss、websphere、weblogic、resin、jetty、apusic、apache 负载均衡…

MySQL Doublewrite Buffer及业务评估

1. 关于Doublewrite Buffe的总结 Doublewrite Buffer&#xff1a;Doublewrite Buffer出现的初衷是防止buffer pool中的脏页刷新到磁盘中&#xff0c;出现部分写的问题&#xff0c;innodb页大小一般为16k&#xff0c;而Linux操作系统的block size一般为4k。这样在刷新的过程中&a…

使用UIBinder的GWT自定义按钮

这是一个有关如何在GWT上使用UIBinder创建自定义按钮的示例。 public class GwtUIBinderButton implements EntryPoint {public void onModuleLoad() {Button button new Button();button.setText("Button");button.addClickHandler(new ClickHandler(){Overridepub…

delete postman 传参_PostMan 传参boolean 类型,接口接受的值一直是false

情形&#xff1a;最近写前台页面的一个按钮&#xff0c;功能是&#xff1a;点击后切换状态&#xff0c;显示是或否。字段名称是isTest,类型是boolean 。写完接口&#xff0c;拿postMan测试&#xff0c;传参如下&#xff1a;但是后台接口接受的数据 一直是false,处理&#xff1a…

前端学PHP之文件操作

前端学PHP之文件操作 前面的话 在程序运行时&#xff0c;程序本身和数据一般都存在内存中&#xff0c;当程序运行结束后&#xff0c;存放在内存中的数据被释放。如果需要长期保存程序运行所需的原始数据&#xff0c;或程序运行产生的结果&#xff0c;就需要把数据存储在文件或数…

腾讯云CentOS6.5下安装mysql,并配置好远程访问等权限,途中遇到的问题

1.使用yum命令安装mysql [rootbogon ~]# yum -y install mysql-server 2.设置开机启动 [rootbogon ~]# chkconfig mysqld on 3.启动MySQL服务 [rootbogon ~]# service mysqld start 4.设置MySQL的root用户设置密码 [rootbogon ~]# mysql -u root mysql> select u…