Algorithm 基于动态FPS的游戏引擎视频渲染

Algorithm 基于动态FPS的游戏引擎视频渲染,algorithm,video,time,frame,frame-rate,Algorithm,Video,Time,Frame,Frame Rate,我试图在我的游戏引擎中渲染一个预先导出的视频,但在尝试安排帧时遇到了问题。即,当以固定FPS导出视频时,引擎具有动态帧速率(可能高于或低于视频的)。当尝试在当前引擎帧中选择要渲染的视频帧时,我的算法不断遇到边缘情况,这会破坏视频的速度或视频帧的分布 我现在知道,可能没有一种算法能够在所有情况下都能完美运行,但有三种情况可能会在运行期间发生,算法应该涵盖: 引擎中的任意稳定帧速率,误差约为5%。(例如,如果平均帧时间为33.333ms,则所有帧持续时间都将在31.6666ms-35ms范围内。)

我试图在我的游戏引擎中渲染一个预先导出的视频,但在尝试安排帧时遇到了问题。即,当以固定FPS导出视频时,引擎具有动态帧速率(可能高于或低于视频的)。当尝试在当前引擎帧中选择要渲染的视频帧时,我的算法不断遇到边缘情况,这会破坏视频的速度或视频帧的分布

我现在知道,可能没有一种算法能够在所有情况下都能完美运行,但有三种情况可能会在运行期间发生,算法应该涵盖:

  • 引擎中的任意稳定帧速率,误差约为5%。(例如,如果平均帧时间为33.333ms,则所有帧持续时间都将在31.6666ms-35ms范围内。)

  • 任意半稳定帧速率,我认为基于时间轴的算法非常接近。我想你只需要用数学来定义你的欲望

    对于每个帧选择,我们可以考虑两种错误。设w为所选帧显示时的挂钟时间与根据视频帧速率显示时的时间之差。设d为所选帧的显示时间与之前显示的帧之间的差异误差


    定义这些错误的相对权重A和B,然后选择使Aw2+Bd2最小化的帧。您可以采用第二种方法并应用一些简单的平滑,例如,将帧向前推进最后两个值的平均值,始终向下舍入并向前传播错误,也就是说,当总和是奇数时,你向下取整得到一个整数,你在下一个总和上加1来平衡它

    所以1,3,1,3,1,3。。。将产生2,2,2,2,2。。。2,3,2,3,2,3会产生2,3,2,3,2。。。等

    伪代码:

    int prevValue = 0
    int error = 0;
    bool firstValue = true;
    int getNextValue(int value)
    {
        if(firstValue)
        {
            prevValue = value;
            firstValue = false;
        }
        int sum = value + prevValue + error;
        error = sum % 2; 
        prevValue = value;
        return sum / 2; // integer division
    }
    

    我喜欢你的问题,但我没有资格回答。。。只是想清楚。。。我会考虑走捷径,并迫使引擎框架,以配合工作的视频与问题时,我需要显示它…如果你需要一直显示视频,这可能不是很有效。如果是全屏视频,我根本不会使用引擎。@不幸的是,按照我的想象,一旦用户悬停在某些按钮上,视频就应该作为UI元素播放。至于引擎,我可能会选择这条路线(在视频播放时强制恒定FPS),但我真的很想知道是否有一种很好的方法可以解决这个问题,而不必改变引擎。我在数学上定义问题和目标时遇到了困难,您的回答对我帮助很大。然而,在应该间歇跳过帧的边缘情况下,第二个错误的定义仍然为不平衡留出了空间。我修改了第二个定义,将错误包含在选定帧的显示时间与之前显示的所有其他帧之间的差异中。现在,该算法以适当的方式处理边缘情况,并且展开公式(如果我们不想单独衡量每个差异)使我不必为每个帧存储增量时间。