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

警告:我在这里给出的技巧对于JavaFX Mobile的当前版本是正确的,该版本是JavaFX 1.1 SDK的一部分。 在将来的版本中,行为将改变,上述工件的当前不良性能将被优化或至少得到显着改善。 我在这里写的所有内容都是快照,不应理解为

最后!

项目3:使用简单的形状代替图像
第4项:使用小图像代替复杂形状

这两个项目似乎相互矛盾。 不幸的是,这里没有简单的答案:有时使用形状更好,有时使用图像更好。 为了帮助您做出正确的决定,以下是应考虑的几点:

  • 复杂性单个基本形状(例如矩形或圆形)几乎总是比图像更快。 但是,为了获得所需的工件而组装的形状数量越多,或者用户定义的路径越复杂,对这些形状进行的操作就越昂贵。 并且优势缩小。 重要说明:javafx.text.Text对象是一个非常复杂的形状。
  • 大小大多数图像操作的性能都是二次方的,这意味着如果宽度和高度加倍,则操作的速度变为4倍,如果将宽度和高度加倍,则操作的速度变为9倍,等等。因此,元素越大,使用形状越好。
  • 变换旋转或缩放不仅在使用形状时看起来更好,而且通常也比变换图像更快。 特别是如果旋转和缩放设置为动画,则形状会更好。
  • 启动时间加载图像和设置ImageView通常比设置形状要慢。
  • 足迹静态和动态的足迹几乎总是使用较高的图像时。

重要说明:运行时当前未使用javafx.scene.Node的变量缓存。 设置它没有区别!

现在我们将专注于图像加载

项目5:使用预缩放功能
如果图像需要缩放并且缩放比例以后没有更改,建议使用预缩放功能。 这可以通过设置Image对象的宽度和高度来完成,该对象将在加载图像时缩放图像。

使用预缩放有两个好处。 首先,它可以带来更好的性能。 如果使用预缩放,则缩放肯定只计算一次。 相反,每当ImageView对象的变换被其他东西(然后是平移)更改时,都会重新计算其缩放比例。 例如,更改旋转度将导致重新计算缩放比例。 其次,如果图像按比例缩小,则使用预缩放后,内存使用量将大大减少。
如果标志Image.smooth为false,则可以更快地计算缩放比例。 但是必须检查缩放图像的质量。


本示例为许多图像生成缩略图。 代码示例1使用ImageView的缩放功能创建了一系列缩略图。

def thumbnails = for (i in [0..11])ImageView {image: Image {url: "{__DIR__}images/img{i}.png"}preserveRatio: truefitWidth: 30fitHeight: 20}

代码示例1:在ImageView中缩放
如代码示例2所示,使用Image类的预缩放功能可以实现相同的效果。使用此方法显示缩略图通常更快,并且内存使用量要小得多。

def thumbnails = for (i in [0..11])ImageView {image: Image {url: "{__DIR__}images/img{i}.png"preserveRatio: truewidth: 30height: 20}}

代码示例2:使用图像进行预缩放

项目6:使用后台加载
Image类提供了一个很好的但容易被忽略的功能,可以在后台异步加载图像。 这不会提高运行时性能或减少应用程序的占用空间,但可以大大缩短启动时间。 要启用它,必须设置标志Image.backgroundLoading。 后台加载有两个后果,在实现过程中需要考虑这些后果。 如果应该在创建后不久显示加载在后台的图像,则必须检查下载进度。 否则,将首先显示空白图像。 另一个选择是将变量占位符设置为显示替代图像,直到完成实际图像的加载为止。 在下面的示例中使用了这种方法。

第二个结果是,在完全加载图像之前,不会设置图像的宽度和高度。 这可能会破坏任何布局,这取决于所用图像的大小。 同样,如果占位符图像和最终图像的大小相同,则可以使用占位符图像来克服这一问题。 或者可以手动设置宽度和高度,这会将图像预缩放为给定的大小。 最后一个选项是在图像加载完成后重新计算布局。


代码示例3从上方扩展了示例,以在后台加载缩略图并显示它们。 加载图像后,将显示一个占位符(logo.png),其大小与缩略图相同。 请注意,徽标未加载到背景中,以确保我们可以立即显示它。

def logo = Image {url: "{__DIR__}images/logo.png"}def thumbnails = for (i in [0..11])ImageView {image: Image {url: "{__DIR__}images/img{i}.png"preserveRatio: truewidth: 30height: 20backgroundLoading: trueplaceholder: logo}x: i mod 4 * 50 + 20y: ((i/4) as Integer) * 40 + 20}Stage {scene: Scene {content: thumbnails}}

代码示例3:在后台加载缩略图
在仿真器上,必须看起来非常接近才能注意到后台加载。 在真实设备上,加载图像通常需要更长的时间。 启用背景加载后,屏幕将快速显示,首先仅显示占位符,这些占位符被实际图像一个接一个地替换。 如果禁用了后台加载,则该应用程序将显示空白屏幕,直到完全加载并显示所有图像为止。

第7项:使用def而不是var定义变量。 使它们成为脚本专用。
在定义实例变量时,优良作法是尽可能限制可访问性。 同样,如果变量立即被初始化且之后没有重新分配,则应使用关键字def对其进行定义。 几乎所有绑定变量都是如此,因为绑定变量无法重新分配(不存在非绑定操作),并且通常在定义它们时就已经知道它们绑定的对象。

除了产生更清晰,更不易出错的代码外,遵循这些建议还可以提高性能。 我们可以提供给编译器的提示越多,它就越可以优化我们的代码。 让我们看一下代码示例1中的示例。

class Main {def i1: Integer = 0;var i2: Integer;public def i3: Integer = 0;public var i4: Integer;}

代码示例1:具有公共,私有def和var的示例脚本
代码示例1定义了一个具有四个成员i1,i2,i3和i4的小类。 变量i1和i2是专用脚本,i3和i4是公共变量; 变量i1和i3用def定义,i2和i4用var定义。 代码示例2显示了部分生成的Java代码。

class Main extends java.lang.Object implements Main$Intf,com.sun.javafx.runtime.FXObject{public int $Main$i1;public int $Main$i2;public int $i3;public final com.sun.javafx.runtime.location.IntVariable $i4;...}

代码示例2:从代码示例1生成的Java代码的一部分
生成的Java代码的显着之处在于,除i4之外的所有变量都变成了简单的整数。 只有变量i4被转换为IntVariable,因为它需要提供更多功能。 一个Int变量比IntVariable实例需要更少的内存并执行得更快。

条款8:使用整数代替数字
整数运算总是比浮点值运算快。 在通常没有台式计算机之类的数学协处理器的有限设备上,两者之间的差异是巨大的。 因此,最好在可能的情况下使用Integer。 JavaFX编译器的类型推断机制通常在确定变量的正确类型方面做得很好,但是如果有疑问,它将选择Number。 因此,应始终明确设置Integer变量的类型。

条款9:使用Sequence类的功能
软件包javafx.util中的Sequences类提供了大量用于处理序列的有用函数。 应该熟悉提供的功能并使用它们,而不要自己实现。 序列中的功能已经过全面测试,其性能至少要好于自己实现的性能。

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


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

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

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

相关文章

14软件工程第一次作业

你认为一些军事方面的软件系统采用什么样的开发模型比较合适? 我认为设计军事方面的软件采用螺旋式的开发模型比较好。因为螺旋模型减少了过多测试或者是测试不足所带来的风险,能够使软件在无法排除重大风险时有机会停止,减少损失。对于军事方…

波纹扩散_C4D_动画amp;RS波纹扩散效果J_014

C4D-效果扩散效果,Redshift混合冰材质;利用顶点贴图扩散效果制作,RS混合调用顶点贴图。视频教程时长22分钟。对象为可编辑对象才能用顶点贴图。冰结域的扩展是这个动画的重点,在这个模式下,权重会根据半径向外扩展&…

软件测试工程师简历项目经验怎么写?--9999个已成功入职的软件测试工程师真实简历

简历是我们求职的第一步,也是非常重要的一步。 青云叔叔看过太多简历,最快3秒就淘汰一份简历,因为其实我们每天要收到很多简历进行筛选,那么面试官其实也是会很快进行对简历进行判断的,如果你对简历写的一塌糊涂&…

【poj2464】树状数组

这道题。。太特么多细节了。。 题意:在平面直角坐标系中给你N个点,stan和ollie玩一个游戏,首先stan在竖直方向上画一条直线,该直线必须要过其中的某个点,然后ollie在水平方向上画一条直线,该直线的要求是要…

mkdir -p命令

如果要创建目录A并创建目录A的子目录B,没有用-p的情况下mkdir 逐个的创建目录(mkdir A && mkdir A/B); 如果用-p 可以直接创建2个目录 mkdir -p A/B(如果父目录A不存在就创建); 来自个人博客: http://www.xuexiyuan.cn/article/detail/182.html

Eclipse在过去十年中的主要成就

正如我所写的那样 ,Eclipse在11月庆祝了10年来的开源和社区。 Eclipse社区已经形成了许多里程碑 ,但是主要成就是什么? Eclipse为实际改变软件行业做了什么? 这是Eclipse的一些关键成就。 1.主导的Java IDE。 Eclipse最初是一个非…

azure git怎么使用_Azure(一)Azure Traffic Manager为我们的Web项目提供负载均衡

一,引言上一篇讲到我们将自己的Net Core Web 项目部署到 Azure 的 Web App 的一项 pass 服务,假如随着项目的日益增长的访问量,之前部署到单节点的应用可能无法保证其稳定性,可能会导致系统宕机等等问题,这个时候&…

hiho1257 Snake Carpet

题目链接:http://hihocoder.com/problemset/problem/1257 题目大意:有n条蛇 编号为1-n 每条蛇的长度跟编号相等 奇数编号的蛇必须拐奇数次(除了第一条)偶数编号的蛇必须拐偶数次(除了第二条)问能不能在这种…

POJ 3680_Intervals

题意: 给定区间和该区间对应的权值,挑选一些区间,求使得每个数都不被K个区间覆盖的最大权值和。 分析: 如果K1,即为区间图的最大权独立集问题。可以对区间所有端点排序后利用动态规划的方法,设dp[i]为只考虑…

MongoDB 数据类型查询——$type使用

在MongoDB中根据字段的数量类型来查询数据使用$type操作符来实现,具体使用法语:1db.集合名.find({$type:类型值}) //这里的类型值能使用Number也能使用alias举个例子:12db.person.find({address:{$type:2}}) //查询address字段数据…

Spring和JSF集成:MVC螺母和螺栓

过去,我曾尝试将JSF与Spring MVC集成在一起,尽管我的第一次尝试成功了,但这远非理想。 这次,我决定做出一些关键决定来帮助我集中精力: 向后兼容。 支持JSF 1.2涉及的工作太多,而Spring 3.1中出现了太多的好…

文字描边_如何在网页里实现文字描边效果

文字描边想要在网页里实现文本描边效果,在以前只能使用Photoshop等来实现,但现在只需要一个text-stroke属性,即可轻松做到文本描边,渐变文本描边,甚至图片文本描边。01语法text-stroke: text-stroke是一个复合属性&…

javascript数据结构-栈

github博客地址 栈(stack)又名堆栈,它是一种运算受限的线性表。遵循后进先出原则,像垃圾桶似的。功能实现依然按照增删改查来进行,内部数据存储可以借用语言原生支持的数组。 栈类 function Stack(){this.data []; }添…

MongoDB 字符串值长度条件查询

在实际项目中常常会有根据字段值长度大小进行限制查询,例如查询商品名称过长或过短的商品信息,具体的实现方式可能有多种,在此记录常见的两种实现使用 $where 查询(性能稍逊一些)12345//查询商品名称长度大于25个字符的…

虚拟化Java应用程序:最佳实践(JavaOne 2011)

贾斯汀穆雷(Justin Murray)早五分钟就开始了他的演讲[“虚拟化Java应用程序:最佳实践”(21860)],并说虚拟化已经到了人们不再需要担心利用虚拟化的地步。 他说他的演讲大约有一年的历史,是一个团…

linux里hba状态_Windows和Linux系统查看HBA卡wwn号的方法 | 系统之家官网

一、windows 系统在windows系统中,可以使用fc hba卡厂家提供的管理软件查看光纤适配器的wwn号码,具体如下:qlogic:sansurferemulex:hbanyware二、suse linux 9查看 /proc/scsi/qla2xxx/* ,并以 adapter-por…

”二柱子“个人项目

”二柱子“个人项目 关于二柱子的个人项目,据说……是这么发生的…… 二柱子因为懒(,,• ₃ •,,),要给他上小学的儿子编写个能够出小学四则运算题目的程序。老师上课的时候又添加了条件: 1、打印至少30道题 2、除了整数之外,还要…

phpstorm9 增加对.vue的支持

1、安装vue.js插件 2、设置javascript version为ECMAScript 6 3、 <script type"text/ecmascript-6"> </script>转载于:https://www.cnblogs.com/lobtao/articles/6044378.html

Eclipse中的集成Git插件删除线上远程分支

Eclipse 的忠实党,在使用Git 多人协作以分支的形式开发应用时分支合并到主干后往往再没什么用(我的做法是保留一两周再干掉),在此记录使用Eclipse的Git 插件来删除无用的分支。 操作步骤: 项目右键 — Team — Remote — Push — Next — Finesh 1,下拉框选择你要删除的远程分支…

mysql 查询系统_使用select和show命令查看mysql数据库系统信息

(1).select显示当前日期和时间mysql> select now();---------------------| now() |---------------------| 2019-06-05 13:46:20 |---------------------1 row in set (0.00 sec)显示当前日期mysql> select curdate();------------| curdate() |------------| 2019-06-0…