游戏提高性能 游戏降帧处理

什么是降帧&为什么降帧

一般情况下我们为了提高整个游戏的体验,所以我们一般会将游戏的帧数(每秒钟刷新多少次)设置的比较高。一般情况下,我们的游戏所有的代码都是一帧执行一次。为了让每一帧都变成真的关键数据帧。不过,部分手机能性能可能跟不上,或者计算量太大的情况下,手机的运算速度不能够支持的情况,过高的性能消耗就会拖慢运算的速度,让一秒内没有办法打到满帧。所以就会觉得游戏变得卡顿。

其实一部分逻辑并没有必要每一帧都去执行,可以将他们隔几帧运行一次也不是不可以。比如说伤害值的运算,伤害应该与游戏运营的帧数无关,比如每0.1秒执行一次伤害代码,那么在满帧60帧的情况下,其实每6帧执行一次就OK。

或许你会问,如果我们的程序最少的逻辑间隔时间是0.1的话。所有的游戏逻辑都是间隔0.1判定一次不就好了?这不是很简单的事情?但实际上事情并没有那么简单。一般情况下我们人眼的录入认为是16帧每秒。那么理论上满足16帧的游戏,我们就应该觉得很流畅了。但是你我都知道,16帧的游戏,并不能让人觉得非常流畅。为什么?原因也非常简单。人看到的东西会有预判,你看到这个怪物在水平移动,如果游戏表现出来的效果与你的预判是保持一致的,那么你就会觉得这是非常流畅的,但是如果怪物的移动跟你的预判不一致,那么你就会觉得这个游戏并不流畅。回答一下刚才自己提问的问题。为什么不可以,因为你把业务堆积到某一帧里边去了。所以这一帧里边的运算量跟你没有降帧之前的运算量是一致的,相对于没有运算的帧来说,你是卡顿的。这个时候。一会卡顿一会流畅。或许你打印出来的每秒的帧数是够60的。但是你表现出来的效果并不流畅。

我们之所以希望能提高帧数,是为了制造流畅的感觉。但是降帧则会违反这种感觉。所以游戏的帧数不能降低,或者在准确一点来说,游戏的View的帧数不应该降低,减低的应该是逻辑帧数。

请原谅我取了一个比较迷惑的题目。其实这样的原因,是希望你能够读下去。而不是看一眼题目就自以为知道具体是怎么处理了。

怎么降帧

从上文中,我已经提到了。我希望将游戏的帧数分为两种,一种逻辑帧,一种View帧。View帧是满帧在跑的。逻辑帧则是间隔执行的。也没错。上文中已经提到了,简单的区分这两种更新的实际也并不合适。因为依然会卡顿。那怎么才会不卡呢。将数据量分摊到各个帧里边。

怪物会有两种跟新模式

1、View更新:用来更新他的位置,动画一类

2、用来更新行为:攻击、打出伤害等等

 

主循环会有多个对象列表比如说6个

主循环会将每一次的Update标上记号。调用所有的对象的View更新方法和与标记相对应的对象列表的逻辑更新。

这样就将所有的逻辑分摊到了各个帧数里边。让各个帧数更平均一些。达到流畅的目的

转载于:https://www.cnblogs.com/anxin1225/p/5509466.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

delphi 更改DBGrid 颜色技巧

1、根据条件更改某一单元格的颜色 [delphi] view plaincopy procedure TMainFrm.First_DGDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); begin if DM.FirstListStatus.AsString生产 then begin …

mfc中UpdateData的用法

http://blog.csdn.net/ddjj_1980/article/details/51452289 UpdateData(TRUE)——刷新控件的值到对应的变量。(外部输入值交给内部变量)即:控件的值—>变量。UpdateData(FALSE)—— 拷贝变量值到控件显示。(变量的最终运算结果值交给外部输出显示)即:…

动画类的层次结构

CASpringAnimation类是CAABasicAnimation的子类 CAPropertyAnimation :是CAAnimation的子类,它支持动画地显示图层的keyPath,一般不直接使用。 iOS9.0之后新增CASpringAnimation类,它实现弹簧效果的动画,是CABasicAnim…

[原]小命令大作用:modprobe

调整网络为绑定模式,但启动时候会报错,此时执行命令 modprobe bonding 可以解决问题。 之前在磁盘方面遇到问题也是通过modprobe命令解决的,又遇到这个命令,似曾相识。于是看下该命令: Linux命令:modprobe …

sql语句优化之not in

多表关联想查a表中除去b表的可用not exists 效率比not in 更高 优化后的语句用时0.421秒 select john.*, (case when round((case john.sumcount when 0 then 0 else mycount * 100 / sumcount end), 2) > 100 then 100 else round((case john.sumcount when 0 then 0 else …

setup2go制作安装程序

QT程序设计完毕时,我们就要发布自己的程序,发布程序有两种方法:一是静态编译,二是制作程序安装包。 静态编译好麻烦,我从来没有成功过,所以我用了动态编译方法,设计完成时,用release…

gson-2.2.api简单

使用gson的tojson和fromjson实现对象和json的转换 Gson gson new Gson(); // Or use new GsonBuilder().create(); MyType target new MyType(); String json gson.toJson(target); // serializes target to Json MyType target2 gson.fromJson(json, MyType.c…

用户需求、己、竞争对手的关系

图一 图二 图三 如第一图所示:现在在市面上的产品基本上都可以归纳为这一方面, 如“用户需求”是网上购物的需求,以“己”是京东为例子,“己”的…

SharePoint 入门介绍

from:http://www.cnblogs.com/jianyus/archive/2013/01/11/2856963.html 前言:接触SharePoint两年有余,从一开始的小白,变成现在的菜鸟,一路走来,学到很多,现在,想把自己知道的东西&…

AJAX-服务器响应

服务器响应 如需获得来自服务器的响应,请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。 属性 描述 responseText 获得字符串形式的响应数据。 responseXML 获得 XML 形式的响应数据。 responseText 属性 如果来自服务器的响应并非 XML&#xff0c…

c#下不同命名空间的引用(一个project使用另外一个project的名称空间)

http://bbs.csdn.net/topics/300089064 两个命名空间在同一个项目中时,没有任何问题。 若两个命名空间不在同一个项目中,则变成两个程序集之间的互相引用。 程序集之间的引用无所谓循环不循环的问题。 但如果两个程序集要互相引用,并且两个…

数据结构比较型排序算法分析及选择

比较型算法分为五类: 1、插入排序:直接插入排序、折半插入排序、希尔排序; 2、选择排序:直接选择排序、堆排序; 3、交换排序:快速排序、冒泡排序; 4、归并排序; 5、基数排序&#xf…

onreadystatechange 事件

onreadystatechange 事件 当请求被发送到服务器时,我们需要执行一些基于响应的任务。 每当 readyState 改变时,就会触发 onreadystatechange 事件。 readyState 属性存有 XMLHttpRequest 的状态信息。 下面是 XMLHttpRequest 对象的三个重要的属性&#…

Frequent Pattern 挖掘之二(FP Growth算法)(转)

FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断得扫描整个数据库进行比对。为了达到这样的效果,它采用了一种简洁的数据结构,叫做frequent-pattern tree(频繁…

C# 两个类之间传递数据

1、通过全局变量 2、通过构造函数传递参数 3、通过委托实现通过委托例子:WebForm1 向Class1传递参数值: // namespace WebApplication2{public partial class WebForm1 : System.Web.UI.Page{//step1.声明一个委托public delegate void DoSomethingEvent…

可行性研究课后题

题目: 为方便储户,某银行拟开发计算机储蓄管理系统。储户填写的存款单或取款单由银行柜台业务员键入系统,如果是存款,系统记录存款人姓名、住址、存款类型、存款日期、利息等信息,并印出存款单给储户;如果是取款,系统进…

jQuery语法

jQuery不是W3C标准! jQuery使用CSS选择器来选取元素。 jQuery语法 一、jury语法是为HTML元素的选取编制的,可以对元素执行某些操作。 基础语法是:$(selector).action() .美元符号定义jQuery .选择符(selector)“查…

Sublime 解决目录显示为方块的问题

2019独角兽企业重金招聘Python工程师标准>>> 修改Perferences->Settings-User { "font_face": "Consolas Italic", #传说这个字体比较好看。 "font_size": 15, "ignored_packages": [ "Vintage" ], "dpi…

VS toolTip1控件的使用1

http://blog.csdn.net/Mr_Liyong/article/details/780141381、在工具栏找到“toolTip”控件后拖到窗体后,窗体下方会显示此控件则拖放成功。 2、单击此控件右键选择属性:开始 修改属性。 3、当添加一个TOOLTIP控件后,在WINFORM界面上所有的控…

python 代码片段9

#codingutf-8# 字符串指示符号 r表示raw u表示unicodemystringuthis is unicode!--by print mystring# raw表示告诉解释器不要转换字符串任何字符filerc:\temp\folder\robots.txt print file# 另一个实用raw的地方是正则表达式# 可以在内放任何的字符串,不需要转义&…