目录
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控制,让我们看一下运行结果图(三张):

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

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

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

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

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

大家可以看到,三张图的FPS数值区间一直都保持在59-61左右,这样应该就达到了大家的要求了吧。
 
3 谢幕
非常感谢大家能够看完本博文,有什么不足之处敬请指出,非常感谢!!!

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

文章转载:http://blog.csdn.net/zhaohongda33/article/details/9373265

JAVA游戏开发之FPS精准控制相关推荐

  1. JAVA 游戏开发之——FPS(帧频刷新率)精准控制

            JAVA游戏开发之FPS精准控制 2013年7月18日 目录 JAVA游戏开发之FPS精准控制... 1 1       概述... 2 1.1        编写目的... 3 2  ...

  2. DirectX游戏开发之3D角色动起(下)

    DirectX游戏开发之3D角色动起(下) 直接先上图吧! 动作idle 动作attack 动作walk 动作run 看,多动作的模型搞下来了.原则上只要在此基础上略做修改就可以实现3d游戏的基本制作 ...

  3. DirectX游戏开发之2D文字的实现

    DirectX游戏开发之2D文字的实现 文字是承载信息最有效的载体之一,各种游戏程序都离不开文字的显示.对于3D文字来说,2D文字有其渲染的高效性和实现的简洁性. 2D文字的显示无论在写2D游戏还是在 ...

  4. 游戏开发之U3D实现技能图标冷却的效果

    游戏开发之U3D实现技能图标冷却的效果 --本次使用的NGUI插件.     制作思路:NGUI插件里面有个UISprite组件,在它上面有个属性叫Type,改变相应的Type类型有不同的作用,本次使 ...

  5. [整理]Unity3D游戏开发之Lua

    原文1:[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(上) 各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我地博客地址是blog.csdn.net/qinyuanpei.如果 ...

  6. 游戏开发之U3D插件EasyTouch5.x使用

               游戏开发之U3D插件EasyTouch5.x使用 本篇只讲EasyTouch5.x的使用,不讲源码.本来想把EasyTouch5.x的使用手册翻译一遍,想来也是没那个时间. 第一 ...

  7. libGDX游戏开发之Box2D(十四)

    libGDX游戏开发之Box2D(十四) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网和goo ...

  8. 开发中的“软”与“硬”:高画质移动游戏开发之道

    摘要:游戏的效果不仅与游戏引擎的渲染相关,与硬件优化也有千丝万缕的联系.一款基于芯片优化的移动游戏界面,甚至可以堪比视频游戏的视觉效果.高通半导体事业部资深经理刘晓光从软硬件两个层面分享了移动游戏开发 ...

  9. 微信小游戏开发之CocosCreator多分辨率场景适配方案

    主题 Cocos Creator不同手机分辨率的背景图像和场景内容适配 特别说明 CocosCreator微信小游戏开发系列文章,是我在逐步开发过程中,基于官方文档之上,记录一些重点内容,以及对官方文 ...

最新文章

  1. 斯坦福团队是如何构建更好用的聊天 AI 呢?
  2. [评测] 联想 Mirage Solo 一体机:基本性能强大,价格定位很迷
  3. LPS在无人机数据处理中的应用
  4. 如何使自己的不和谐机器人
  5. 9206-1117-课堂笔记
  6. Nginx 实现封杀恶意访问
  7. ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule
  8. DevExpress GridControl双击获取行内容
  9. Django中_meta 部分用法
  10. Android开发 - 掌握ConstraintLayout(一)传统布局的问题 1
  11. java并发包(JUC)
  12. 【应用实例】基于Icepak油泵系统热仿真
  13. c语言if语句用法总结,C语言if语句总结.doc
  14. 网络营销实战密码——策略、技巧、案例(修订版)
  15. 做SEO优化应该掌握哪些基础知识
  16. phyton做彩色电子管
  17. mysql高级查询之性能分析explain和日志查看
  18. WebDriverException: Message: unknown error: cannot find Chrome binary(ChromeDriver及谷歌官网下载地址)
  19. postgresql常用操作指令
  20. WPF ListBox颜色交替及以击事件实现

热门文章

  1. 函数名,函数的闭包和迭代器
  2. Chrome浏览器修改用户资料(User Data)的存放位置
  3. HNU-操作系统-讨论课7
  4. python遍历字典键值做变量名 字符串做变量名
  5. Linux进程间的6种通信方式
  6. 将ViewBag的值传给Jquery函数做参数
  7. 李宏毅机器学习系列-强化学习之Q-Learning
  8. 自娱自乐--星座大全
  9. linux mate 中文界面,Linux Mint 16 Cinnamon与Mate特性与界面
  10. 工具分享:macOS上可以单独设置鼠标滚轮方向的小工具,Mos