JavaFX应用的改善技术

    我有个习惯,就是很多东西都习惯往桌面上仍,然后等桌面满了在清理,不过还好我每次都把桌面的文件打开查看一下有没有必要备份到相关目录,今天看到了个鸡肋,备份不太值得,删了又可惜,放上来暂存。

    当时研究javafx,这方面资料太少,前几天去书店,就两本书,一个就是javafx本质论,另一个是ria客户端javafx方面的,本质论都翻烂了,看了看ria那本译本,也是基础知识,感慨sun被收购后,javafx注定也是后娘养的了。当初在oracle网站看了一个程序员大姐写的应用技术方面的改善,总结了一下写到了word文档里了,因为我英文水平有限,说是翻译确实有点侮辱人家文章了,自己的理解吧,如果你正在应用javafx做一些东西,下面这些建议对于优化你程序的有一定的参考意义:

  

 

1 尽量避免使用反锯齿

使用反锯齿会出现更加复杂的翻译。 为此,除非它是真正地需要的,否则应该关闭反锯齿。Smoothshape的属性,所有继承于shape的子类都具有smooth属性。

例如,一个长方形,除非需要它进行旋转,否则使用smooth是完全没有必要的

Circle {

     clip: Rectangle {

         smooth: false

     }

  }

 

2图片的使用技巧

当图象对象被创造时,它请求以下行为:

a装载文件

b分配图象内存

c解码图象格式

对于相同的图画,我们应该用复用的方式来进行调用,以避免重复的进行图像初始化操作

例如,下例实现了图片的复用

var node: Node;

var img: Image {

   url: "http://my.server.com/image.png"

}

 

Group{

   content: bind [

      node

      ImageView{

         image: img

      }

   ]

}

 

 通过指定图像的高度和宽度,能够有效减少图片的资源消耗。

 

3 时间线的优化 人眼的感知频率是24fr,关键帧设为40ms(25fr)以上即可,如果再高人眼已经不能分辨,所以设为40ms以下以提升频率没有意义。

  def clip = Timeline {

   repeatCount: Timeline.INDEFINITE

   keyFrames:      

      KeyFrame {

         time: 40ms // 25 fps

         action: function () : Void {...}

      }  

}

 

根据显示器刷新来设定,合理设置能够降低CPU使用率

  var t1 = Timeline {

    framerate: 15

    repeatCount : Timeline.INDEFINITE

    autoReverse: true

    keyFrames: [

        at (0s)   { coordX => 0 ; coordY => 450; },

        at (10s) { coordX => 450 ; coordY => 0;  }

    ]

};

 

 

4 Group组策略

比较下面两段代码,一个将效果加到整个Vbox范围内,一个加到Rectangle范围内,实现了同样的效果,但是对于资源节约上,后者有优势。但是这样是针对最小实现,如果一个组内所有元素都需要实现效果,为了保证效果,依然要把效果加到组的范围。我们的目的就是最小化责任单元。

scene: Scene{

    content:

        VBox {

            content: for (i in [1..100])

                HBox {

                    content: for (j in [1..100])

                        Rectangle{

                            width: 100 height: 100 fill: Color.RED

                        }

                }

                effect: DropShadow {}

        }

}

 

 

 

scene: Scene{

    content:

        VBox {

            content: for (i in [1..100])

                HBox {

                    content: for (j in [1..100])

                        Rectangle{

                            width: 100 height: 100 fill: Color.RED

                            effect: DropShadow {}

                        }

                 }

        }

}

 

 

5 缓存机制

主要针对effects效果的操作,但是旋转不支持缓存效果。

 

6 Def  Var

如果是初期化后就不在进行变化的值,最好用def的方式定义。

这个可以参考javafx基础

 

7 Scene

每个场景尽可能的小,不要在一个场景中定义更多的东西。在保证满足功能的前提下,能够提取出的尽量提取出无关组件,对于不需要的组件,尽量从场面图表去remove掉,而不是将visible设为false,因为属性依然消耗系统资源。

 

8 避免多余的Bind,Bound

数据捆绑是JavaFX一个强有力的特点,使开发人员定义二个变化事物之间的关系。 每当一个关联事物改变,自动地更新另一关联物。 然而,切记使用绑定是相当昂贵的操作。 设法避免多余的捆绑,例如绑定到值不改变的事物。

绑定原则:在必须的时候再用。

 

9 尽量避免用Stroke

  如果你想改变文本的颜色或者画一个具有边框的填充四边形,使用fill而不使用Stroke是个更好的选择,因为这样比通过将一个长方形放到另一个长方形上来获得两个填充的长方形更加快速。(It is faster to render two filled rectangles by placing one rectangle on top of the other.

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是两个JavaFX应用案例: 示例一: import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.stage.Stage; import javafx.scene.layout.StackPane; public class MyJavaFX_NodeRotate extends Application{ @Override public void start(Stage primaryStage){ StackPane pane=new StackPane(); Button ok=new Button("OK"); ok.setStyle("-fx-color:white;-fx-txt:red"); pane.setRotate(45); pane.getChildren().add(ok); pane.setStyle("-fx-border-color:black;-fx-background-color:red;"); Scene scene=new Scene(pane,200,100); primaryStage.setTitle("NodeRotate"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args){ Application.launch(args); } } 示例二: import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.stage.Stage; public class MyJavaFX_oneOK extends Application { @Override public void start(Stage primaryStage) { Button btClick=new Button("Click me"); Scene scene=new Scene(btClick,500,500); primaryStage.setTitle("MyJavaFX"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } } 这两个案例展示了如何创建一个简单的JavaFX应用程序,其中一个案例展示了一个旋转的按钮,而另一个案例展示了一个占据整个场景的按钮。在JavaFX应用启动时,JVM会使用无参构造方法创建类的一个实例,并调用其start方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值