Dữ liệu GUI được tăng tốc phần cứng có được giữ trên GPU không


8

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 ...


2
TL; DR; sẽ không gây hại ở đây
Kromster

Câu trả lời:


6

Lưu toàn bộ cửa sổ dưới dạng một đối tượng vào GPU (nó sẽ là một loạt các hình chữ nhật được lưu dưới dạng VBO) và sau đó hiển thị nó trong một lệnh gọi rút thăm OpenGL sẽ nhanh, nhưng nó có một số nhược điểm:

  • Toàn bộ hình học sẽ phải được kết xuất bằng cách sử dụng một shader duy nhất. Có các shader riêng biệt (đối với bản sao mờ, bản sao trong suốt, độ dốc, ...) sẽ hữu ích hơn.
  • Toàn bộ hình học chỉ có thể sử dụng từ số lượng kết cấu hạn chế. Ngay cả khi bạn sử dụng atlours, bạn cần rất nhiều họa tiết cho GUI. (Các phần của chủ đề GUI, biểu tượng, phông chữ, ...)
  • Bạn phải xây dựng lại và tải lại toàn bộ đối tượng vào GPU sau mỗi thay đổi.
  • Mọi vật dụng phải có khả năng tạo ra mảnh hình học khó trừu tượng hơn tranh 2D.
  • Trên một số GPU, bạn có thể kết xuất nội dung 2D (lấp đầy khu vực bằng màu sắc, sao chép từ hình ảnh sang hình ảnh, ...) bằng các lệnh 2D nhanh hơn so với sử dụng đường ống 3D.

Nếu bạn chia nó thành nhiều đối tượng, thì cuối cùng bạn sẽ có một hoặc một vài hình chữ nhật cho mỗi đối tượng. Thật dễ dàng và nhanh hơn để kết xuất chúng mà không cần bất kỳ đối tượng lưu trữ nào.

Các khung GUI làm gì là theo dõi phần chính xác nào của cửa sổ đã thay đổi và chỉ sơn lại chúng. Hình ảnh cũ được lưu trữ trong GPU. Cách tiếp cận này có thể được sử dụng với các phụ trợ vẽ khác nhau, không chỉ kết xuất được tăng tốc OpenGL / DirectX.

Nếu bạn muốn kiểm tra ví dụ về thư viện GUI tạo hình học mà bạn có thể cung cấp cho OpengGL (hoặc vào api 3D khác nhau), hãy xem librocket . Nó thực sự có thể nướng các hình học tĩnh với nhau và kết xuất chúng trong một lệnh gọi rút thăm duy nhất, nhưng bất kỳ yếu tố nào sẽ thay đổi thường xuyên hoặc cần kết xuất với trình đổ bóng riêng của nó phải tách biệt.


được rồi cảm ơn. Là toàn bộ khung hình trước đó được lưu trữ dưới dạng hình ảnh hoặc tất cả các yếu tố được lưu trữ trong một tập bản đồ? Lý do tôi hỏi là vì tôi không thấy bộ đệm sẽ hỗ trợ cho việc dịch một phần tử như thế nào. Duy trì một tập bản đồ mặc dù tất nhiên sẽ rất nhiều nỗ lực.
Gerharddc

Toàn bộ nội dung cửa sổ thường được lưu trữ. Tôi đặt cược một số khung GUI cũng lưu trữ một số giai đoạn trung gian, nội dung của bất kỳ thứ gì có thể cuộn sẽ là ứng cử viên tốt. Tôi không nghĩ dịch là hoạt động phổ biến trong GUI ngoài các khu vực có thể cuộn. Hầu hết các lần sơn lại đều nhỏ và tại chỗ do các vật dụng thay đổi trên hower hoặc nhấp, thay đổi văn bản, ... Những thứ như hộp thoại và menu là các cửa sổ riêng biệt về mặt kỹ thuật, các bộ tổng hợp cửa sổ hiện đại đảm nhận việc di chuyển chúng mà không cần sơn lại.
michalsrb

Tôi đoán nó có lý. Điều đó có nghĩa là toàn bộ cửa sổ sẽ phải được vẽ lại nếu tôi bất ngờ di chuyển thứ gì đó giống như một nút?
Gerharddc

Điều đó thực sự phụ thuộc vào cách thực hiện khung cụ thể. Nhưng có khả năng việc di chuyển một nút sẽ kích hoạt một số loại cập nhật bố cục và phần lớn của cửa sổ, nếu không phải là toàn bộ, sẽ phải được sơn lại.
michalsrb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.