声明:   本博客文章原创类别的均为个人原创,版权所有。转载请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http://www.wjfxgame.com

有一段时间没有写博客了,但一切都在有条不紊的进行中。

这一段时间没事的时候把基于JavaFX的游戏引擎WJFXGameEngine的效率进行优化了一下(个人博客的示例并未重新上传),简单的2D游戏,在我PC上运行最快可以达到750-800FPS。下面来简单谈谈JavaFX游戏开发上的一些基本问题。

看过JavaFX官方游戏示例BrickBreak的人都可以发现,这个游戏的绘制和逻辑是在Timeline中进行的。JavaFX中的Timeline根据我使用的经验来看,效率不是很高,而且如果数量过多,会很卡。在我游戏引擎中目前的简单的动画是用Timeline实现的,未来会做大改动。

而且之前的教程中,JavaFX简单的游戏框架中讲的也是是用的Timeline。这实际是个很严重的问题。被JavaFX官方示例误导了。

目前我的改动是,使用双线程,一个线程处理绘制,一个线程处理更新操作(这也是很多游戏引擎常用的做法,例如Android游戏引擎AndEngine)。当然,绘制处理必须要在JavaFX MainThread中运行,所以我们使用Platform.runLater来调用绘制操作。虽然它还是在主线程执行,但更新绘制的速度明显更快。之前做的JavaFX游戏示例中,经常出现子弹卡顿等现场,现在不会出现了。

下面是示例代码:

		drawThread = new Thread(new Runnable() {

			@Override
public void run() {
while (isRunning) {
try {
Thread.sleep(waitTime);
} catch (Exception e) {
}
Platform.runLater(new Runnable() {
@Override
public void run() {
draw(getGraphicsContext2D());
}
});
if (fpsMaker != null) {
fpsMaker.makeFPS();
}
}
}
}); updateThread = new Thread(new Runnable() { @Override
public void run() {
while (isRunning) {
try {
Thread.sleep(waitTime);
} catch (Exception e) {
}
update();
}
}
});

这个是我的WScreen类里的代码。

线程等待时间waitTime越低的时候,FPS会越快。

FPS快了之后,就有另外一个问题。由于更新操作频繁,如果这样时候你在update等操作里面还依然使用move(4)这样的方法的话,你会发现速度非常的快。

而且由于FPS又不是稳定的,所以我们会发现在不同配置的电脑上运行的情况差别很大,这样,我们就要用到另外一个概念了DeltaTime。

DeltaTime记录的是距离上次Update的时间。我们每次移动的速度* DeltaTime,就可以让我们以不受帧率影响的速率移动了。

当然DeltaTime几乎在所有的游戏引擎或框架中都有这个概念,像我以前用的微软的XNA游戏框架,现在工作的Unity3D开发等。

大家可以看到FPS达到751了,而且相同的示例,已经比较好的解决之前效率造成的卡顿问题。

因本人水平有限,该部分仅作参考。引擎的话,Graphics可以做一层封装。以后如果效率实在不够,可以做其他OpenGL等的封装。

转载请注明出处:http://blog.csdn.net/ml3947

JavaFX游戏开发效率浅谈的更多相关文章

  1. 【Unity游戏开发】浅谈Lua和C#中的闭包

    一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...

  2. 【Cocos2d-x游戏开发】浅谈游戏中的坐标系

    无论是开发2D还是开发3D游戏,首先必须弄清楚坐标系的概念.在Cocos2d-x中,需要了解的有OpenGL坐标系.世界坐标系和节点坐标系.  1.UI坐标系 IOS/Android/Windows ...

  3. 【Unity游戏开发】浅谈 NGUI 中的 UIRoot、UIPanel、UICamera 组件

    简介 马三最近换到了一家新的公司撸码,新的公司 UI 部分采用的是 NGUI 插件,而之前的公司用的一直是 Unity 自带的 UGUI,因此马三利用业余时间学习了一下 NGUI 插件的使用,并把知识 ...

  4. 【Unity游戏开发】浅谈Unity游戏开发中的单元测试

    一.单元测试的定义与作用 单元测试定义:单元测试在传统软件开发中是非常重要的工具,它是指对软件中的最小可测试单元进行检查和验证,一般情况下就是对代码中的一个函数去进行验证,检查它的正确性.一个单元测试 ...

  5. 【Unity3d游戏开发】浅谈UGUI中的Canvas以及三种画布渲染模式

    一.Canvas简介 Canvas画布是承载所有UI元素的区域.Canvas实际上是一个游戏对象上绑定了Canvas组件.所有的UI元素都必须是Canvas的自对象.如果场景中没有画布,那么我们创建任 ...

  6. Android安全开发之浅谈密钥硬编码

    Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...

  7. Android应用安全开发之浅谈加密算法的坑

      <Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题     Android开发中,难免会遇到需要加解密一些数据内 ...

  8. 安卓开发_浅谈ListView(SimpleAdapter数组适配器)

    安卓开发_浅谈ListView(ArrayAdapter数组适配器) 学习使用ListView组件和SimapleAdapter适配器实现一个带图标的ListView列表 总共3部分 一.MainAc ...

  9. 安卓开发_浅谈Android动画(四)

    Property动画 概念:属性动画,即通过改变对象属性的动画. 特点:属性动画真正改变了一个UI控件,包括其事件触发焦点的位置 一.重要的动画类及属性值: 1.  ValueAnimator 基本属 ...

随机推荐

  1. 基于visual Studio2013解决算法导论之011快排改良

     题目 快排改良 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #in ...

  2. Android自己定义控件(状态提示图表)

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重分享成果] 1 背景 前面分析那么多系统源代码了.也该暂停下来歇息一下,趁昨晚闲着看见一个有意思的需求就操 ...

  3. MFC 之 截图工具

    这个截图工具能实现最主要的截图功能,并保存为bmp图片. 编写环境是vs2005,使用Unicode,基于对话框. 没什么难度,直接看代码 项目名称为CutOut // CutOutDlg.h : 头 ...

  4. C++学习笔记(十二):重载函数

    1. 什么是重载函数 假设同一作用域内的几个函数名字同样但形參列表不同.那么这些函数就称之为--重载函数. 比如: void print( const char *cp); void print(co ...

  5. JIRA初步

    JIRA 是澳大利亚 Atlassian 公司开发的一款优秀的问题跟踪管理软件工具.可以对各种类型的问题进行跟踪管理.包含缺陷.任务.需求.改进等.JIRA採用J2EE技术.可以跨平台部署.它正被广泛 ...

  6. Perl 5 教程

    Perl 5 教程 http://www.cbi.pku.edu.cn/chinese/documents/perl/index.htm

  7. 双绞线的制作,T568A线序,T568B线序

    双绞线的制作 1.1 实验目的 双绞线是组建局域网时常常使用的通信传输介质,通过本实验,让学生学会制作双绞线. 1.2 实验任务 (1)了解双绞线的特性及屏蔽与非屏蔽双绞线的区别. (2)了解EIA/ ...

  8. 学习笔记之NodeJs基本操作

    nodejs安装见文章:windows下安装node.js及less 运行js文件:node xxx.js 调用http模块,并指定端口为3000,向客户端输出<h1>Node.js< ...

  9. poj3617Best Cow Line

    题意大概是这样,给你一个字符串,你能够进行的操作是这种, 每次拿走这个串的第一个字母,或者最后一个字母,然后放到 一个新串的末尾(当然啦,新串一開始是为空的),当把旧串 里的全部字母拿掉,这个时候就形 ...

  10. EasyUI - DataGrid 组建 - [ 新增功能 ]

    效果: html代码: <div> <!--使用JS加载方式--> <table id="tab"></table> <!-- ...