• 请不要在回答技术问题时复制粘贴 AI 生成的内容
feng32
V2EX  ›  程序员

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

  •  
  •   feng32 · May 26, 2020 · 3974 views
    This topic created in 2200 days ago, the information mentioned may be changed or developed.
    假定在 Unity 中播放一段动画并渲染执行 (动画原本长度是 10s)

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

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

    “阻塞” 消失时,Unity 中的时间不发生跳跃,而是继续渲染下一帧
    across
        8
    across  
       May 26, 2020   ❤️ 1
    @feng32
    你的录屏机制弄错了。
    应该是手动调用动画更新,时间间隔按要求设置为 T,然后调用一次 Update,录一帧视频,录像帧时间间隔也是 T,和 unity 渲染速度无关。
    feng32
        9
    feng32  
    OP
       May 26, 2020
    @param 对的,感觉 “不跳帧” 和大部分传统游戏的设计思路是相反的,不知道 Unity 是否支持
    reus
        10
    reus  
       May 26, 2020 via Android
    我要能固定每秒 60 帧,怎么还会性能不够?你这个要求根本就自相矛盾。
    动画放慢一倍,时间自然就拉长了。
    feng32
        11
    feng32  
    OP
       May 26, 2020
    @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  
       May 26, 2020
    Unity 作为游戏引擎,大家看到自然默认是实时渲染输出。建议楼主在表述的过程中区分清楚“动画播放的时间”和“渲染的物理时间”,否则 FPS 的含义乱套了
    LnTrx
        13
    LnTrx  
       May 26, 2020
    楼主的问题其实是:Unity 是否支持离线渲染
    feng32
        14
    feng32  
    OP
       May 26, 2020
    @LnTrx Offline Render 是一个不错的关键字,可以搜到不少的离线渲染插件

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

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

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

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

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

    如果楼主只是要录屏的话,Unity Recoder 自带这个功能
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3191 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 12:57 · PVG 20:57 · LAX 05:57 · JFK 08:57
    ♥ Do have faith in what you're doing.