1、简述
JavaFX是一个强大的图形和多媒体处理工具包集合,它允许开发者来设计、创建、测试、调试和部署富客户端程序,并且和Java一样跨平台。
2、组成结构
- javaFX基础(javaFX系列之launcher启动器:两种启动javaFX的方式及launch(args[])参数设置和获取)
- 窗体(javaFX2.0窗体(Stage)分析及使用)
- 场景(javaFX2.0场景(Scene)分析及使用)
- 布局
- UI组件
- 2D/3D图形系统(windows vista以下使用directx 9.0,windows7使用directx 11.0,macos/linux使用opengl)
- 多媒体(音视频)(javaFX系列之media:最简单的javaFX视频播放器实现)
- 视觉特效
- web组件(javaFX系列之web组件:最简单的javaFX浏览器实现)
- css层叠样式表(支持css2.0和少量css3.0
- 其他
- JavaFX线程结构分析
3、线程结构
javafx运行时包含以下几个线程:
- javaFX launcher Thread(javaFX启动器,以下简称为:”启动器线程“)
- JavaFX Application Thread(javaFX应用工作线程,以下简称为:”工作线程“)
- QuantumRenderer Thread(javaFX量子渲染线程,以下简称为:”渲染线程“)
4、线程分析
(1)javaFX launcher Thread(javaFX启动器线程)
启动器线程启动了javaFX工作线程以及渲染线程,并且执行了Application中的init()方法,也就是说启动器线程主要作用是初始化javaFX应用程序上下文。
该线程可被阻塞,阻塞后工作线程和渲染线程都不会启动。
参考javafx2.0源码
// Create a new Launcher thread and then wait for that thread to finish
final CountDownLatch launchLatch = new CountDownLatch(1);
Thread launcherThread = new Thread(() -> {
try {
launchApplication1(appClass, preloaderClass, args);
} catch (RuntimeException rte) {
launchException = rte;
} catch (Exception ex) {
launchException =
new RuntimeException("Application launch exception", ex);
} catch (Error err) {
launchException =
new RuntimeException("Application launch error", err);
} finally {
launchLatch.countDown();
}
});
launcherThread.setName("JavaFX-Launcher");
launcherThread.start();// Wait for FX launcher thread to finish before returning to user
try {
launchLatch.await();
} catch (InterruptedException ex) {
throw new RuntimeException("Unexpected exception: ", ex);
}if (launchException != null) {
throw launchException;
}
javaFX启动顺序:
执行main()方法,启动程序入口,当前线程:main
执行Appliction.init()方法,初始化窗体,当前线程:JavaFX-Launcher
执行Appction.start()方法,打开窗体,当前线程:JavaFX Application Thread
执行Applicton.stop()方法,窗体已关闭,当前线程:JavaFX Application Thread
(2)JavaFX Application Thread
显示渲染线程已经处理完的帧并显示出来。渲染线程和工作线程分离,也就是说javaFX使用异步渲染,渲染时并不会阻塞工作线程,这样的好处是工作线程有足够的时间来处理逻辑计算。
该线程可被阻塞,阻塞后不影响其他线程。
比如我们在start()方法里阻塞住,那么窗体就会停止从渲染线程同步帧(保持之前显示的画面不动),但是不影响渲染线程。
执行Appction.start()方法,打开窗体,当前线程:JavaFX Application Thread
执行Applicton.stop()方法,窗体已关闭,当前线程:JavaFX Application Thread
(3)QuantumRenderer Thread
渲染线程只负责渲染窗体(Stage)当前场景(Scene)内的所有节点(Node),并把渲染完的帧交给工作线程进行显示。
渲染线程会控制帧率,最高帧率不超过60帧
- Windows XP和Vista上使用DirectX 9
- Windows 7上使用DirectX 11
- Mac、Linux、嵌入式设备上使用OpenGL
- 不支持GPU渲染时使用CPU渲染(jre内置cpu渲染引擎)