VSync — định nghĩa, nguyên lý hoạt động và cấu hình

Tác giả: IT Sectr Đã đăng: 2026-04-01 Thời gian đọc: 8 phút

VSync (Đồng bộ hóa dọc) là công nghệ đồng bộ hóa đầu ra của mỗi khung hình GPU mới với tần số làm tươi màn hình, loại bỏ hiện tượng xé hình. Theo Apple Metal Documentation, đồng bộ hóa với VBlank là bắt buộc để rendering mượt mà trên thiết bị di động. Xé hình màn hình xảy ra khi khung hình được cập nhật trong quá trình quét dọc và VSync ngăn chặn sự pha trộn này.

Những điểm chính

  • VSync — cơ chế đồng bộ hóa GPU với màn hình thông qua chờ VBlank
  • Xé hình màn hình — sự phân chia hình ảnh nhìn thấy khi khung hình thay đổi giữa quá trình quét
  • Bộ đệm kép — phương pháp triển khai VSync chính với front buffer và back buffer
  • Độ trễ đầu vào — tác dụng phụ của VSync, làm tăng độ trễ giữa hành động người dùng và hiển thị
  • Đồng bộ thích ứng — giải pháp thay thế hiện đại cho VSync, loại bỏ nhược điểm của nó

VSync là gì

VSync (Đồng bộ hóa dọc) là cơ chế phần cứng-phần mềm buộc GPU phải chờ tín hiệu xóa dọc (VBlank) trước khi xuất khung hình mới. Nếu không có VSync, GPU có thể gửi khung hình bất cứ lúc nào, ngay cả khi màn hình đang vẽ khung hình hiện tại, gây ra xé hình dọc theo đường ngang.

Trên thiết bị di động, VSync được triển khai ở cấp độ driver đồ họa và hệ điều hành. iOS sử dụng đồng bộ VBlank qua Metal, Android qua SurfaceFlinger và BufferQueue. Khi bật đồng bộ hóa dọc, FPS của ứng dụng không thể vượt quá tần số làm tươi màn hình — 60, 90 hoặc 120 Hz tùy theo model thiết bị.

Thuật ngữ đồng bộ hóa dọc bắt nguồn từ nguyên lý hoạt động của màn hình CRT, nơi chùm tia điện tử vẽ hình ảnh từng dòng từ trên xuống dưới. Sau khi hoàn thành khung hình, chùm tia quay trở lại góc trên bên trái — khoảnh khắc này được gọi là xóa dọc. Màn hình LCD và OLED hiện đại vẫn giữ thuật ngữ này, mặc dù chúng hoạt động khác về mặt vật lý.

Đồng bộ hóa dọc hoạt động thế nào

GPU rendering khung hình vào back buffer, trong khi màn hình đọc từ front buffer. VSync đảm bảo việc hoán đổi bộ đệm chỉ xảy ra trong thời điểm VBlank — khi màn hình đã hiển thị xong khung hình hiện tại và sẵn sàng cho khung hình tiếp theo. Cơ chế này được gọi là bộ đệm kép với đồng bộ VBlank.

Cơ chế bộ đệm kép

Bộ đệm kép sử dụng hai bộ đệm: front buffer hiển thị trên màn hình và back buffer nơi GPU ghi khung hình hiện tại. Khi khung hình sẵn sàng, các bộ đệm được hoán đổi. Khi bật VSync, việc hoán đổi này bị hoãn lại đến VBlank gần nhất. GPU ở trạng thái rảnh nếu khung hình sẵn sàng trước VBlank, làm giảm hiệu suất nhưng loại bỏ xé hình.

cpp
// OpenGL — bật VSync qua WGL_EXT_swap_control
HDC hdc = wglGetCurrentDC();
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT =
    reinterpret_cast<PFNWGLSWAPINTERVALEXTPROC>(
        wglGetProcAddress("wglSwapIntervalEXT"));
wglSwapIntervalEXT(1); // 1 = VSync bật, 0 = tắt

Thời gian chờ VBlank

VBlank là khoảng thời gian ngắn giữa dòng cuối cùng của khung hình hiện tại và dòng đầu tiên của khung hình tiếp theo. Trong khoảnh khắc này, màn hình không cập nhật pixel và việc hoán đổi bộ đệm diễn ra không có artifact. Thời lượng VBlank phụ thuộc vào tần số làm tươi: ở 60 Hz trên màn hình 1080p, VBlank kéo dài khoảng 1,4 ms. Nếu GPU không hoàn thành rendering trước VBlank, khung hình bị bỏ qua và màn hình hiển thị khung hình trước đó thêm một chu kỳ — điều này được cảm nhận như giật lag.

Bộ đệm ba giải quyết vấn đề GPU rảnh bằng cách thêm bộ đệm thứ ba. GPU có thể bắt đầu rendering khung hình tiếp theo ngay lập tức ngay cả khi một trong các back buffer đang chờ VBlank. Điều này tăng FPS khi dùng VSync nhưng thêm một khung hình độ trễ. Trên thiết bị di động, bộ đệm ba được sử dụng trong một số engine game và trong Vulkan qua chế độ Mailbox.

Các vấn đề chính khi không có VSync

Tắt VSync mang lại FPS tối đa và độ trễ đầu vào tối thiểu, nhưng phải trả giá bằng các artifact hình ảnh. Đối với game di động và ứng dụng có hoạt ảnh mượt mà, lựa chọn giữa VSync và tắt nó là sự đánh đổi giữa độ rõ nét hình ảnh và khả năng phản hồi điều khiển.

Xé hình màn hình

Xé hình màn hình là sự phân chia theo chiều ngang, nơi phần trên màn hình hiển thị khung hình trước và phần dưới đã hiển thị khung hình tiếp theo. Điều này xảy ra khi GPU hoán đổi bộ đệm giữa quá trình quét. Trên thiết bị di động, xé hình đặc biệt dễ thấy khi cuộn nhanh hoặc trong cảnh động có tốc độ khung hình cao. Màn hình OLED với phản hồi tức thì làm cho xé hình tương phản hơn so với LCD.

Cường độ xé hình phụ thuộc vào tỷ lệ FPS so với tần số làm tươi. Ở 60 FPS trên màn hình 60 Hz, xé hình xuất hiện dưới dạng một đường tĩnh duy nhất, trong khi ở 300 FPS trên 60 Hz — dưới dạng nhiều vết xé gợn sóng di chuyển từ trên xuống dưới. FPS càng cao so với tần số làm tươi, càng nhiều vết xé và chúng càng dễ thấy.

Độ trễ đầu vào

Độ trễ đầu vào khi dùng VSync là độ trễ giữa lúc nhấn nút và thấy kết quả trên màn hình. Đồng bộ hóa dọc thêm trung bình một khung hình độ trễ (16,7 ms ở 60 Hz) và với bộ đệm ba — lên đến hai khung hình. Đối với ứng dụng thông thường, độ trễ này không thể nhận thấy, nhưng đối với game bắn súng, đối kháng và nhịp điệu, nó rất quan trọng: chuyên gia nhận thấy độ trễ chỉ 8 ms.

Theo nghiên cứu của NVIDIA (2024), độ trễ đầu vào trung bình trong CS:GO ở 60 FPS không có VSync là 22 ms và có VSync — 39 ms. Ở 144 FPS, sự khác biệt giảm xuống còn 14 so với 18 ms tương ứng. Trên nền tảng di động, độ trễ đầu vào của VSync ít quan trọng hơn do đầu vào cảm ứng, nơi độ trễ phần cứng màn hình cảm ứng (10–30 ms) che giấu độ trễ đồng bộ bổ sung.

Cấu hình VSync trong phát triển di động

Trong phát triển di động, VSync được kiểm soát qua API đồ họa, engine game và cài đặt hệ thống OS. iOS cung cấp ít quyền kiểm soát hơn, Android cung cấp nhiều hơn qua Vulkan và OpenGL ES. Việc chọn chế độ phụ thuộc vào loại ứng dụng: game, UI hay video.

VSync trong Unity và Unreal Engine

Unity sử dụng cài đặt QualitySettings.vSyncCount: 0 — tắt, 1 — VSync mỗi VBlank, 2 — mỗi VBlank thứ hai (FPS giảm một nửa). Trong Unreal Engine, VSync được kiểm soát qua lệnh console r.VSync và DefaultEngine.ini. Đối với bản dựng di động, khuyến nghị tắt VSync trong Unity và sử dụng bộ giới hạn FPS tùy chỉnh, vì VSync tích hợp trong Android SurfaceFlinger có thể tạo ra độ trễ không thể đoán trước.

csharp
// Unity — kiểm soát VSync và FPS
void Awake()
{
    // 0 = VSync tắt, 1 = VSync bật
    QualitySettings.vSyncCount = 0;
    // Bộ giới hạn FPS tùy chỉnh thay vì VSync
    Application.targetFrameRate = 60;
}

VSync trong Vulkan và Metal

Vulkan cung cấp toàn quyền kiểm soát qua VkSwapchainPresentInfo và presentMode: VK_PRESENT_MODE_FIFO_KHR — VSync cổ điển, VK_PRESENT_MODE_MAILBOX_KHR — bộ đệm ba không chờ, VK_PRESENT_MODE_IMMEDIATE_KHR — không đồng bộ. Metal trong iOS kiểm soát VSync qua CAMetalLayer.displaySyncEnabled. Bắt đầu từ iOS 14, Apple khuyến nghị sử dụng displaySyncEnabled = true theo mặc định cho tất cả ứng dụng ngoại trừ game điều khiển arcade.

Chế độMô tảĐộ trễ
FIFOVSync cổ điển với chờ VBlank1 khung hình
MailboxBộ đệm ba, loại bỏ khung hình cũ1–2 khung hình
ImmediateKhông đồng bộ, FPS tối đa0 khung hình

Giới hạn FPS không cần VSync

Bộ giới hạn FPS là giải pháp thay thế cho VSync, nơi ứng dụng giới hạn tốc độ khung hình theo chương trình mà không chờ VBlank. Cách tiếp cận này cung cấp độ trễ có thể dự đoán và không phụ thuộc vào tần số làm tươi màn hình. Trên Android, giới hạn FPS được triển khai qua Choreographer, trên iOS — qua CADisplayLink với kiểm soát thời gian xuất thủ công.

VSync và công nghệ đồng bộ hiện đại

VSync truyền thống có một nhược điểm cơ bản: nó bị ràng buộc với tần số làm tươi cố định của màn hình. Nếu GPU xuất 45 FPS trên màn hình 60 Hz, VSync không thể hiển thị 45 khung hình — nó hiển thị 30 (bỏ qua mỗi VBlank thứ hai) hoặc xen kẽ 60 và 30 với khoảng cách không đều. Điều này tạo ra giật lag, làm hỏng trải nghiệm chơi game nhiều hơn xé hình.

Đồng bộ thích ứng (FreeSync, G-Sync, Apple ProMotion) giải quyết vấn đề này bằng cách thay đổi linh hoạt tần số làm tươi màn hình theo FPS của ứng dụng. Nếu ứng dụng xuất 47 FPS, màn hình chuyển sang 47 Hz — mỗi khung hình được hiển thị chính xác một lần, không xé hình hay giật lag. ProMotion trên iOS tự động chọn tần số từ 24 đến 120 Hz, cân bằng độ mượt mà và mức tiêu thụ điện năng.

Trên thiết bị di động, Đồng bộ thích ứng đang trở thành tiêu chuẩn: iPad Pro (2017+) với ProMotion, flagship Android với màn hình LTPO (Samsung Galaxy S23 Ultra, Google Pixel 8 Pro) hỗ trợ tần số làm tươi động từ 1 đến 120 Hz. Đối với nhà phát triển, điều này có nghĩa là VSync theo nghĩa truyền thống được thay thế bằng quản lý hệ thống — chỉ cần đặt targetFrameRate và OS tự điều chỉnh tần số làm tươi để đạt được sự cân bằng tối ưu giữa độ mượt mà và thời lượng pin.

Các câu hỏi thường gặp

Có nên luôn bật VSync trong game di động không?

Không. Đối với game năng động (bắn súng, đối kháng), VSync làm tăng độ trễ đầu vào mà không có lợi ích đáng kể — xé hình trên màn hình OLED di động ít thấy hơn do kích thước màn hình nhỏ. Đối với game thông thường và UI, VSync cải thiện cảm nhận về độ mượt mà.

VSync ảnh hưởng đến pin thiết bị di động như thế nào?

VSync giảm mức tiêu thụ điện năng vì GPU không rendering các khung hình không cần thiết. Khi tắt VSync, GPU hoạt động ở tần số tối đa và mỗi khung hình không được hiển thị đều lãng phí năng lượng và làm nóng thiết bị mà không mang lại lợi ích cho người dùng.

Sự khác biệt giữa VSync và bộ giới hạn FPS là gì?

VSync đồng bộ hóa đầu ra khung hình với VBlank của màn hình, trong khi bộ giới hạn FPS chỉ đơn giản giới hạn tần số rendering trong mã ứng dụng. Bộ giới hạn FPS không loại bỏ xé hình nhưng cung cấp độ trễ có thể dự đoán mà không bị ràng buộc với tần số làm tươi màn hình.

Tại sao FPS có thể giảm một nửa khi bật VSync?

Khi GPU không hoàn thành khung hình trước VBlank, VBlank bị bỏ qua và khung hình được hiển thị trong hai chu kỳ làm tươi. Ở 60 Hz, điều này tạo ra 30 FPS. Bộ đệm ba làm giảm tác động này bằng cách cho phép GPU bắt đầu khung hình tiếp theo mà không cần chờ.

iOS và Android có hỗ trợ Đồng bộ thích ứng không?

. iOS ProMotion (iPad Pro, iPhone 13 Pro+) hỗ trợ tần số động 24–120 Hz. Android qua màn hình LTPO hỗ trợ 1–120 Hz. Nhà phát triển không cần quản lý thủ công — hệ thống tự động chọn tần số tối ưu.

Tổng kết

  • VSync — cơ chế đồng bộ GPU-màn hình loại bỏ xé hình màn hình
  • Bộ đệm kép với chờ VBlank — triển khai cổ điển của đồng bộ hóa dọc
  • Xé hình màn hình — vấn đề chính khi tắt VSync, đặc biệt dễ thấy ở FPS cao
  • Độ trễ đầu vào — cái giá của VSync, thêm một đến hai khung hình trễ
  • Bộ đệm ba giảm giật lag nhưng tăng độ trễ đầu vào
  • Đồng bộ thích ứng (ProMotion, LTPO) — thay thế hiện đại cho VSync với tần số động
  • Đối với game di động, hãy sử dụng bộ giới hạn FPS thay vì VSync để có độ trễ dự đoán được

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm