加入
发新帖
发表于 2014-1-21 22:07 | 查看: 2354| 回复: 4
本帖最后由 wubugui 于 2014-1-21 22:30 编辑

我写了个角色控制,使用CharacterController来移动对象,检测帧率的时候,始终发现低帧飘过,后来Profiler了一下发现下面这些数据
QQ截图20140121215853.jpg

23.jpg
这个move()怎么会有这么高的代价,以至于单单是一个控制脚本的Update就占到了1/4...
不直到你们的游戏一般光跑个控制加空白场景需要多少帧,我是始终在55左右,而且波动极大,偶尔还会跌倒40来帧,我看其他范例都是几乎满帧,为啥这个东西就这么耗?
另外好像射线和获取组件也都比较耗但是貌似都没有这个move厉害

收藏回复 显示全部楼层 道具 举报

发表于 2014-1-21 23:05
发现你大量使用FindGameObject  GetComponment 这些函数, 应该是使用习惯的问题。

这些函数的开销很大,所以不能放在频繁调用的函数里。例如 Update()

最好的使用方式是设置一个全局变量,只在Start 或者 OnEnable的函数里调用,对全局变量赋值。

然后再在调用频繁的函数中使用。

点评 回复 显示全部楼层 道具 举报

wubugui 发表于 2014-1-21 23:42
我故意加了两个这样函数并把他们都点出来是为了说明即使加上这些函数整体的时间占用也没有move多,去掉所有这些函数之后,move也还是在20%到40%之间,我是很疑惑这个move函数为啥占用那么高
发表于 2014-1-22 01:21
楼主如果按你第一个profile的截图来看,你的帧时间是 0.61 / 23.4% = 2.65ms. 也就是说你的瞬时帧率应该在300以上才对。不知道你的55帧是怎么出来的。。。
只看百分比不看运算时长的profile是在耍流氓。你在一个空白场景里只跑一个角色,没有其他逻辑,CharacterController不给你占满才怪。。
controller确实费,但是还没费到没法跑的地步。move里面应该是要进行好多次的物理碰撞检测。move的消耗跟物理场景的复杂度有很大关系。
我们以前做的一个射击游戏,每个角色一个CharacterController,同时10几个人在PC上没什么大碍。
还有如果你的游戏要是不太依赖物理,大可以不用。

点评 回复 显示全部楼层 道具 举报

ShirenY 发表于 2014-1-22 15:21
自己计算的fps和editor里显示的老是不一样,我也很纳闷,Unity应该出个计算fps的API。 你是在手机上还是PC上?如果是PC或者editor里可以把 Application.targetFrameRate 赋值为-1来取消帧数限制,手机就没办法。
wubugui 发表于 2014-1-22 13:18
我也觉得奇怪,我是用Time.realtimeSinceStartup来测算的帧率,最高从来都在60左右波动,后来发现分析器里面貌似出现了等待函数,unity应该是默认锁定在60帧的,但是根据分析器算几乎都上百帧,所以越想越觉得焦虑
发表于 2014-1-22 12:15
CharacterController 效率很低,特别是在移动遇到阻挡的情况下
建议自己用Physics下的函数实现一个
如果非FPS操作,可以根据游戏内容,写个适合的角色移动代码

点评 回复 显示全部楼层 道具 举报

wubugui 发表于 2014-1-22 13:19
谢谢了解了
发表于 2014-1-22 13:07
Move效率虽低,不过绝少会因为他导致游戏低FPS,例如《蜡烛人》就是用的CharacterController.Move做移动。
Editor里的FPS显示本身就飘忽不定,它会为了保持FPS与屏幕刷新率同步而故意压低帧率(经常会看到的WaitForXXX就是干这个的),不用太在意,板凳的计算有道理,要关注脚本执行时间,而不是FPS。

回复 显示全部楼层 道具 举报

您需要登录后才可以回帖 登录 | 加入

搜索

繁體   

返回顶部