JavaFX移动应用程序最佳实践,第2部分
最后!
項(xiàng)目3:使用簡(jiǎn)單的形狀代替圖像
第4項(xiàng):使用小圖像代替復(fù)雜形狀
這兩個(gè)項(xiàng)目似乎相互矛盾。 不幸的是,這里沒(méi)有簡(jiǎn)單的答案:有時(shí)使用形狀更好,有時(shí)使用圖像更好。 為了幫助您做出正確的決定,以下是應(yīng)考慮的幾點(diǎn):
- 復(fù)雜性單個(gè)基本形狀(例如矩形或圓形)幾乎總是比圖像更快。 但是,為了獲得所需的工件而組裝的形狀數(shù)量越多,或者用戶定義的路徑越復(fù)雜,對(duì)這些形狀進(jìn)行的操作就越昂貴。 并且優(yōu)勢(shì)縮小。 重要說(shuō)明:javafx.text.Text對(duì)象是一個(gè)非常復(fù)雜的形狀。
- 大小大多數(shù)圖像操作的性能都是二次方的,這意味著如果寬度和高度加倍,則操作的速度變?yōu)?倍,如果將寬度和高度加倍,則操作的速度變?yōu)?倍,等等。因此,元素越大,使用形狀越好。
- 變換旋轉(zhuǎn)或縮放不僅在使用形狀時(shí)看起來(lái)更好,而且通常也比變換圖像更快。 特別是如果旋轉(zhuǎn)和縮放設(shè)置為動(dòng)畫(huà),則形狀會(huì)更好。
- 啟動(dòng)時(shí)間加載圖像和設(shè)置ImageView通常比設(shè)置形狀要慢。
- 足跡靜態(tài)和動(dòng)態(tài)的足跡幾乎總是使用較高的圖像時(shí)。
重要說(shuō)明:運(yùn)行時(shí)當(dāng)前未使用javafx.scene.Node的變量緩存。 設(shè)置它沒(méi)有區(qū)別!
現(xiàn)在我們將專注于圖像加載
項(xiàng)目5:使用預(yù)縮放功能
如果圖像需要縮放并且縮放比例以后沒(méi)有更改,建議使用預(yù)縮放功能。 這可以通過(guò)設(shè)置Image對(duì)象的寬度和高度來(lái)完成,該對(duì)象將在加載圖像時(shí)縮放圖像。
使用預(yù)縮放有兩個(gè)好處。 首先,它可以帶來(lái)更好的性能。 如果使用預(yù)縮放,則縮放肯定只計(jì)算一次。 相反,每當(dāng)ImageView對(duì)象的變換被其他東西(然后是平移)更改時(shí),都會(huì)重新計(jì)算其縮放比例。 例如,更改旋轉(zhuǎn)度將導(dǎo)致重新計(jì)算縮放比例。 其次,如果圖像按比例縮小,則使用預(yù)縮放后,內(nèi)存使用量將大大減少。
如果標(biāo)志Image.smooth為false,則可以更快地計(jì)算縮放比例。 但是必須檢查縮放圖像的質(zhì)量。
例
本示例為許多圖像生成縮略圖。 代碼示例1使用ImageView的縮放功能創(chuàng)建了一系列縮略圖。
代碼示例1:在ImageView中縮放
如代碼示例2所示,使用Image類的預(yù)縮放功能可以實(shí)現(xiàn)相同的效果。使用此方法顯示縮略圖通常更快,并且內(nèi)存使用量要小得多。
代碼示例2:使用圖像進(jìn)行預(yù)縮放
項(xiàng)目6:使用后臺(tái)加載
Image類提供了一個(gè)很好的但容易被忽略的功能,可以在后臺(tái)異步加載圖像。 這不會(huì)提高運(yùn)行時(shí)性能或減少應(yīng)用程序的占用空間,但可以大大縮短啟動(dòng)時(shí)間。 要啟用它,必須設(shè)置標(biāo)志Image.backgroundLoading。 后臺(tái)加載有兩個(gè)后果,在實(shí)現(xiàn)過(guò)程中需要考慮這些后果。 如果應(yīng)該在創(chuàng)建后不久顯示加載在后臺(tái)的圖像,則必須檢查下載進(jìn)度。 否則,將首先顯示空白圖像。 另一個(gè)選擇是將變量占位符設(shè)置為顯示替代圖像,直到完成實(shí)際圖像的加載為止。 在下面的示例中使用了這種方法。
第二個(gè)結(jié)果是,在完全加載圖像之前,不會(huì)設(shè)置圖像的寬度和高度。 這可能會(huì)破壞任何布局,這取決于所用圖像的大小。 同樣,如果占位符圖像和最終圖像的大小相同,則可以使用占位符圖像來(lái)克服這一問(wèn)題。 或者可以手動(dòng)設(shè)置寬度和高度,這會(huì)將圖像預(yù)縮放為給定的大小。 最后一個(gè)選項(xiàng)是在圖像加載完成后重新計(jì)算布局。
例
代碼示例3從上方擴(kuò)展了示例,以在后臺(tái)加載縮略圖并顯示它們。 加載圖像后,將顯示一個(gè)占位符(logo.png),其大小與縮略圖相同。 請(qǐng)注意,徽標(biāo)未加載到背景中,以確保我們可以立即顯示它。
代碼示例3:在后臺(tái)加載縮略圖
在仿真器上,必須看起來(lái)非常接近才能注意到后臺(tái)加載。 在真實(shí)設(shè)備上,加載圖像通常需要更長(zhǎng)的時(shí)間。 啟用背景加載后,屏幕將快速顯示,首先僅顯示占位符,這些占位符被實(shí)際圖像一個(gè)接一個(gè)地替換。 如果禁用了后臺(tái)加載,則該應(yīng)用程序?qū)@示空白屏幕,直到完全加載并顯示所有圖像為止。
第7項(xiàng):使用def而不是var定義變量。 使它們成為腳本專用。
在定義實(shí)例變量時(shí),優(yōu)良作法是盡可能限制可訪問(wèn)性。 同樣,如果變量立即被初始化且之后沒(méi)有重新分配,則應(yīng)使用關(guān)鍵字def對(duì)其進(jìn)行定義。 幾乎所有綁定變量都是如此,因?yàn)榻壎ㄗ兞繜o(wú)法重新分配(不存在非綁定操作),并且通常在定義它們時(shí)就已經(jīng)知道它們綁定的對(duì)象。
除了產(chǎn)生更清晰,更不易出錯(cuò)的代碼外,遵循這些建議還可以提高性能。 我們可以提供給編譯器的提示越多,它就越可以優(yōu)化我們的代碼。 讓我們看一下代碼示例1中的示例。
class Main {def i1: Integer = 0;var i2: Integer;public def i3: Integer = 0;public var i4: Integer;} 代碼示例1:具有公共,私有def和var的示例腳本
代碼示例1定義了一個(gè)具有四個(gè)成員i1,i2,i3和i4的小類。 變量i1和i2是專用腳本,i3和i4是公共變量; 變量i1和i3用def定義,i2和i4用var定義。 代碼示例2顯示了部分生成的Java代碼。
代碼示例2:從代碼示例1生成的Java代碼的一部分
生成的Java代碼的顯著之處在于,除i4之外的所有變量都變成了簡(jiǎn)單的整數(shù)。 只有變量i4被轉(zhuǎn)換為IntVariable,因?yàn)樗枰峁└喙δ堋?一個(gè)Int變量比IntVariable實(shí)例需要更少的內(nèi)存并執(zhí)行得更快。
條款8:使用整數(shù)代替數(shù)字
整數(shù)運(yùn)算總是比浮點(diǎn)值運(yùn)算快。 在通常沒(méi)有臺(tái)式計(jì)算機(jī)之類的數(shù)學(xué)協(xié)處理器的有限設(shè)備上,兩者之間的差異是巨大的。 因此,最好在可能的情況下使用Integer。 JavaFX編譯器的類型推斷機(jī)制通常在確定變量的正確類型方面做得很好,但是如果有疑問(wèn),它將選擇Number。 因此,應(yīng)始終明確設(shè)置Integer變量的類型。
條款9:使用Sequence類的功能
軟件包javafx.util中的Sequences類提供了大量用于處理序列的有用函數(shù)。 應(yīng)該熟悉提供的功能并使用它們,而不要自己實(shí)現(xiàn)。 序列中的功能已經(jīng)過(guò)全面測(cè)試,其性能至少要好于自己實(shí)現(xiàn)的性能。
參考:來(lái)自JCG合作伙伴的 JavaFX移動(dòng)應(yīng)用程序最佳實(shí)踐 3和JavaFX移動(dòng)應(yīng)用程序 最佳實(shí)踐 4和JavaFX移動(dòng)應(yīng)用程序 最佳實(shí)踐5 ? 邁克博客(Mike's Blog)上的邁克爾·海因里希(Michael Heinrichs)。
翻譯自: https://www.javacodegeeks.com/2012/03/best-practices-for-javafx-mobile_07.html
總結(jié)
以上是生活随笔為你收集整理的JavaFX移动应用程序最佳实践,第2部分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 清除wps的控件(删除WPS里面的插件)
- 下一篇: ping快捷键怎么按(ping指令快捷键