Android 垂直同步和三重缓冲[通俗易懂]

Android 垂直同步和三重缓冲[通俗易懂]帧率是每秒钟内游戏能够渲染的画面数量,取决于电脑的硬件配置。屏幕刷新率是屏幕在每秒钟能刷新的次数,单位是赫兹(Hz),这取决于显示器的硬件配置。假设CPU/GPU性能高在你的游戏中能够获得超过200帧的画面,但是由于显示器刷新率只有30Hz,只能“抓取”其中的30帧进行显示,最终你所看到的画面也是30帧。屏幕刷新率越高,你在每秒钟内就能看到越多的画面,因此对你来说,画面也就更加“流畅”、“清晰”。一个页面的渲染流程大致分为一下几步,CPU将界面处理对应的图形数据,然后GPU将图形数据栅格化,最后屏

大家好,又见面了,我是你们的朋友全栈君。

帧率是每秒钟内游戏能够渲染的画面数量,取决于电脑的硬件配置。屏幕刷新率是屏幕在每秒钟能刷新的次数,单位是赫兹(Hz),这取决于显示器的硬件配置。假设CPU/GPU 性能高在你的游戏中能够获得超过200帧的画面,但是由于显示器刷新率只有30Hz,只能“抓取”其中的30帧进行显示,最终你所看到的画面也是30帧。
屏幕刷新率越高,你在每秒钟内就能看到越多的画面,因此对你来说,画面也就更加“流畅”、“清晰”。

一个页面的渲染流程大致分为一下几步,CPU 将界面处理对应的图形数据,然后GPU 将图形数据栅格化,最后屏幕读取 GPU 的缓冲区来显示。
在最初屏幕读取缓冲区只有一个,当界面还没有渲染完毕时,GPU 已经将下一帧的界面栅格化,帧率和刷新频率不同且没有垂直同步会这样会造成画面撕裂的情况,因为只有一个缓冲区,上部分已经显示下一帧,而下部分是上一帧。

为了解决帧率大于刷新频率就出现了垂直同步+双缓冲方案,目前主流的设备帧率是60帧,也就是每16毫秒一帧画面,垂直同步就是以单位时间(1000/帧率)来调度刷新,这样来保证页面不撕裂,当界面还没渲染完毕时, GPU 会把下一帧的数据栅格化数据写入 Back Buffer,当页面渲染完毕,将 Frame Buffer 的指针指向 Back Buffer,这样做到无缝衔接。

GPU 有两块缓冲区Frame Buffer 和 Back Buffer,Frame Buffer 是一个二维数组,里面存放的是屏幕对应到每一个像素点的颜色信息,CPU 计算图形数据完毕后会写入 Back Buffer,GPU 会定时对 Frame Buffer 和 Back Buffer 进行处理,Back Buffer 也并不一定是必然存在的,首先它是因为屏幕刷新率和帧率不同步造成的,当二者不同时,为了避免屏幕撕裂这个时候才会创建 Back Buffer,但是二重缓冲还是有问题,举例说明如果主线程要处理的东西比较多,导致 CPU/GPU 完成一帧用了26毫秒,那么垂直同步机制的回调在本该在16毫秒的刷新是无效的,因为当前的缓冲区还是上一帧的数据,因为当前帧的数据还没有计算完毕并写入缓冲区,,会产生 Jank也就是丢帧,同时在20毫秒至32毫秒这段时间,CPU/GPU 是闲置的。

为了解决Jank丢帧问题,Android 比 IOS 多设计了一个缓冲区 Triple Buffer,为了不让 CPU/GPU 闲置,Triple Buffer 和 Back Buffer 的工作原理是一样的,相当于多了一个Back Buffer, 同时也是用到时才会创建,为了提高性能。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143414.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • spring aop 切入问题

    spring aop 切入问题spring aop 切入问题

  • 计算机网络之TCP/UDP协议详解[通俗易懂]

    计算机网络之TCP/UDP协议详解[通俗易懂]深度理解TCP/IP1.TCP基础知识1.1什么是TCP?1.2什么是TCP连接?1.3TCP协议段格式1.4TCP主要特点2.UDP基础知识2.1UDP是什么?2.2UDP的协议段格式2.3UDP的主要特点2.4UDP的缓冲区3.TCP和UDP区别总结4.TCP保证可靠的机制4.1重传机制(这里只说了超时重传)4.2滑动窗口4.3流量控制4.3拥塞控制1.TCP基础知识1.1什么是TCP?TCP是⾯向连接的、可靠的、面向字节流的传输层通信协议面向连接:只能一对一连接,

  • wptx64能卸载吗_wptx64是什麼「建议收藏」

    wptx64能卸载吗_wptx64是什麼「建议收藏」SOLIDWORKSPDMServer和SOLIDWORKSSolidNetWorkLicenseManager,都支援在WindowsServer2008R2或WindowsServer2012和2012R2上進行安裝。WindowsInstaller:,(不適用).WindowsPerformanceToolkit:,WPTx64-x86_en-us…

  • 交换机zone 的概念 和交换机指令「建议收藏」

    交换机zone 的概念 和交换机指令「建议收藏」配置Zone需要涉及到三个对象的配置Alias,Zone,Configuration。Alias可以把设备的WWN或Domain,Port声明为Alias,用于更好更直观的标示设备。使用Alias的主要目的是方便用户的使用,想象一下记住一个人的身份证号和名字的区别就可以明白其中的道理,使用Alias就想给设备启名字一样。声明Alias的另外一个益处是便于Zone中成员的更换。当Zone

  • 基于遗传算法的BP神经网络优化算法

    基于遗传算法的BP神经网络优化算法遗传算法优化BP神经网络分为BP神经网络结构确定、遗传算法优化和BP神经网络预测3个部分。其中,BP神经网络结构确定部分根据拟合函数输入输出参数个数确定BP神经网络结构,这样就可以确定遗传算法的优化参数个数,进而确定遗传算法个体的编码长度。因为遗传算法优化的参数是BP神经网络的初始权值和阈值,只要网络的结构已知,权值和阈值的个数就已知了。种群中的每个个体都包含了一个网络所有权值和阈值,个体通过

  • vbs代码如何使用Wscript调试

    vbs代码如何使用Wscript调试转自:vbs代码如何使用Wscript调试有些朋友用vbs写代码习惯用MsgBox输出,有时候一段代码调试完输出了一堆MsgBox,调完了还要删掉。遇到想要查看对象的情况更是累的不行…然而,一个编程语言怎么可能没有更好的调试方法,MsgBox写累了的时候试一下用wscript?wscript是Windows脚本宿主,它不需要在调用其属性和方法之前进行实例化,并且

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号