Unity 协程和帧率

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

最近用协程做一些事,发现协程运行频率受到帧率影响,打个比方,一个用协程实现的进度条,在同步 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 回帖 • 134 关注
  • 帧率
    1 引用

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 177 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 4 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    167 引用 • 595 回帖
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    157 引用 • 289 回帖
  • Anytype
    3 引用 • 31 回帖 • 14 关注
  • gRpc
    11 引用 • 9 回帖 • 89 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 3 关注
  • 倾城之链
    23 引用 • 66 回帖 • 159 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 76 回帖 • 1 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 736 关注
  • Access
    1 引用 • 3 回帖 • 5 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 17 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 541 关注
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖 • 2 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 170 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    182 引用 • 1010 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    99 引用 • 367 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 408 回帖 • 487 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 253 关注
  • Lute

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

    28 引用 • 197 回帖 • 28 关注
  • LeetCode

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

    209 引用 • 72 回帖
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 679 关注
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    31 引用 • 96 回帖