Tôi không nghĩ rằng nhiệm vụ này là một ứng cử viên tốt để triển khai sử dụng QSGGeometryNode
, sẽ dễ dàng hơn khi triển khai nó bằng cách sử dụng bản vẽ dựa trên QPainter
và QQuickPaintedItem
. Bạn vẫn sẽ nhận được những lợi ích của OpenGL, vì QPainter
cũng hỗ trợ bản vẽ GL và nó vẫn nhanh hơn phần mềm. Bạn có thể sử dụng mã cổ phiếu QPen
với các mẫu có dấu chấm hoặc dấu gạch ngang hoặc tạo mẫu của riêng bạn với một đơn giản QVector
.
Ngoài ra, bạn có thể sử dụng phương pháp vẽ GL tùy chỉnh thay vì sử dụng các lớp do Qt cung cấp, điều này khá hạn chế khi nói đến biểu diễn hình học ghép cao cấp. Bạn thậm chí có thể sử dụng instancing (nếu có) để cải thiện hiệu suất hơn nữa, và chỉ vị trí dấu gạch ngang hoặc chấm hình học dọc theo đường cong đường dẫn.
Cuối cùng nhưng không kém phần quan trọng, bạn có thể sử dụng phần tử Canvas QML, hỗ trợ khá nhiều hoạt động tương tự như QPainter
và có thể cung cấp cùng một hiệu suất.
EDIT: Theo bản cập nhật của bạn, bạn đã bỏ lỡ phần mà tôi đã nói QPainter
có thể vẽ cả phần mềm và GL, với bản vẽ GL thường nhanh hơn đáng kể. Ngoài ra, bằng cách vẽ đến một bối cảnh GL, bạn không cần phải di chuyển bộ đệm khung từ bộ nhớ CPU sang GPU, nó được giữ trong bộ nhớ GPU. Vì vậy, không có phí. Đối với hoạt ảnh và các nội dung khác, chắc chắn không thể với QPainter
bạn được giới hạn ở bất kỳ thứ gì QPen
cung cấp - các kết nối khác nhau, mũ và các thứ khác có thể được sử dụng để sửa đổi hình dạng ở một mức độ nào đó, nhưng không có phép lạ ... Cũng không thể với các trình đổ bóng, nó sẽ chỉ có thể với hình dạng tùy chỉnh. Và nếu bạn sử dụng đối tượng dựa trên QObject
cho mỗi phần tử dấu gạch ngang/dấu chấm để tạo hiệu ứng độc lập, nó sẽ kết thúc khá mở rộng, QObject
rất nặng và không được sử dụng với bàn tay nhẹ như vậy. Vì vậy, tùy chỉnh GL rendering cho một FBO là khá nhiều cách để đi nếu bạn muốn loại linh hoạt, nhưng bạn sẽ phải di chuyển hoàn toàn ra khỏi API QtQuick và vào GL đất.
Ở mức độ nào, trình đổ bóng nét đứt không nên phức tạp, về cơ bản bạn tô màu đoạn dựa trên khoảng cách từ đường cong và "khoảng thời gian" dọc theo chiều dài của nó. Tôi đã tìm thấy this example, chưa thử bản thân.Bạn có thể tạo hiệu ứng cho các ngưỡng, thậm chí sử dụng chức năng sin để có kiểu dáng đẹp. Đối với triển khai QtQuick "thuần túy", API chưa thực sự được thiết kế để xử lý các tác vụ vẽ như vậy, đó là lý do tại sao phần tử Canvas được cung cấp để lấp đầy khoảng trống và nhận chức năng nâng cao từ QML/JS. Canvas thực sự là trình bao bọc xung quanh QPainter
vẽ lên FBO.
Cuối cùng nó không đun sôi xuống những gì có thể/không thể nhưng cách tiếp cận nào có ý nghĩa nhất và hiệu quả nhất khi hoàn thành công việc. Trước hết, hãy thử cách tiếp cận QQuickPaintedItem
vì đây là cách dễ nhất, nếu bạn không hài lòng với hiệu suất, bạn có thể triển khai một giải pháp và cấu hình phức tạp hơn so với phương pháp đầu tiên. Xét cho cùng, đó là lý do tại sao QQuickPaintedItem
được giới thiệu ngay từ đầu - để xử lý bức tranh kế thừa không thuận tiện để thực hiện với lớp QQuickItem
.
tôi t tương đối tầm thường để thay đổi ví dụ đường cong Bezier để tạo ra hình học cho mỗi phân đoạn phụ khi cần theo kiểu đường được chọn. –