保持思考,保持学习。
试问哪个前端开发不想深入了解浏览器呢,想了解它的过去,彼此互动的细节,日日陪伴的点点滴滴...🙂↔️
VSync,全称为Vertical Synchronization(垂直同步),是一种图形技术,用于将游戏或应用程序的帧率与显示器的刷新率同步,从而消除画面撕裂(Screen Tearing)现象。 画面撕裂是指显卡输出帧率与显示器刷新率不匹配时,屏幕上同时显示多个帧的部分内容,导致图像水平分裂。其核心是通过等待显示器的垂直空白间隔(VBlank)信号,将 GPU 的帧渲染输出与显示器的刷新率精确对齐,从而消除屏幕撕裂(Screen Tearing)。
显示器(无论 CRT、LCD 或 OLED)刷新一帧的原理类似:逐行扫描。
VSync(垂直同步)与浏览器密切相关,主要体现在浏览器渲染流水线中:浏览器使用 VSync 信号同步网页帧渲染与显示器刷新率(通常 60Hz,每 16.67ms 一帧),确保动画、滚动和视频播放平滑无撕裂(screen tearing)。 这类似于游戏中的 VSync,但浏览器优化为合成线程(Compositor)主导,减少主线程(JS/布局)阻塞导致的卡顿(jank)
VSync 并非 Chrome 自己产生,而是来自操作系统或硬件:
| 平台 | VSync 来源 |
|---|---|
| Android | SurfaceFlinger + HWC(Hardware Composer)通过 DispSync 软件 PLL 生成 1 |
| Linux | DRM/KMS 子系统(Direct Rendering Manager / Kernel Mode Setting)提供vblank 事件 |
| Windows | DirectX 的IDXGIOutput::WaitForVBlank() 或 DWM(Desktop Window Manager)合成器 |
| macOS | Core Video 的CVDisplayLink,与显示器刷新率同步 |
| ChromeOS | 基于 Linux DRM,但通过Ozone 抽象层接入 |
VSyncProviderChrome 定义了 VSyncProvider 接口(//ui/compositor/vsync_provider.h),各平台实现具体逻辑:
AndroidVSyncProvider
Choreographer.FrameCallbackChoreographer.postFrameCallbackDrmVSyncProvider 或 WaylandVSyncProvider
DRM_EVENT_VBLANK 或 Wayland 的 frame 事件DisplayLinkMac
CVDisplayLinkSetOutputCallback当 VSync 到来时,这些 Provider 会调用:
cpp
Viz Display Compositor这是 Chrome 图形栈的核心——Viz(Visuals)系统,负责帧调度和合成。
DisplayScheduler(//components/viz/service/display/display_scheduler.cc)
OnVSyncBeginFrameBeginFrameSource
BeginFrameArgs(含帧 ID、时间戳、间隔);plaintext
BeginFrame 后:
transform, opacity)needs_main_frame = true)终于到了喜闻乐见的主线程环节,下面的东西相对于前端将会相对熟悉些。
needs_main_frame,则:
requestAnimationFrame 回调;LayerTree 给合成线程。