JAVA游戏开发之FPS精准控制

2013年7月18日

目录

JAVA游戏开发之FPS精准控制... 1

1       概述... 2

1.1        编写目的... 3

2       FPS精准控制... 3

2.1        FPS描述... 3

2.2        大众版FPS控制... 3

2.3        大众版效果展示... 4

2.4        精准FPS控制... 5

2.5        精准效果图... 7

3       谢幕... 8

1       概述

前半年一直想用JAVA Swing做一个冒险岛(盛大的一款网络游戏)的模拟器,于是就开始了长达半年左右的开发,由于以前根本不知道盛大游戏的数据文件格式,以及一些关键技术,so 各种Goole,终于将数据文件能够完整的解析,并且可以将数据文件中的音乐、图像、动画等资源展示出来,到这里最为关键的东西搞定了,那么就只剩下JAVA方面拿的东西了,然后又用了一段事件搭建游戏框架,期间遇到各种难缠问题,不过还是完美解决了,最终这个模拟器基本完成。

1.1     编写目的

在开发冒险岛模拟器的期间,遇到了一个游戏开发较关键的技术FPS精准控制,FPS如果不能精准控制,那么将会引发一系列问题,首当其冲的就是游戏画面无法流畅的展示出来,我们都知道,游戏画面及操作是否流畅是我们继续玩下去的最基本动力(最起码我是这么想的),如果一个游戏都不能够流畅的表现出来,那么我们也不会有基情继续玩下去。

OK,罗里吧嗦了这么久,下面直入主题-- FPS精准控制。

2       FPS精准控制

2.1     FPS描述

所谓的FPS其实就是指游戏画面刷新帧频(游戏画面刷新频率),也就是说游戏中每秒钟能够绘制多少次图像,如果FPS控制不精确那么游戏界面的动画会出现时快时慢,阅读本博的读者应该都是有一定的游戏开发基础,知道其实控制每秒的刷新帧数可以通过线程对象的sleep(long time)方法来控制每次绘制完图像的休眠时间,从而达到FPS的控制。

2.2     大众版FPS控制

以下是大众版的FPS控制代码:

public void run() {// 计算出指定FPS数值中,每帧需要多少时间long fpsTime = (long) ((Double.valueOf(1000) / Double.valueOf(DEFAULT_FPS)) * 1000000);// 绘制图像前的时间戳long now = 0;// 每次绘制图像耗时(毫秒)long total = 0;while (true) {now = System.nanoTime();// 绘制图像draw(stageDrawCallback);try {// 除去绘制之后还需要休眠的时间total = System.nanoTime() - now;if (total > fpsTime){// 如果本次绘制时间超过每帧需要绘制的时间,则直接继续绘制continue;}Thread.sleep((fpsTime - (System.nanoTime() - now)) / 1000000);} catch (InterruptedException e) {e.printStackTrace();}}
}

2.3     大众版效果展示

以上就是大众化的FPS控制关键代码,该run()方法是一个线程内的方法,其中fpsTime是计算出每帧需要绘制的毫秒数公式:fpsTime= 1000(毫秒) / 定制的FPS数值。大家可以看到我是使用System.nanoTime()来获得当前时间的(纳秒,1毫秒=1000000纳秒),具体休眠多少事件已经计算我都加了注释,大家应该是可以看懂的,好了,上面的代码就是大众版的FPS控制,让我们看一下运行结果图(三张):

FPS数值:61

FPS数值:78

FPS数值:71

2.4     精准FPS控制

如此,大家可以看到上面的代码虽然可以做到FPS控制,但是这个FPS数值是有区间的(时快时慢),大家可能会问,到底问题出在哪里呢?答案就是sleep(long time)方法,线程是可以帮助我们休眠指定的毫秒时间的,但是大家不要忘记,代码的执行速度那可是比毫秒要快几个量级的啊,那么又会有人问那该要如何精确控制休眠事件呢?

大家看一下代码:

publicvoid run() {// 计算出指定FPS数值中,每帧需要多少时间longfpsTime = (long) ((Double.valueOf(1000) / Double.valueOf(DEFAULT_FPS)) * 1000000);// 绘制图像前的时间戳longnow = 0;// 每次绘制图像耗时(毫秒)longtotal = 0;while(true) {now= System.nanoTime();// 绘制图像draw(stageDrawCallback);try{// 除去绘制之后还需要休眠的时间total= System.nanoTime() - now;if(total > fpsTime){// 如果本次绘制时间超过每帧需要绘制的时间,则直接继续绘制continue;}Thread.sleep((fpsTime - (System.nanoTime()- now)) / 1000000);} catch (InterruptedException e) {e.printStackTrace();}while((System.nanoTime()- now) < fpsTime){// 使用循环,精确控制每帧绘制时长System.nanoTime();}}}

比较两次的代码,其实无非就是加了以下代码:

while((System.nanoTime() - now) < fpsTime){// 使用循环,精确控制每帧绘制时长System.nanoTime();}

看到这里,大家应该会恍然大悟吧!其实关键点就是在绘制图像休眠后,再看一下是否达到了每帧需要绘制的指定时间,如果还没有达到,那么——循环吧!

2.5     精准效果图

FPS数值:59

FPS数值:60

FPS数值:61

大家可以看到,三张图的FPS数值区间一直都保持在59-61左右,这样应该就达到了大家的要求了吧。

3       谢幕

非常感谢大家能够看完本博文,有什么不足之处敬请指出,非常感谢!!!

最后补一句, 本来我是在Word文档写的,打算直接贴过来,没想到,样式这么难看~~ 大家凑活这看吧,呵呵。

JAVA 游戏开发之——FPS(帧频刷新率)精准控制相关推荐

  1. Java游戏开发组件LGame简易测试版发布(版本号 0 1 5)

    LGame-Simple-0.1.5组件下载地址:http://code.google.com/p/loon-simple/downloads/list 2009-09-13 更新内容: Java游戏 ...

  2. JAVA游戏开发之FPS精准控制

    目录 JAVA游戏开发之FPS精准控制... 1 1       概述... 2 1.1        编写目的... 3 2       FPS精准控制... 3 2.1        FPS描述. ...

  3. 了解FPS屏幕刷新率

    FPS是图像领域中的定义,是指画面每秒传输帧数. FPS"也可以理解为我们常说的"刷新率(单位为Hz)" 我们在装机选购显卡和显示器的时候,都会注意到"刷新率& ...

  4. java游戏开发杂谈 - 实现游戏主菜单

    经常玩游戏的同学,大家都知道,游戏都会有个主菜单,里面有多个菜单选项:开始游戏.游戏设置.关于游戏.退出游戏等等,这个菜单是怎么实现的呢. 有一定桌面软件开发基础的同学可能会想到,用JButton组件 ...

  5. java游戏开发(java游戏开发教程)

    Java游戏开发绘图器是什么呢? 众所周知,Java GUI以paint进行绘图,以repaint进行图像刷新,而完成repaint及paint这一连贯过程中所用到绘图组件,我将其称为绘图器.就我个人 ...

  6. 【源码+图片素材+详细教程】Java游戏开发_Java开发经典游戏飞翔的小鸟_飞扬的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java课程设计项目

    课程目标: 1.通过本课程的学习巩固Java的相关基础知识,例如循环判断,数组和集合的使用,对象的继承,接口的实现,窗口的创建,事件监听,图形绘制. 2.完成小鸟的移动,管道自动生成.碰撞死亡,计分系 ...

  7. java游戏开发杂谈 - 游戏编程浅析

    每个游戏,你所看到的它的一切,都是计算机画出来的! 地图是画出来,人物是画出来的,树木建筑是画出来的,菜单按钮是画出来的,滚动的文字.闪烁的图标.云雾烟火,都是画出来的. 游戏编程,所要做的,就是控制 ...

  8. java游戏开发入门(十) -粒子特效

    java游戏开发入门十 - 粒子特效 java游戏开发入门十 - 粒子特效 前言 编码 创建一个粒子发射器,并将粒子发射器添加到实体对象 效果图 完整代码 完整项目 java游戏开发入门十 - 粒子特 ...

  9. 三七互娱 Java游戏开发工程师 面试(两轮技术+HR面)

    (2020春招补招,已拿到offer) 抱着投着试试看的心态去的 自己还是不太了解游戏开发 框架啊这些都没怎么问 比较重视基础知识,面的也基本都是基础知识 所以面完才发现自己太基础的知识反而一问三不知 ...

最新文章

  1. DISTINCT 去重---SQL
  2. python导入xlsx文件-python怎么用pd导入xlsx
  3. pg数据库与MySQL的count函数_postgresql数据库连接数和状态查询操作
  4. 4个在2020年持续发展的数据中心冷却趋势
  5. 广义相对论与量子力学的矛盾
  6. C++判断一个数是否为armstrong number阿姆斯特朗数(附完整源码)
  7. 不止 JavaScript 与 React,前端程序员必备的 9 大技能!
  8. Navicat 安装过程问题总结
  9. 利用ESP8266与米思齐从零制作模拟温室大棚--接线篇
  10. JAVA根据手机号获取省份和地区
  11. 平方损失函数与交叉熵损失函数
  12. Microsoft Sync Framework Runtime 简介(一篇非常好的MSF介绍文章)
  13. 【分布式事务----LCN】LCN原理及使用方式
  14. 福利!H3CNE认证网络工程师GB0-191 考试试题库超详细解析-02。持续更新~~
  15. 教你制作第一个C++游戏!#1 引入
  16. 教师计算机考试模块有哪些内容有哪些内容,教师资格考试信息与信息技术模块知识点...
  17. 站内搜寻引擎 php mysql_使用PHP+Sphinx建立高效的站内搜索引擎的方法
  18. 大一下实验总结(三)
  19. 谈谈Android 6.0 的动态权限管理
  20. 【Scrapy框架实战】爬取网易严选-苹果12手机热评

热门文章

  1. mysql 菜鸟入门
  2. web前端基础——背景图片
  3. 综合评价与决策方法(二)——模糊综合评判法
  4. INM05、INM1、INM2、INM3、INM4、INM5、INM6、INM7液压马达
  5. 移动应用APP架构文档
  6. 大数据职业规划的N种正确姿势
  7. DIV+CSS3制作哆啦A梦头像
  8. 基于华为云自定义模板的图片操作演示(框选、拖拽)
  9. (翻译++)微软Hololens开发教程系列(1): Holograms 100-使用Unity构建第一个全息影像应用...
  10. 通过Maven仓库安装Spire.PDF for Java