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