2010-07-24 37 views
6

(Sửa: để làm rõ, mục tiêu chính của tôi là đồng thời, nhưng không nhất thiết phải cho đa lõi máy)Bản vẽ đa luồng trong .NET?

Tôi khá mới cho tất cả các khái niệm về đồng thời, nhưng tôi đã tìm ra tôi cần phải có các quy trình vẽ song song, vì một số lý do:

  • Tôi muốn vẽ các phần khác nhau của đồ họa một cách riêng biệt (nền được làm mới ít thường xuyên hơn nền trước, được lưu trên bộ đệm).
  • Tôi muốn kiểm soát mức độ ưu tiên (Ưu tiên hơn đối với phản hồi giao diện người dùng so với vẽ biểu đồ phức tạp).
  • Tôi muốn có tính năng vẽ từng khung hình đa luồng.
  • Tôi muốn hủy bỏ các quy trình vẽ phức tạp trên bộ đệm.

Tuy nhiên, là người mới bắt đầu, mã của tôi sớm giống như một mớ hỗn độn và tái cấu trúc hoặc sửa lỗi trở nên khó xử đến mức tôi quyết định chơi nhiều hơn trước khi làm bất cứ điều gì nghiêm trọng.

Vì vậy, tôi muốn biết làm thế nào để làm sạch, dễ dàng để mantain. NET multithreaded mã có ý nghĩa khi tôi nhìn vào nó sau khi thức dậy vào ngày hôm sau. Vấn đề lớn nhất tôi có là cấu trúc ứng dụng để tất cả các phần nói chuyện với nhau một cách thông minh (trái ngược với vụng về và hacky).

Bất kỳ đề xuất nào được chào đón, nhưng tôi có ưu tiên cho các nguồn mà tôi có thể tiêu hóa trong thời gian rảnh (ví dụ, không phải 500 trang thảo luận về đồng thời) và cho C#/VB.NET. phiên bản (vì tôi thấy đã có advances). Về cơ bản tôi muốn một cái gì đó thẳng đến mức để tôi có thể bắt đầu bằng cách chơi với các khái niệm về các dự án đồ chơi của tôi.

+0

Mô tả nhu cầu của bạn để biết thêm chi tiết sẽ giúp mọi người trả lời câu hỏi của bạn. Bạn muốn vẽ toàn bộ giao diện người dùng theo cách đa luồng? Bạn có chỉ là một điều khiển duy nhất nên được đa luồng? Bạn có thể sẽ kết thúc với một hồ bơi thread tiêu thụ các lớp vẽ của bạn. –

+0

Tôi xin lỗi, mối quan tâm chính của tôi là cấu trúc mã như vậy (thông thường là đồng bộ) theo cách đồng thời. Trong trường hợp này, nó là một điều khiển đơn có thể tách bản vẽ của nó qua hai hoặc ba luồng, nhưng điều khiến tôi khó hiểu là sự đồng thời có thể được áp dụng cho một cái gì đó bình thường được bắt đầu và kết thúc trên một sự kiện Paint. –

Trả lời

1

Task Parallel Library chắc chắn là nơi để tìm cách đơn giản hóa mã của bạn. Cá nhân tôi đã viết một bản giới thiệu (bán dài) đến Parallelism with .NET 4 bao gồm một số khái niệm khá hữu ích.

Tuy nhiên, hãy lưu ý rằng bạn có thể sẽ muốn xem xét việc rời khỏi bản vẽ đơn luồng của mình. Bạn nên cố gắng giữ cho tính toán đa luồng và các thao tác vẽ thực tế được thực hiện trên luồng GUI.

Hầu hết các API vẽ yêu cầu tất cả các cuộc gọi vẽ thực tế xảy ra trên cùng một bối cảnh đồng bộ hóa.

Điều đó đang được nói, sử dụng các lớp sưu tập mới như ConcurrentQueue đơn giản hóa loại mã này. Cố gắng suy nghĩ về nhiều chủ đề (nhà sản xuất) thêm "hoạt động vẽ" vào hàng đợi được chia sẻ, đồng thời - và một chủ đề (người tiêu dùng) nắm lấy các hoạt động và thực hiện chúng.

Điều này mang đến cho bạn thiết kế hợp lý, có thể mở rộng, nhưng khá đơn giản mà bạn có thể xây dựng.

+0

Hehe Tôi có một trong những bài viết giới thiệu của bạn đã được mở trong một tab khác và tôi phải nói nó là tuyệt vời (và nguồn tốt nhất mà tôi đã tìm thấy cho đến nay), tôi nhanh chóng lấy cái nhìn sâu sắc từ nó. Về mã vẽ, như tôi đã nói "nền" hơi phức tạp hơn (và nó có thể được vẽ trong bộ đệm trong khi các phần tử nhẹ được phủ lên trên bộ đệm nền trước), nhưng vấn đề chính tôi phải đối mặt là chia sẻ các bộ đệm như vậy thời trang thanh lịch trên các chủ đề (và gọi hàm dựng hình vào đúng thời điểm trái ngược với việc đặt chúng vào sự kiện vẽ). –

+0

Tôi sẽ tiếp tục đọc các bài viết của bạn và không thích thú với mã, có lẽ điều đó đáng giá hơn một cuốn sách lớn về chủ đề này (đối với những người lập trình khiêm tốn của tôi). Hiện tại, +1 và kudo không giới hạn cho bạn! :) –

+0

@Camilo: FYI - Cuốn sách hay nhất mà tôi đã xem trên đây cho đến nay là cuốn sách P & P (Tôi là một người đánh giá về nó;)). Nó sẽ được phát hành vào tháng tới, nhưng bạn có thể đọc bản xem trước tại: http://parallelpatterns.codeplex.com/ –

9

nhưng tôi đã tìm ra tôi cần phải có thói quen vẽ song song

Ba chữ: KHÔNG THEO WINDOWS.

Đơn giản như vậy. Bản vẽ cửa sổ tiêu chuẩn là một chuỗi duy nhất cho mỗi định nghĩa, vì các lý do tương thích. Bất kỳ điều khiển giao diện người dùng nào (hãy gắn bó với.NET thế giới) CHỈ được chế tác từ chủ đề sáng tạo của nó (vì vậy trong thực tế nó là tàn bạo hơn so với đơn luồng - đó là MỘT CHỈ THƯỜNG KỸ THUẬT).

Bạn có thể thực hiện việc tính toán trước một cách riêng biệt, nhưng bản vẽ thực tế đã được thực hiện từ một chuỗi đó.

KHÔNG CHỊU bạn phân bổ một bitmap, có bản vẽ của riêng bạn ở đó và sau đó chuyển nó qua chuỗi giao diện người dùng để vẽ lên cửa sổ.

Điều này không liên quan gì đến toàn bộ thư viện tác vụ song song, vv (mà tôi đã bỏ phiếu) nhưng quay trở lại thành phố theo yêu cầu rất cũ được lưu giữ vì lý do đơn giản và khả năng tương thích. Đây là lý do mà bất kỳ chủ đề giao diện người dùng nào cũng là thị trường như là phân nhánh được phân luồng.

Cũng lưu ý rằng bản vẽ đa luồng, nếu bạn tự thực hiện nó, có những tác động nghiêm trọng. Mà một trong những chiến thắng quang học (ở lại trong foreground)? Điều này là không thực sự xác định khi sử dụng đa luồng. Bạn được tự do thử nó, mặc dù.

Trong trường hợp này:

  • Có đệm của riêng bạn và đồng bộ hóa là điều bắt buộc. Tránh xa mọi thư viện đồ họa cấp cửa sổ (WPF hoặc Winforms) ngoại trừ bước cuối cùng (làm bitmap của bạn).

  • DirectX 11 được cho là có một số hỗ trợ cho các cuộc gọi nhiều chủ đề, nhưng tôi không chắc chắn sẽ đi xa như thế nào.

+0

Tôi thực sự đã vẽ các thường trình trên một chuỗi khác đã vẽ trên bộ đệm và đã vẽ bộ đệm đó trên giao diện người dùng với DrawImageUnscaled() và tôi thậm chí còn sử dụng GDI + (trên các chủ đề vẽ), vì hiệu suất của nó là ok - mối quan tâm của tôi là hiệu suất cao hơn hiệu suất thực tế (ví dụ: có giao diện người dùng đáp ứng 100% mọi lúc, ngay cả khi "nền" được vẽ, vì có lớp phủ cho bộ đệm đó có thể khiến người dùng nghĩ rằng ứng dụng phản hồi nhanh hơn thực tế, giống như con trỏ, không bao giờ đóng băng). –

+0

Có, điều đó có hiệu quả - bởi vì đối với cửa sổ bản vẽ không đến từ một chủ đề khác;) – TomTom