Unity 协程和帧率

本贴最后更新于 2315 天前,其中的信息可能已经时移世易

最近用协程做一些事,发现协程运行频率受到帧率影响,打个比方,一个用协程实现的进度条,在同步 vsync 为一倍的时候为 60 帧/s,这个进度条可能会更快的完成工作
而开 2 倍同步时,这个进度条明显的慢了下来,而当不开 vsync 时,这个进度条会更快。
我知道这个取决与在协程里是否使用 yield return 0 等待下一帧继续运行,关键是下一帧发生在什么时候,如果设置的帧数很低,可能用协程处理相同的工作需要更多时间
这个问题是最近研究帧率这个玩意的时候,发现的,还发觉一些游戏,在帧率不同的时候,表现有很多不一样,甚至有的在一些帧率下会存在 bug

帧率个人认为是一个非常麻烦的问题,一般来说,有二种情况,一种是运行帧率大于设计帧率,一种是运行帧率小于设计帧率
当运行帧率大于设计帧率时,比如机器以 60FPS 运行 而动画设计为 30FPS,这时可以确认的是机器能带的动动画,,机器的 2 帧等于动画的一帧。这样机器跑 1 秒,动画也跑 1 秒,机器跑 60 次 update,而动画可以通过在每 2 个关键帧之间做插值获得更平滑的效果
当运行帧率小于设计帧率时,比如机器以 30FPS 运行,动画设计为 60FPS 1S 数据 60 帧,这时,机器每秒运行 30 次 update,而要显示 60 帧动画,这是不可能实现的,所以这时候一般来说,是发生了跳帧,即有一半的帧,没有显示出来。
现在当我遇见情况 2 时,我会累计播放时间,当累计播放时间超过 1/60 时候,我会做一个无限循环,只要这个累计时间超过 1/60 时,就直接播放下一帧 然后累计时间减去 1/60。这样一个 update 就会对应多个 1/60 帧,代码示例

static float fps = 1.0f / 30.0f;
void Update()
{
playedTime += Time.deltaTime;
while (playedTime >= fps / speed)
{
PlayNextFrame();
playedTime -= fps /speed;
speed = getAnimationSpeed();
}
}
speed 是动画播放速度,比如 speed 变化为 2 时,原本播放一帧需要 1/30,改变速度后每一帧就为 1/60,那么同样的 playedTime 就能跨越更多帧
而当 speed 变化为 0.5 时,那么帧率变化为 1/15,也就是需要更多的时间跨越一帧,这样无论 update 的间隔为多久,都没关系,但是事实上,只有运行帧率足够多的时候,动画才不会跳帧。
speed 不可以为 0

还不知道 unity 自带的动画系统怎么处理这些情况的,假设某些帧被跳过,那么帧上的事件还会执行吗,如果还会,那么说明他的跳帧也是通过累计处理的,也就是实际上每次 update 里,他都会进行一系列帧的播放,每一个经过的帧都会处理到

在处理播放流星.net 版本的角色骨骼动画和特效时,遇见很多类似帧率的问题,类似,特效与动作不合拍,往往是动作已经播放了,特效慢了,或者特效快了,总之跟帧率有关系的,只要运行帧率稍微低一点,那么动画和特效就很难合拍
很伤脑筋。之前做的时候,一直没考虑运行平台的帧率问题,现在看来,需要把动作和特效在 IOS 上跑 30FPS 时调整合拍。

  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 119 关注
  • 帧率
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖 • 4 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    133 引用 • 796 回帖
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 371 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 5 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 188 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 571 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 36 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 1 关注
  • Word
    13 引用 • 41 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 8 关注
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 312 关注
  • Outlook
    1 引用 • 5 回帖 • 4 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 4 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 818 关注
  • Lute

    Lute 是一款结构化的 Markdown 引擎,支持 Go 和 JavaScript。

    29 引用 • 202 回帖 • 28 关注
  • gRpc
    11 引用 • 9 回帖 • 99 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 762 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    229 引用 • 1432 回帖 • 1 关注
  • AWS
    11 引用 • 28 回帖 • 7 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 1 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖 • 2 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 465 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖
  • Visio
    1 引用 • 2 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    345 引用 • 753 回帖 • 1 关注