首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用动态FPS在游戏引擎中绘制视频

用动态FPS在游戏引擎中绘制视频
EN

Stack Overflow用户
提问于 2020-02-16 15:35:51
回答 1查看 345关注 0票数 2

我试图在我的游戏引擎中渲染一个预先导出的视频,并且在试图安排帧时偶然发现了问题。也就是说,当视频以固定的FPS输出时,引擎具有动态帧速率(可能高于或低于视频的)。当试图选择在当前引擎帧中渲染哪个视频帧时,我的算法总是遇到边缘情况,这会破坏视频的速度或视频帧的分布。

在这一点上,我知道可能没有任何算法在所有情况下都能完美地运行,但是有三种情况可能在运行时发生,应该由算法来处理:

  1. 在引擎中任意稳定帧速率,误差约为5%。(例如,如果平均帧时为33.333ms,则所有帧持续时间都在31.66ms-35 is range.)
  2. Arbitrary半稳定帧速率范围内,其中<5%的帧的持续时间超出了误差范围。
  3. 稳定帧速率可在视频播放期间更改为不同的稳定帧速率。

)

在这3种情况下,下列情况应成立:

  1. 在任意一段时间内进行观察时,视频呈现的速度与视频在原始FPS上呈现的速度相同,
  2. 在任意一段时间内进行观测时,引擎具有稳定的帧速率,帧分布应该是均衡的。

考虑到所有这些,我尝试了两种解决方案,即使有几种启发式方法,它们也没有产生好的效果。

  1. :一种非常天真的解决方案,在这种解决方案中,当前帧的增量时间乘以帧速率,结果是四舍五入的,视频回放是由那么多帧提出的。虽然该解决方案在某些帧速率下工作得很好,但在其他帧速率下的速度差异太大。例如,如果视频为60 For,引擎呈现在30 For,则每个引擎帧都将视频播放提前2帧,这是完美的。然而,即使在39 FPS时,由于四舍五入的影响,每个引擎帧的回放仍然只能提前2帧,导致视频速度下降。
  2. A基于时间线的解决方案,我们跟踪所有以前的引擎帧的累积持续时间。将该帧和当前引擎帧的持续时间相加,再将其舍入到视频帧持续时间的最近倍数,得到应该在引擎中呈现的近似视频帧。这种解决方案很好地平衡了视频速度,但是有很多边缘情况下,帧分布变得非常不平衡,导致在视频中口吃。使用与前面相同的例子,视频为60 are,引擎为30 are,有一个边缘情况,其中一个帧的持续时间为41.66666ms将导致视频帧被推进为(1,3,1,3,1,3,1,3.)而不是(2,2,2,2,2,2.).

我想我的问题是:已知的算法和启发式算法是否存在问题,可以简化为这个问题?如果没有,是否有一个很好的启发式方法,可以在我前面描述的3种情况下产生更好的结果?

EN

回答 1

Stack Overflow用户

发布于 2020-02-17 03:23:32

您可以采取第二种方法,并应用一些简单的平滑,例如,将您的帧按最后两个值的平均值前进,总是向下舍入并向前传播错误,即当和是奇数时,然后将整数加到下一个和中得到一个整数来平衡它。

所以1,3,1,3,1,3.会产生2,2,2,2,2.2,3,2,3,2,3产生2,3,2,3,2,2,2.等

伪码:

代码语言:javascript
运行
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60250112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档