有关帧率

由于人类眼睛的特殊生理结构,如果所看画面之帧率高于16的时候,就会认为是连贯的,此现象称之为视觉暂留。这也就是为什么电影胶片是一格一格拍摄出来,然后快速播放的。
  而对游戏,一般来说, 第一人称射击游戏 比较注重FPS的高低,如果FPS<30的话,游戏会显得不连贯。所以有一句有趣的话:“FPS(指FPS游戏)重在FPS(指帧率)。
  每秒的帧数(fps)或者说帧率表示图形处理器处理场时每秒钟能够更新的次数。高的帧率可以得到更流畅、更逼真的动画。一般来说30fps就是可以接受的,但是将性能提升至60fps则可以明显提升交互感和逼真感,但是一般来说超过75fps一般就不容易察觉到有明显的流畅度提升了。如果帧率超过屏幕刷新率只会浪费图形处理的能力,因为 监视器 不能以这么快的速度更新,这样超过刷新率的帧率就浪费掉了。

常见媒体帧率

   电影: 24fps
   电视(PAL): 25fps
   电视(NTSC): 29.97fps
   CRT显示器: 60Hz-85Hz
   液晶显示器: 60Hz

帧率影响因素

  既然刷新率越快越好,为什么还要强调没必要追求太高的刷新率呢?
  其中原因是在显示‘分辨率’不变的情况下,FPS越高,则对显卡的处理能力要求越高。
  电脑中所显示的画面,都是由显卡来进行输出的,因此屏幕上每个像素的填充都得由显卡来进行计算、输出。
  当画面的分辨率是1024×768时,画面的刷新率要达到24帧/秒,那么显卡在一秒钟内需要处理的像素量就达到了“1024×768×24=18874368”。
  如果要求画面的刷新率达到50帧/秒,则数据量一下子提升到了“1024×768×50=39321600”。
  FPS与分辨率、显卡处理能力的关系如下:
  处理能力=分辨率×刷新率。这也就是为什么在玩游戏时,分辨率设置得越大,画面就越不流畅的原因了

显示器的刷新率

  刷新频率:即屏幕刷新的速度。
  刷新频率越低,图像闪烁、停顿和抖动的就越厉害,眼睛疲劳得就越快。
  采用70Hz以上的刷新频率时才能基本消除闪烁,显示器最好稳定工作在允许的最高频率下,一般是85Hz。
  在显示器内部,有一些振荡电路。
  人们通常所说的刷新频率,指的就是振荡电路的频率。
  刷新频率的计算公式是:水平同步扫描线X帧频=刷新频率。
  普通显示器的刷新频率在15.75kHz-95kHz间。
  15.75kHz是人体对显示器最低要求的刷新频率,是由525(线)X30(fps)=15.75kHz计算所得。
  由此,我们可以逆推出显示器扫描一条水平线所花的时间:众所周知,时间和频率是倒数关系,即1/频率=时间。
  在这里,1/15.75kHz= 63.5us(微秒),也就是说在每帧525线、每秒30帧的模式下,显示器扫描一条水平线所花的时间是63.5微秒。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`requestAnimationFrame` 是一个用于控制 Web3D 渲染帧率的关键 API,它允许开发者以浏览器的帧速率来执行操作,通常不会超过浏览器硬件能够达到的最高速度(如165Hz)。这对于创建平滑流畅的动画和交互式内容至关重要。 ### `requestAnimationFrame` 的基本用法 #### 定义与作用 `requestAnimationFrame` 接受一个函数作为参数,该函数将在下一次重绘之前被调用。这个API通过浏览器内部机制来管理调用时机,因此可以有效避免不必要的 CPU 和 GPU 负载。 #### 参数 - **回调函数** (`callback`):这是您希望在下一帧绘制时执行的函数。这个函数通常负责更新视图或动画状态。 #### 返回值 `requestAnimationFrame` 返回一个整数值,表示当前正在等待执行的动画请求的 ID。这个 ID 可以用来取消特定的请求(更多细节见下方)。 #### 使用示例 假设我们想要实现一个简单的动画循环,可以通过以下方式设置帧率: ```javascript let animationId; function animate(timeStamp) { // 更新动画状态,例如改变元素的位置或大小 let x = Math.sin(timeStamp / 100) * 100; // 更新 DOM 或其他渲染逻辑 document.getElementById('myElement').style.left = `${x}px`; // 请求下一个帧 animationId = requestAnimationFrame(animate); } // 初始化动画 animate(); ``` ### 控制帧率的方法 #### 默认帧率 `requestAnimationFrame` 自动基于浏览器的刷新率工作,这意味着它的性能依赖于用户的显示器刷新率。对于常见的 60Hz 显示器来说,每次重绘间隔大约是 16.6ms。 #### 手动控制帧率 若要手动调整帧率,可以利用定时器(如 `setTimeout`)结合计算来模拟 `requestAnimationFrame` 的行为。这种方法可能导致更频繁的调用,从而可能降低整体性能并增加延迟。下面是一个示例: ```javascript let frameCount = 0; const targetFrameRate = 60; // 每秒期望帧数 const oneSecondInMs = 1000; const delayPerFrame = oneSecondInMs / targetFrameRate; function animate(time) { frameCount++; const elapsedTime = time - startTime; // 如果已经过了一个完整的帧周期,则继续 if (elapsedTime >= delayPerFrame) { // 更新动画状态 // ... // 继续到下一次帧 setTimeout(() => { requestAnimationFrame(animate); }, delayPerFrame); } } // 启动动画 startTime = Date.now(); animate(Date.now()); ``` ### 总结与注意事项 1. **性能优化**:虽然手动控制帧率能提供更多灵活性,但在大多数情况下,依赖浏览器的自动管理功能更为高效且不易引起性能问题。 2. **内存管理**:频繁的请求和释放资源可能会导致内存泄漏,尤其是在长时间运行的应用程序中。 3. **兼容性**:尽管现代浏览器普遍支持 `requestAnimationFrame`,但在一些旧版本或特定环境下可能存在差异或限制。 ### 相关问题: 1. 如何检测和报告 `requestAnimationFrame` 的性能瓶颈? 2. 是否存在替代 `requestAnimationFrame` 来控制渲染帧率的技术或库? 3. 当多个动画并存时,如何合理分配帧率以保证流畅性和效率?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值