Về Việc Sử Dụng Texture 4444 Trong OpenGL - nói dối e blog

Về Việc Sử Dụng Texture 4444 Trong OpenGL

Về vấn đề hiệu năng của định dạng texture RGBA4444 trong OpenGL

Trong quá trình xây dựng giao diện game, chúng tôi đã sử dụng một texture RGBA4444 làm bộ đệm render. Tuy nhiên, khi đồng nghiệp tiến hành benchmark hiệu suất hệ thống, chúng tôi phát hiện ra rằng thao tác upload texture 4444 lên GPU thông qua OpenGL có độ trễ cực lớn (thử nghiệm trên card đồ họa ATI X300 với driver mới nhất).

Ban đầu nhóm nghi ngờ do lỗi phần cứng hoặc driver của AMD, nên cân nhắc chuyển đổi hoàn toàn sang giải pháp render phần mềm. Một phương án khác được đề xuất là lưu trữ toàn bộ giao diện trong VRAM. Tuy nhiên trong các dự án trước đây như engine giao diện cho game Thiên Hạ 2, đồng nghiệp từng thực hiện so sánh chi tiết giữa 2 cách tiếp cận này. Kết quả cho thấy việc đổ toàn bộ tài nguyên giao diện vào VRAM không mang lại cải thiện rõ rệt về tốc độ, thậm chí trong một số trường hợp còn làm hiệu năng giảm sút. Lưu ý rằng lúc đó hệ thống底层 đang dùng Direct3D nên không gặp phải vấn đề tương tự như hiện tại.

Qua nhiều vòng test, chúng tôi phát hiện một hiện tượng thú vị: khi chuyển texture sang định dạng RGBA8888, tốc độ xử lý tăng vọt lên gấp 3-4 lần. Điều này khiến chúng tôi suy đoán rằng các thế hệ GPU hiện đại đã loại bỏ hỗ trợ phần cứng cho định dạng 16-bit RGBA4444 ít được sử dụng. Thay vì tiết kiệm 50% băng thông nhớ như kỳ vọng ban đầu, việc dùng định dạng này lại gây ra hiệu ứng ngược hoàn toàn.

Chúng tôi từng tính đến phương án thay đổi quy chuẩn thiết kế đồ họa giao diện sang định dạng 8888, thậm chí nghiên cứu tích hợp định dạng nén DXT để tối ưu bộ nhớ. Tuy nhiên, sau khi thử nghiệm thêm vài lần, tôi phát hiện ra bí kíp tối ưu bất ngờ: chỉ cần thay thế tham số GL_UNSIGNED_SHORT_4_4_4_4 bằng GL_UNSIGNED_SHORT_4_4_4_4_REV trong hàm glTexImage2D là tốc độ tăng vọt vượt xa cả định dạng 8888!

Có lẽ do driver OpenGL của AMD xử lý không hiệu quả khi gặp định dạng pixel không khớp với kiến trúc phần cứng. Trong trường hợp này, việc chuyển đổi định dạng pixel thông qua phần mềm trong driver đã gây ra bottleneck nghiêm trọng. Điều thú vị là khi thử nghiệm trên các dòng card NVIDIA đời mới, sự khác biệt giữa 2 định dạng trên gần như không tồn tại, chứng tỏ đây là vấn đề đặc thù của driver AMD.

Bài học rút ra:

  1. Đừng quá tin tưởng vào các định dạng tiết kiệm bộ nhớ mà không test hiệu năng thực tế
  2. Thứ tự kênh màu (channel ordering) có thể ảnh hưởng lớn đến hiệu suất phần cứng
  3. Driver GPU có thể xử lý khác nhau trên cùng một API giữa các vendor
  4. Luôn kiểm tra cross-platform trước khi kết luận vấn đề phần cứng/cứng mềm
0%