Search…

GPU - Double Buffer và 1 Số Khái Niệm

27/09/20205 min read
Giải thích các khái niệm double buffer, front buffer, back buffer, surface và texture.

Quá trình vẽ 1 đối tượng đồ họa lên màn hình (monitor)

Double buffer

Double buffer là 1 cặp front buffer và back buffer, trong đó chương trình sẽ render lên back buffer, trong khi đó front buffer lại đẩy hình ảnh lên monitor trong cùng thời gian.

Như vậy trong quá trình đang chờ đợi hình ảnh được hiển thị lên monitor thì chương trình vẫn có thể render lên back buffer.

Sau khi front buffer đã render xong lên monitor, back buffer cũng render xong thì tiến hành đổi vị trí của back buffer và front buffer (swap buffer). Như vậy lúc này front buffer mới chính là back buffer cũ, tiến hành đẩy hình ảnh mới lên monitor.

Khái niệm front buffer / frame buffer (bề mặt chính)

Card đồ họa chứa thông tin muốn hiển thị lên màn hình. Khi muốn hiển thị dữ liệu, card đồ họa lấy dữ liệu cần hiển thị tại vùng nhớ đệm, được gọi là Front buffer (Frame buffer) gửi những thông tin đã lấy được đến monitor để hiển thị, monitor sẽ cập nhật những phần mới và vẽ lại từ trên xuống dưới.

Front buffer nằm ở bộ nhớ đồ họa và biểu thị hình ảnh lên màn hình. Do đó, để thay đổi hiển thị trên màn hình theo ý muốn, cách đơn giản là thay đổi trực tiếp dữ liệu trên Front buffer. Nhưng có vấn đề nhỏ xảy ra, màn hình sẽ hiển thị thành hai phần, nửa trên là bức ảnh cũ còn nửa dưới là ảnh mới (điều này diễn ra nhanh nên sẽ cảm thấy màn hình lag và giật). Hiện tượng xảy ra là do 1 chương trình nào đó cập nhật trên Front buffer trong khi monitor đang trong quá trình refresh. Hay có thể hiểu là GPU render với số lượng frame lớn hơn số lượng frame hiển thị lên màn hình trong 1 giây (refresh rate) của monitor, thông thường refresh rate chỉ từ 60 Hz (fps) đến 100 Hz ở đa số màn hình, hiện tượng này được gọi là tearing screen.

Khái niệm back buffer / off-screen surface (bề mặt phụ ngoài)

Để giải quyết vấn đề trên, ngoài việc bật V-Sync còn có 1 kỹ thuật khác là Back buffering (double buffering).

Back buffering là quá trình vẽ hình ảnh lên bề mặt phụ ngoài màn hình (off-screen surface), kiểu bề mặt này thực chất là 1 mảng pixel giống như bitmap. Back buffer cũng thuộc loại bề mặt này nhưng đặc biệt hơn. 1 bức ảnh thay vì được vẽ trực tiếp từ Front buffer lên monitor thì GPU sẽ vẽ ảnh từ Back buffer. Như vậy, muốn hiển thị những gì lên màn hình thì chỉ cần vẽ lên Back buffer.

Bất kỳ bề mặt (surface) nào khác Front buffer thì được gọi là off-screen surface bởi vì chỉ có Front buffer mới hiển thị hình ảnh trực tiếp lên monitor.

Thật sự khi sử dụng kỹ thuật back buffering thì hiện tượng tearing vẫn xảy ra, để tránh điều đó, GPU sử dụng 1 con trỏ cho mỗi buffer (cả Front và Back) để chuyển đổi giá trị giữa chúng 1 cách đơn giản. Quá trình chuyển từ Back buffer sang Front buffer được gọi là surface flipping. Hiểu đơn giản là sau khi vẽ lên Back buffer thì ra lệnh cho card đồ họa thay đổi vị trí của back buffer và front buffer, lúc này back buffer trở thành front buffer và đẩy dữ liệu lên monitor.

Surface và Texture

Surface giống như off-screen surface, surface được sử dụng cho rất nhiều thứ, phổ biến nhất là thao tác vẽ hoặc load 1 ảnh bitmap (png, jpg, ...) lên nó.

Khi thao tác với Sprite, GPU sử dụng texture thay cho surface để lưu trữ sprite image, sự thay thế này thật sự cũng không mang lợi ích nào cho việc nâng cao hiệu suất, do phần cứng hiện nay khá mạnh để xử lý và không cảm nhận được sự khác biệt.

Surface và texture có thể tạo bao nhiêu cũng được miễn là còn đủ RAM và VRAM để chứa.

Double buffer (front buffer - back buffer)

Tóm lại

Front buffer là 1 vùng trên bộ nhớ được bộ xử lý hiển thị trực tiếp lên monitor. Trên GPU, các chương trình không được thao tác trực tiếp lên Front buffer.

Back Buffer là 1 vùng trên bộ nhớ, các chương trình có thể thao tác trực tiếp lên đây hoặc sao chép từ surface khác,  Back buffer không hiển thị trực tiếp lên monitor.

Surface (off-screen surface) là 1 bề mặt thứ cấp được lưu trữ trong bộ nhớ của card đồ họa hoặc có thể trong bộ nhớ của hệ thống, có thể thực hiện nhiều thao tác như vẽ bitmap, load ảnh.

Texture 1 phần tương tự như surface và nó được sử dụng nhiều khi thao tác với Sprite.

Bài chung series

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024