Tôi đang thực hiện một số nghiên cứu về cách hầu hết các thư viện GUI tăng tốc phần cứng hoạt động. Tôi thực sự chỉ quan tâm đến các phụ trợ kết xuất của chúng ở đây. Tôi đang cố gắng tìm ra điều gì sẽ là cách tốt nhất để thử và tự viết như một dự án phụ. Tôi đang cố gắng để đạt được hiệu suất cao nhất ở đây thay vì các tính năng quá lạ mắt. Tôi muốn b có thể vẽ nguyên thủy, văn bản và hình ảnh động.
Một số thư viện tốt mà tôi biết là Qt, Skia và Cairo (mặc dù tôi không chắc chắn rằng Hate là gì về nó). Tôi cũng đã xem NanoVG, một thư viện nhỏ dường như có số lượng khá. Tôi đã không quản lý để đạt được hiệu suất tốt với NanoVG mặc dù ...
Một điều làm tôi ngạc nhiên là tất cả các thư viện này dường như sử dụng khái niệm "hội họa" trong đó dường như mỗi hình dạng nguyên thủy được vẽ lại từ đầu nhiều lần. Điều tôi muốn nói là từ các API, nó không xuất hiện như thể các hình dạng được tạo ra dưới dạng "đối tượng" trên GPU hoặc bất kỳ thuật ngữ nào và sau đó được hiển thị "tự động". Nói cách khác, chúng không bị bỏ lại trên bộ nhớ của GPU vì được vẽ lại trong một số vòng lặp lớn. Để giải thích, dường như với mỗi hình chữ nhật cần được vẽ, toàn bộ trạng thái OpenGL được thiết lập chỉ để hiển thị hình chữ nhật đó và sau đó lại bị phá hủy. Nó xuất hiện mặc dù như thể các hình dạng được hiển thị này sau đó ít nhất được hiển thị tại các điểm đến cuối cùng của chúng, cho phép GPU sau đó kết hợp toàn bộ cảnh.
Cách tôi mong đợi các thư viện này hoạt động là bằng cách thực sự lưu trữ toàn bộ cảnh trên GPU (xin lỗi thuật ngữ khủng khiếp). Chẳng hạn, các nguyên thủy sẽ được tam giác hóa và để lại trong bộ nhớ trong đó sau một quá trình phức tạp sẽ được sử dụng để có một vòng lặp kết xuất chính cho cảnh. Hơn nữa, sau đó sẽ có các cơ chế để cập nhật các thuộc tính hoặc xóa hoặc thêm các nguyên hàm. Đây là một mô tả khá mơ hồ nhưng tôi nghĩ rằng bạn có ý tưởng.
Điều tôi muốn hỏi bây giờ là liệu có bất kỳ lợi ích hiệu suất nào đối với phương pháp "vẽ" so với phương pháp "đã lưu" (một lần nữa, không biết có tên nào phù hợp cho những điều này không ...). Một số cơ chế bộ nhớ đệm phức tạp có lẽ? Hay điều này chỉ đơn giản hơn nhiều để làm việc với?
Tôi nhận ra rằng phương pháp "đã lưu" có thể sử dụng nhiều bộ nhớ hơn trên GPU nhưng tất cả các cuộc gọi OpenGL cần thiết cho phương pháp "vẽ" không quá đắt? Tôi đoán người ta có thể bù lại điều này bằng cách lưu trữ các hình dạng được hiển thị nhưng GPU thực sự mang lại lợi ích rất lớn khi thực hiện quá trình rasterization một lần (hoặc không thường xuyên) như vậy so với CPU, đặc biệt là khi giao tiếp trên không? Ngoài ra, việc truyền thông này không gây ra vấn đề nghiêm trọng cho hoạt hình khi vẽ phải được thực hiện cho mọi khung hình?
Tôi khá chắc chắn rằng NanoVG không có cơ chế lưu trữ nội bộ và tôi cho rằng điều này có thể chịu trách nhiệm cho hiệu suất khá mờ nhạt của nó. Mặt khác, Qt dường như có hiệu suất tuyệt vời vì vậy nó phải làm điều gì đó đúng đắn. Google dường như cũng có thể đưa Skia vào sử dụng tốt.
Tái bút Tôi không phải là một chuyên gia thuộc bất kỳ loại nào và chỉ mới bắt đầu học OpenGL gần đây.
EDIT: Một khả năng khác mà tôi đã nghĩ đến là có lẽ phương pháp "vẽ tranh" được coi là cần thiết hoàn toàn vì lợi ích của bộ nhớ? Lý do tôi nghĩ đó là vì tất cả các thư viện này tất nhiên đã bắt đầu ở một thời đại khác và cũng nhắm mục tiêu các nền tảng nhúng có nghĩa là bộ nhớ GPU có thể rất khan hiếm trên các nền tảng (ed) và sử dụng ít nhất có thể quan trọng hơn hiệu suất. Mặc dù vậy, một lần nữa, trong một tình huống như thế này, tôi không tin rằng việc raster GPU theo từng khung hình được cung cấp cho chi phí truyền thông sẽ vượt trội hơn CPU, đặc biệt là xem xét số điểm ảnh có lẽ thấp trên các nền tảng có bộ nhớ nhỏ như vậy.
Hơn nữa, tôi đã đọc trên http://blog.qt.io/blog/2010/01/06/qt-graphics-and-performance-opengl/ rằng Qt rõ ràng pha trộn mã shader từ các phân đoạn được mã hóa trong thời gian chạy trước khi "vẽ" và sau đó hy vọng trình biên dịch OGL sắp xếp mã đúng lúc chạy. Điều này nghe có vẻ như thậm chí nhiều hơn việc khởi tạo OGL đối với tôi ...