V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
feng32
V2EX  ›  程序员

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

  •  
  •   feng32 · 2020-05-26 18:57:12 +08:00 · 3263 次点击
    这是一个创建于 1676 天前的主题,其中的信息可能已经有所发展或是发生改变。
    假定在 Unity 中播放一段动画并渲染执行 (动画原本长度是 10s)

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

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

    “阻塞” 消失时,Unity 中的时间不发生跳跃,而是继续渲染下一帧
    across
        8
    across  
       2020-05-26 19:28:40 +08:00   ❤️ 1
    @feng32
    你的录屏机制弄错了。
    应该是手动调用动画更新,时间间隔按要求设置为 T,然后调用一次 Update,录一帧视频,录像帧时间间隔也是 T,和 unity 渲染速度无关。
    feng32
        9
    feng32  
    OP
       2020-05-26 19:29:34 +08:00
    @param 对的,感觉 “不跳帧” 和大部分传统游戏的设计思路是相反的,不知道 Unity 是否支持
    reus
        10
    reus  
       2020-05-26 19:33:49 +08:00 via Android
    我要能固定每秒 60 帧,怎么还会性能不够?你这个要求根本就自相矛盾。
    动画放慢一倍,时间自然就拉长了。
    feng32
        11
    feng32  
    OP
       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
        12
    LnTrx  
       2020-05-26 20:06:21 +08:00
    Unity 作为游戏引擎,大家看到自然默认是实时渲染输出。建议楼主在表述的过程中区分清楚“动画播放的时间”和“渲染的物理时间”,否则 FPS 的含义乱套了
    LnTrx
        13
    LnTrx  
       2020-05-26 20:10:52 +08:00
    楼主的问题其实是:Unity 是否支持离线渲染
    feng32
        14
    feng32  
    OP
       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
        15
    Nzelites  
       2020-05-26 23:38:20 +08:00
    我猜楼主的意思是希望帧间(游戏)时间不超过一个值
    一个做法是 update 时取实际渲染时间 超过阈值则在该帧对游戏全局时间做一个缩放使(游戏)时间间隔小于等于期望上限
    云码农 思路仅供参考
    meowhuang
        16
    meowhuang  
       2020-05-28 20:30:12 +08:00   ❤️ 1
    前两天正好有一个类似的需求。我后来是用:Time.captureFramerate 实现的。

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

    如果楼主只是要录屏的话,Unity Recoder 自带这个功能
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   947 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:57 · PVG 05:57 · LAX 13:57 · JFK 16:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.