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.pswp.cn/news/373556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373556.shtml
英文地址,請注明出處:http://en.pswp.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…