Một số khái niệm trong lập trình Graphic

1. VRAM

– VRAM hay Video RAM là vùng nhớ dedicated dùng cho Graphic. Nó chứa framebuffer (dùng để store raw pixel data) + image data (store file PNG, BMP…). – VRAM có thể là vùng nhớ

  • nằm trên SRAM, được cấu hình để dùng làm VRAM
  • nằm trên video card (các video card rời thường sẽ có VRAM riêng)
  • được shared từ system RAM (DRAM).

2. Framebuffer

– Là một phần của VRAM. Chứa bitmap data dùng để hiển thị lên màn hình – Framebuffer có thể được access thông qua các method sau

  • được map địa chỉ vào address space của CPU và CPU write trực tiếp vào đó
  • CPU send command cho GPU (vd: thông qua OpenGL APIs), GPU write vào Framebuffer

– display (screen) sẽ phải quét Framebuffer để hiển thị (tần số quét 60Hz, 70Hz…)

3. Virutal Framebuffer

Có rất nhiều hệ thống cố gắng mô phỏng chức năng của Framebuffer, thường là vì lý do tương thích. Có 2 “virtual” framebuffers phổ biến nhất là Linux framebuffer device (fbdev) and the X Virtual Framebuffer (Xvfb).

4. GPU

GPU – graphics processing unit là chip xử lý đồ họa nằm trên Video Card (Graphic Card). Nó giúp cho quá trình xử lý data và write lên framebuffer nhanh hơn. GPU còn được gọi là Graphics accelerators

5. Vsync

vsync là signal được trigger bởi display (màn hình), tương ứng với 1 lần quét framebuffer (trong TH double buffer thì sẽ quét front buffer). Ví dụ với màn hình có refresh rate 60Hz thì 1 giây sẽ có 60 tín hiệu vsync.

6. Swap interval

Swap interval trong trường hợp sử dụng double buffer sẽ có một số option sau:

  • vsync off: việc swap ko liên quan gì đến tín hiệu vsync. Cứ khi nào vẽ lên back buffer xong thì swap luôn –> việc này có thể dẫn đến tearing nếu render với tần số lớn. Ví dụ cứ render liên tục và swap liên tục với tốc độ render rất nhanh (sử dụng GPU khỏe) thì có thể màn hình còn chưa kịp hiển thị hết nội dung của front buffer thì đã bị swap gây ra hiện tượng tearing.
  • swap theo 1 vsync: Application sẽ phải handle tín hiệu vsync trigger bởi màn hình. Mỗi khi có tín hiệu vsync thì nếu đã render lên backbuffer xong rồi thì thực hiện swap. VD: với màn hình 60Hz thì sẽ swap 60 lần (maximun là 60fps). Kiểu này sẽ ko bị tearing, cảm giác mượt
  • swap theo 2 vsync: Application sẽ phải handle tín hiệu vsync trigger bởi màn hình. Cứ mỗi 2 tín hiệu vsync thì check, nếu đã render lên backbuffer xong rồi thì thực hiện swap. VD: với màn hình 60Hz thì sẽ swap 30 lần (maximun là 30fps). Kiểu này sẽ ko bị tearing, cảm giác ko mượt bằng 1 vsync
  • Tương tự thì có swap theo 3 vsync, 4 vsync… (ko thường gặp)

— Author: Phạm Minh Tuấn —

Solution Architect tại FPT Software