Một Lỗi Trong Opengl
Vấn đề OpenGL cũ này đã xuất hiện từ lâu, nhưng nhiều thành viên trong công ty liên tiếp gặp phải nên rất cần lưu lại tài liệu. Việc này sẽ giúp tăng khả năng tìm thấy thông tin khi tra cứu trên Google, và hy vọng sẽ không có lần thứ ba nào nữa.
Ban đầu tôi cho rằng sau khi bind VBO trong OpenGL, nếu dữ liệu VBO thay đổi thì không cần bind lại đối tượng VBO. Vì vậy trong phiên bản cũ của ejoy2d, chúng tôi đã thực hiện một số tối ưu hóa tại đây - bỏ qua việc bind lặp để giảm bớt số lần gọi API.
Khoảng tháng 6/2015, khi cần cập nhật hệ thống macOS, ejoy2d đã bổ sung hỗ trợ VAO. Trong quá trình chỉnh sửa triển khai, tôi phát hiện ra một lỗi lạ xảy ra trên một số thiết bị nhất định.
Ban đầu tôi nghi ngờ rằng đây là do trình điều khiển thiết bị di động mới đã thực hiện những tối ưu hóa kỳ quặc mà trước đây chưa từng có. Tuy không kiểm tra kỹ lưỡng xem OpenGL có yêu cầu cụ thể nào không hay đây là lỗi của trình điều khiển, tôi vẫn tiến hành một số thay đổi.
Trong bản sửa lỗi này, mỗi khi dữ liệu VBO được cập nhật, tôi sẽ đánh dấu trạng thái “bẩn” (dirty flag), sau đó khi commit sẽ tự động bind lại VBO. Tuy nhiên bản sửa lúc đó không được tách thành một commit độc lập nên đã bị đồng nghiệp bỏ qua.
Gần đây, dự án Truc Tam Trang Tâm của chúng tôi gặp hiện tượng nhiễu màn hình trên mẫu điện thoại mới của Smartisan. Sau khi điều tra nguyên nhân, đồng nghiệp phát hiện chỉ cần cập nhật phiên bản ejoy2d mới nhất là vấn đề được giải quyết. Chính xác là bản sửa lỗi đã đề cập ở trên đã khắc phục.
Vài ngày trước, một đồng nghiệp khác phát hiện dự án nhỏ Bao Lieu Phuong Khoi của anh ấy cũng gặp lỗi hiển thị tương tự khi được kiểm thử trên nền tảng 360. Sau thời gian dài điều tra, hôm nay cuối cùng chúng tôi xác định được đây là cùng một lỗi đã gặp trước đó.
Việc phải tốn thời gian lặp lại cho cùng một vấn đề thực sự rất lãng phí.
Vì vậy:
- Cần thường xuyên ghi chép chi tiết để tài liệu có thể được Google tìm thấy
- Nhớ đồng bộ hóa các dự án mã nguồn mở thường xuyên
Lưu ý kỹ thuật chi tiết:
|
|
Kinh nghiệm bổ sung:
- Với OpenGL ES trên thiết bị di động, việc đảm bảo trạng thái context luôn nhất quán rất quan trọng
- Nên thường xuyên kiểm tra trình điều khiển đồ họa qua ứng dụng GPU Info để phát hiện các hành vi bất thường theo thiết bị
- Đối với các dự án game engine, nên xây dựng hệ thống kiểm tra tự động (automated test) cho các tình huống edge case liên quan đến trạng thái OpenGL