JavaOne 2012:JavaFX圖形技巧和竅門

我回到希爾頓(皇家宴會廳B)看了Richard Bair的(Oracle Java客戶架構師)的“ JavaFX圖形技巧和竅門”。 Bair與FX Experience相關聯,并且顯然了解JavaFX。

拜爾說,他演講的主題是表演。 他告誡說,與大多數與性能相關的事情一樣,請避免性能預先優化。 他有一個黃色的大警告屏幕,上面寫著“寫清楚的代碼,然后再顯示個人資料!”。 他說,他的演講基于JavaFX 2.2,其中一些技巧可能不適用于JavaFX 8。

Bair為Windows,Linux和Mac OS X這三種不同的操作系統(未指定版本)上的幾種瀏覽器提供了“ GUIMark 2 Vector”基準測試。Bair將JavaFX與這些瀏覽器的本機支持進行了比較。 他還指出,有時SceneGraph更快,有時Canvas更快。 Bair提出的許多觀點在較小的設備上比在臺式機上更為重要。

JavaFX比GUIMark 2位圖中的瀏覽器快得多,而JavaFX Canvas是所有瀏覽器中最快的。 由于速度有限,GUIMark 2 Text測試無法為Windows提供有用的數據,但是JavaFX在Linux和Mac OS X上表現出色。Bair打算發布基準測試方法以供公眾使用,他展示了一個圖表,該圖表表明從JavaFX 2.2到2007年的顯著性能改進。 JavaFX 8。

拜爾的績效準則#1是“少做點工作”。 Bair說:“更小的系統需要更激烈的性能調整。” 他補充說,“每行計數”和“額外的方法調用加起來”。 盡管在傳統的桌面Java中,我們已經學會了不要擔心方法調用的數量,但這在較小的設備上可能是個問題(“過多的內聯非常昂貴”,而“過多的方法調用很昂貴”)。 Bair展示了如何使用局部final變量來減少方法調用的次數。 他承認這是臺式機上的“絕對微性能預優化”,但對于較小的設備來說是一種有用的策略。

Bair說,“填充率”是“幾乎100%確定性”的限制。 除非您有“成千上萬的頂點”,否則幾何率不太可能成為JavaFX中的重要限制。 CSS開銷和布局計算一樣都是可能的限制。 JavaFX進行了大量的緩存,而后者可能并不總是一個問題。 系統I / O很有可能會限制您,特別是在較小的設備上。

拜爾(Bair)展示了一個“濫用填充率”的示例,該方法首先繪制最遠的背景,然后用另一填充繪制大部分。 他有一些避免這種不必要填充的觀點,例如“只畫變化了”。 Bair指出開發人員會在Swing中識別“臟區”,但是JavaFX SceneGraph會“自動執行此操作!” 他確實警告JavaFX Canvas要求開發人員識別“臟區”。

提高填充率的另一種方法是“限制使用(某些)效果”。 “效果在您的臺式機系統上幾乎是免費的,”但可能需要在較小的設備上更仔細地觀察。 拜爾討論了一項子彈,指出“限制使用非矩形,無軸對齊的夾子”是提高填充率的另一種策略。 直接剪切對齊的圖像很快,但是抗鋸齒,渲染為背景圖像以及旋轉未對齊的像素邊界的過程會“花費更多”(但在大多數桌面應用程序中您不會注意到)。

Bair表示,減少透支是提高填充率的有效方法。 與減少透支有關,他討論了使用“圖像蒙皮”的問題。 Bair在這里還提到JavaFX 8包括自動區域紋理緩存。 減少透支的其他想法包括簡化樣式(Metro,Android),合并背景填充以及減少重疊節點的數量。

Bair表示,Microsoft故意在Metro中提出了易于繪制的樣式。 同樣,Android樣式更快,更容易繪制。

“ 遮擋剔除”可以避免繪制(剔除)不可見的東西。” 這樣做可以使我們“減少過度繪制并提高渲染性能”。 JavaFX引擎可以響應JavaFX CSS不透明的插圖,以了解何時不重繪這些區域。

有一些CSS成本需要注意,例如解析樣式表。 貝爾(Bair)展示了一個帶有.parent:hover .child {...}的“ CSS Horror Show”幻燈片,并解釋了為什么如此恐怖:每次將父項懸停時,都必須重新審視所有子項。 同樣,如果有大量.parent .child {...}.parent .child {...}可能會很糟糕,因為“當我們遇到一個帶有.child樣式類的節點時,我們必須沿著整個場景圖走動直到找到它。” 最好將搜索限制為直接父級。

Bair指出,setStyle CSS屬性非常方便,但代價可能很高。 解析和其他支持會增加性能問題。 CSS提供了功能,靈活性和便利性,但這確實是以性能為代價的。

Bair的技巧之一是“避免對SceneGraph進行結構更改”。 從變更點開始的所有CSS必須重新計算。 除了重新應用CSS外,更改SceneGraph時還需要“結構完整性檢查”。 JavaFX已經優化了toFront / toBack,因此請使用它們而不是刪除并添加回來。

另一個Bair技巧是“使用FXCollections”。 他對此的第一句話說:“爭取最小的通知開銷。” 建議使用setAll而不是clear和addAll的子項目符號。 添加了另一個子項目,“避免多次添加呼叫”。

最好使用FXColections.sort(),因為它“發送”排列”更改事件。 這意味著JavaFX引擎知道更改了什么,因此僅重新計算該特定類型更改所需的內容。 這些“排列”由“單獨的快速路徑處理”。

Bair表示“ ListView快速起泡”,因為它“重用節點”并保持最小的更改。 Bair總結說,該幻燈片帶有“重用ListView來滿足您所有的虛擬化需求!”

Bair的“手動布局”技巧包括了Region的自定義擴展的想法。 他警告說,擴展Region時,幾乎總是需要實現computePrefWidthcomputePrefHeight

Bair有一張幻燈片列出了處理布局時“ JavaFX會問”的問題。 這些問題是“您想要多大/多高?” 和“您可以調整大小嗎?” 當嘗試渲染布局時,JavaFX至少會問這些問題一次,有時甚至是問更多次。 定制的布局可以減少嘗試的次數和提出的問題的數量。 “ JavaFX提出了很多問題”,并且“在布局期間每個節點都被問到了”。

拜爾有一個“重要提示!” 與“內容偏差”相關。 如果高度取決于寬度,則表示水平偏差。 如果寬度取決于高度,則表示您有偏見。 Bair表示“((contentBias = null)到目前為止是最快的”(所有計算出的高度和寬度首選項都將被緩存)。 內容偏差通常為null或水平。 內在錯誤是“內置布局實際上未很好地支持contentBias!= null”。

到目前為止,所有內容均已符合Bair的第一條規則(減少工作量)。 規則2現在為“了解您的設備”。 Bair展示了一張幻燈片,其中將功能強大的NVidia GForce GTX 690與功能較弱的NVidia GForce 310甚至更??低的PowerVR SGX543MP3進行了比較。 Bair的觀點當然是,“ JavaFX為您提供了一個開發平臺和一套API,但是您可以使用和不能使用哪些API將取決于設備的固有性能特征。”

Bair對設備上的JavaFX有一些經驗法則。 使用桌面應用程序處理2萬到10萬個節點。 500到1000個節點是嵌入式的最佳范圍。 對于非常小的嵌入式設備,對于JavaFX應用程序,堅持使用100到200個節點。

Bair提供了另一個與緩存有關的技巧。 他談到要緩存圖表,因為然后將其僅繪制到圖像一次,然后可以快速繪制到屏幕“數十億次”。 但是,Bair警告說,“如果節點發生很大變化,則會適得其反”。 拜爾說,他經常將緩存設置為true,制作動畫,然后再次將緩存設置為false。

旋轉和縮放時可以將CacheHint設置為SPEED,以獲得更好的性能。 如果您希望它在旋轉時能重繪以提高準確性,則可以使用除SPEED之外的其他緩存提示。

JavaFX 8具有Pulse Logger( -Djavafx.pulseLogger=true系統屬性),可以“打印出很多有關JavaFX引擎執行的廢話”(很好的方式)。 在每個脈沖的基礎上有很多提供的信息,包括脈沖數(自動遞增的整數),脈沖持續時間以及自最后一個脈沖以來的時間。 該信息還包括線程詳細信息和事件詳細信息。 此數據使開發人員可以查看大部分時間。

Bair用相同的鮮黃色警告幻燈片結束了會議:編寫干凈代碼,然后分析! 幻燈片還指出,“不要過度操作,否則您將陷入無法維護的困境。

參考: JavaOne 2012:來自JCG合作伙伴 Dustin Marx的JavaFX圖形技巧和竅門,內容來自Inspired by Actual Events博客。


翻譯自: https://www.javacodegeeks.com/2012/10/javaone-2012-javafx-graphics-tips-and.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371083.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371083.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371083.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

web前端知識點1

1. input屬于窗體元素,層級顯示比flash、其它元素都高。請判斷這句話的正確與否。 錯誤 層級顯示優先級: frameset > 表單元素 > 非表單元素 在html中,幀元素(frameset)的優先級最高,表單元素比非表單元素的優…

18. 使用模板【從零開始學Spring Boot】

轉:http://blog.csdn.net/linxingliang/article/details/52017098 18.1 使用thymeleaf 整體步驟: (1) 在pom.xml中引入thymeleaf; (2) 如何關閉thymeleaf緩存 (3) …

java單元測試算初級_Java____Eclipse下JUnit單元測試(初級)

給大家分享一個鏈接希望對你們有幫助 http://blog.csdn.net/huangbiao86/article/details/6709742今天看圖片命名唯一的策略時看到有個大大用JUnit測試,神奇的樣子,遂上網搜集來三篇JUnit測試的入門文章,作為參考。原作地址在上面&#xff0c…

Hadoop + Amazon EC2 –更新的教程

在Hadoop的Wiki頁面上放置了一個舊教程: http : //wiki.apache.org/hadoop/AmazonEC2 ,但是最近我不得不遵循本教程,并且我注意到它沒有涵蓋某些Amazon新功能。 建議您已經熟悉Hadoop的基礎來遵循本教程,可以在Hadoop的主頁http:…

oracle11g 修改字符集 修改為ZHS16GBK

轉:http://www.cnblogs.com/jay-xu33/p/5210098.html oracle11g 修改字符集 修改為ZHS16GBK1.cmd下,cd到oracle數據庫軟件的服務器端 如:D:\app\Administrator\product\11.2.0\dbhome_1\BIN 2.輸入set ORACLE_SID你想進入的數據庫的那個sid 3.輸入 sqlpl…

瀏覽器內核

瀏覽器的四大內核: Trident,Gecko,Webkit,Blink。 不同的內核對網頁編寫語法的解釋也有不同,進而導致同一個頁面在不同內核的瀏覽器下顯示出來的效果也會有所出入,這也是作為一個前端工程師需要了解不同瀏…

2017.4.14 Java String.split()用法小結

在java.lang包中有String.split()方法,返回是一個數組 我在應用中用到一些,給大家總結一下,僅供大家參考: 1、如果用“.”作為分隔的話,必須是如下寫法,String.split("\\."),這樣才能正確的分隔開,不能用String.split("."); 2、如果用“|”作為分隔的話,必…

java線程統一_Java線程結果不一致

我有一個實現可運行的線程類和一個int計數器作為實例變量。兩種同步方法add和sub。當我以某種方式運行測試類時,它幾次會輸出錯誤的結果。據我了解,當方法同步時,整個對象將被鎖定以供其他線程訪問,這種邏輯每次我們都應該獲得相同…

markdown-Macdown

#標題 [頁面錨點](#name) > <a name"name"></a>文字 **加粗**(Command-B) *斜體*(Command-I) * * * 或者 - -- 無序列表 1. 2. 3. 有序列表 、、、 代碼段 、、、 或者用 ~ 代替 或者 上下空一行每行縮進4個空格 <http://www.baidu.com>鏈…

什么是web標準??

web標準 不是某一個標準&#xff0c;而是一系列標準的集合。網頁主要由三部分組成&#xff1a;結構&#xff08;Structure&#xff09;、表現&#xff08;Presentation&#xff09;和行為&#xff08;Behavior&#xff09;。對應的標準也分三方面&#xff1a;結構化標準語言主…

有沒有更好的Marker方法?

自Java 1.5推出以來&#xff0c;就是否在Java中使用Marker接口進行了廣泛的討論和辯論。 這是因為Java 1.5引入了注釋功能&#xff0c;這些功能幾乎可以解決Marker接口的目的。 本文將涵蓋這場辯論的一個有趣的部分。 定義&#xff1a; Java中的標記接口是一個空接口&#xff…

php jquery ajax登錄,jQuery+Ajax+PHP彈出層異步登錄效果(附源碼下載)

彈出層主要用于展示豐富的頁面信息&#xff0c;還有一個更好的應用是彈出表單層豐富交互應用。常見的應用有彈出登錄表單層&#xff0c;用戶提交登錄信息&#xff0c;后臺驗證登錄成功后&#xff0c;彈出層消失&#xff0c;主頁面局部刷新用戶信息。本文我們將給大家介紹如何使…

【CPU】解決打開360或者Chrome瀏覽器CPU占用過高

cmd 運行&#xff1a; RD /s /q "%USERPROFILE%\AppData\Roaming\Microsoft\Protect"轉載于:https://www.cnblogs.com/zwqh/p/6708398.html

# 20155337 2017-2018-1 《信息安全系統設計基礎》第二周課堂實踐+myod

20155337 2017-2018-1 《信息安全系統設計基礎》第二周課堂實踐myod 因為在課上已經提交了四個實驗&#xff0c;還欠缺最后一個實驗&#xff0c;反省一下自己還是操作不熟練&#xff0c;平時在課下應該多多練習linux的命令訓練。 實踐一 每個* .c一個文件&#xff0c;每個*.h一…

css盒模型中margin很牛逼

css盒子模型&#xff0c;說簡單也簡單&#xff0c;用的時候也有不簡單的。 其中margin的值可以為負值&#xff0c;并且為了實現margin&#xff0c;忽略父級的padding、border、甚至定位。這在布局上很有用&#xff0c;要注意。 ------------ 比如&#xff0c;div1&#xff0…

CometD:Java Web應用程序的Facebook類似聊天

聊天就像吃一塊蛋糕或喝一杯熱咖啡一樣容易。 您是否曾經考慮過自己開發聊天程序&#xff1f; 您知道&#xff0c;聊天不容易。 但是&#xff0c;如果您是開發人員&#xff0c;并且閱讀了本文的結尾&#xff0c;則可以嘗試自己開發一個聊天應用程序&#xff0c;并允許您的用戶通…

怎么用PHP建立購物網站,如何使用PHP建設一個購物網站

本系統以PHP為主要制作工具&#xff0c;實現了用戶注冊、登錄、驗證身份及用戶數據的采集、物品的預覽查詢、搜索/查看物品信息&#xff0c;站內最新物品信息發布&#xff0c;可進入在線下單從而實現了網絡銷售。網上購物&#xff0c;這個逐漸流行于二十世紀的購物方式已經為越…

團隊作業2——需求分析原型設計

需求分析&#xff1a; 軟件的最終目的是用來解決用戶的某些問題&#xff0c;需求分析就是要理解要解決的問題&#xff0c;真正明確用戶需求。請發表一篇隨筆&#xff0c;完成初步的需求分析&#xff1a; 1.訪問軟件項目的真實用戶&#xff08;至少10個&#xff09;&#xff0c;…

給div命名,使邏輯更加清晰

我們把一些標簽放進<div>里&#xff0c;劃分出一個獨立的邏輯部分。為了使邏輯更加清晰&#xff0c;我們可以為這一個獨立的邏輯部分設置一個名稱&#xff0c;用id屬性來為<div>提供唯一的名稱&#xff0c;這個就像我們每個人都有一個身份證號&#xff0c;這個身份…

css邊框顏色漸變

在實際開發中&#xff0c;我們經常遇見邊框需要背景漸變的實現要求&#xff0c;那么如何去實現呢&#xff0c;今天給大家分享依稀幾種情況 1.直角的背景漸變 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta…