Unity3D 是否支持在性能不足时强制固定 FPS (拉长时间)?

2020-05-26 18:57:12 +08:00
 feng32
假定在 Unity 中播放一段动画并渲染执行 (动画原本长度是 10s)

性能足够时,FPS 固定在默认的 60,执行动画耗时 10s,总计渲染了 600 帧画面
性能不足时,FPS 掉到 30,此时动画仍然耗时 10s,画面总帧数会下降到 300,每两帧画面的间隔时间加倍了

但是有没有办法,让 FPS 固定在 60,拉长总执行时间,维持总画面帧数呢?
3260 次点击
所在节点    程序员
16 条回复
learningman
2020-05-26 18:59:47 +08:00
你理解了 FPS 的意思吗?
Frame Per Second,你的时间只能是 1s
如果你说你想导出一段视频,那么可以,视频的帧率可以为 60,渲染 1 帧 1 小时都可以
across
2020-05-26 18:59:48 +08:00
性能不够 60fps 是必然存在的现象。
是你代码写错了。动画时间本来就不应该受帧数影响,是受时钟影响。如果你要固定时间更新,那该用 FixedUpdate 。
feng32
2020-05-26 19:18:14 +08:00
@learningman @across
不是真的游戏,大致的应用场景,就是把 fbx 动画转视频 (在某个具体场景中进行渲染)
across
2020-05-26 19:24:52 +08:00
@feng32 视频写入不是有时间轴的么,deltaTime 一致的有啥影响····
这要是 fps 不够,那也是你硬件不行。
Mutoo
2020-05-26 19:25:01 +08:00
@feng32 在 fixedUpdate 下的逻辑是必然执行的,在 Update 下的逻辑会被跳过(所谓掉帧)。
param
2020-05-26 19:25:29 +08:00
你的意思就是不跳帧吧。虽然我不知道游戏开放一般怎么称呼的,我只会“跳帧”这个词。
feng32
2020-05-26 19:26:54 +08:00
视频是固定帧率的,当性能问题出现时,希望 Unity 引擎会 “阻塞”

“阻塞” 消失时,Unity 中的时间不发生跳跃,而是继续渲染下一帧
across
2020-05-26 19:28:40 +08:00
@feng32
你的录屏机制弄错了。
应该是手动调用动画更新,时间间隔按要求设置为 T,然后调用一次 Update,录一帧视频,录像帧时间间隔也是 T,和 unity 渲染速度无关。
feng32
2020-05-26 19:29:34 +08:00
@param 对的,感觉 “不跳帧” 和大部分传统游戏的设计思路是相反的,不知道 Unity 是否支持
reus
2020-05-26 19:33:49 +08:00
我要能固定每秒 60 帧,怎么还会性能不够?你这个要求根本就自相矛盾。
动画放慢一倍,时间自然就拉长了。
feng32
2020-05-26 19:57:14 +08:00
@reus 并不是用 1s 的时间渲染 60 帧然后录屏,而是可以接受用 2s 的时间渲染 60 帧 (但是此时动画时间仍是 1s)

---

这个流程是不是有点奇怪?我再举个例子:

Unity 将画面输出给一个媒体服务器进行视频编码,一开始的 FPS 是 60 fps,Unity 已经执行了 1s
此时 Unity 到视频编码服务器之间的网络断了 1s,此时作为流水线的起点,Unity 程序应当暂停渲染,以保证传输管道不会溢出 (就好像在 Unity Editor 里按了暂停按钮一样)
当真实时间是 2.0s 时,动画时间在 1.0s ,网络恢复了,此时 Unity 不能跳帧;观众则会在画面卡了 1s 后,继续以正常速度观看到后续的动画
LnTrx
2020-05-26 20:06:21 +08:00
Unity 作为游戏引擎,大家看到自然默认是实时渲染输出。建议楼主在表述的过程中区分清楚“动画播放的时间”和“渲染的物理时间”,否则 FPS 的含义乱套了
LnTrx
2020-05-26 20:10:52 +08:00
楼主的问题其实是:Unity 是否支持离线渲染
feng32
2020-05-26 20:58:15 +08:00
@LnTrx Offline Render 是一个不错的关键字,可以搜到不少的离线渲染插件

不过一些 Offline Render 插件的描述也挺让人迷惑的,比如这个:

Offline Render is an easy to use, realtime capture plugin for Unity

看描述,还是无法区分它到底是实时的还是非实时的 (是否会跳帧)

那么问题来了:Unity 支持不跳帧的离线渲染吗?
Nzelites
2020-05-26 23:38:20 +08:00
我猜楼主的意思是希望帧间(游戏)时间不超过一个值
一个做法是 update 时取实际渲染时间 超过阈值则在该帧对游戏全局时间做一个缩放使(游戏)时间间隔小于等于期望上限
云码农 思路仅供参考
meowhuang
2020-05-28 20:30:12 +08:00
前两天正好有一个类似的需求。我后来是用:Time.captureFramerate 实现的。

https://docs.unity3d.com/ScriptReference/Time-captureFramerate.html

如果楼主只是要录屏的话,Unity Recoder 自带这个功能

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/675722

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX