2010-03-26 32 views
14

Tôi biết WPF phức tạp hơn một cách linh hoạt để có thể được nghĩ là sẽ thực hiện nhiều phép tính hơn. Nhưng kể từ khi kết xuất được thực hiện trên GPU, nó sẽ không được nhanh hơn so với Winforms cho cùng một ứng dụng (chức năng và trực quan)?Cái nào có hiệu suất thời gian chạy nhanh hơn: WPF hoặc Winforms?

Tôi có nghĩa là khi bạn không chạy bất kỳ trò chơi hoặc dựng hình 3D lớn nào, GPU không hoạt động nặng, phải không? Trong khi đó, CPU luôn bận.

Đây có phải là giả định hợp lệ hoặc là việc sử dụng GPU của WPF một hoạt động rất nhỏ trong đường ống của nó không? EDIT: Ứng dụng mà tôi quan tâm là phần mềm mô hình hóa và hoạt hình 3D, nơi bạn có khung nhìn 3d để điều hướng và chỉnh sửa cảnh, và các đối tượng bên trong khung cảnh. Nhưng tôi muốn sử dụng WPF vì kiến ​​trúc hiện đại của nó, và nó từ đầu.

EDIT2: Cũng vì mục đích của mình, tôi sẽ sử dụng DirectX để tự ứng dụng vì yêu cầu cao cấp của phần mềm. Đối với những người sử dụng kết thúc thấp hơn hoặc máy tính không có GPU chuyên dụng, điều đó là OK vì chúng không nằm trong khu vực khách hàng chính của tôi. Cũng giống như phần mềm 3D cao cấp khác dành cho phim ảnh và trò chơi, nó sẽ dễ hiểu khi yêu cầu một máy tính mạnh mẽ để hưởng lợi đầy đủ từ ứng dụng.

+1

Tùy thuộc vào ứng dụng. – SLaks

+0

Xin lỗi, hãy thêm chi tiết sau đó. –

+0

Tôi không có chuyên gia, nhưng tôi tin rằng phần cứng chính xác (và các trình điều khiển tương ứng) có thể có một ảnh hưởng đáng kể đến hiệu suất là tốt. –

Trả lời

18

Cung cấp máy có GPU, bạn sẽ có hiệu suất hiển thị tốt hơn trong WPF.

Chúng tôi có một ứng dụng máy tính để bàn lớn mà chúng tôi đã viết trong WinForms và hiện đang chuyển sang WPF. Chúng tôi đã chứng kiến ​​hiệu suất hiển thị tốt hơn nhiều, đặc biệt là khi thay đổi kích thước cửa sổ hoặc vẽ lại các điều khiển.

Chúng tôi cũng thấy rằng WPF "điều khiển" có trọng lượng nhẹ hơn so với điều khiển WinForm. Nếu tôi nhớ lại, các điều khiển WPF không nhất thiết yêu cầu một hệ điều hành xử lý, và không đăng ký các thông điệp Windows window thông qua WndProc, ít nhất là không độc lập.

Đối với trường hợp của bạn, vì bạn đang xây dựng một ứng dụng mô hình 3D, loại giả định một số phần cứng 3D trên máy, bạn hoàn toàn nên sử dụng WPF trên WinForms.

+0

Cảm ơn, cũng vì WPF cũng sử dụng GPU, sẽ có một cuộc chiến giữa ứng dụng và WPT chính nó trong việc sử dụng tài nguyên đó? –

+1

Không có gì nhiều hơn nếu bạn đã thực hiện hệ thống menu 2d của riêng bạn ở đầu ứng dụng 3D của bạn. Trong thực tế, WPF có lẽ sẽ làm điều đó hiệu quả hơn. :) –

6

Đây là câu hỏi thực sự khó trả lời.

Phần lớn hiệu suất WPF là GPU của bạn. GPU tốt hoạt động tốt để làm cho WPF hoạt động tốt. WPF có thể rất hiệu quả. Nếu yêu cầu của bạn là có GPU phong nha, vì đó là một chương trình tạo mô hình 3D, có thể bạn sẽ thấy hiệu suất WPF tốt hay tốt hơn Windows Forms - mặc dù điều này thực sự phụ thuộc vào những gì bạn đang sử dụng.

Điều đó đang được nói, thường khó so sánh - chủ yếu là vì WPF cho phép bạn thêm nhiều hiệu ứng hình ảnh mà mọi người có xu hướng thậm chí không bao giờ thử trong Windows Forms. Nhiều ứng dụng WPF "có vẻ" nhanh hơn mặc dù chúng thực sự chậm hơn trong một số trường hợp do các đầu mối trực quan bổ sung.

Điều đó đang được nói, nếu bạn có nhiều điều khiển, WPF thực sự có thể hoạt động tốt hơn Windows Forms với số tiền hợp lý. Trong Windows Forms, mỗi điều khiển yêu cầu một cửa sổ xử lý riêng biệt và nhận được các bộ thông báo của riêng nó. Với rất nhiều điều khiển, điều này thực sự có thể làm chậm những thứ xuống khá đáng kể.

Câu hỏi thực sự ở đây phải là hoàn thiện WPF. "đủ tốt" cho ứng dụng của bạn. Nếu bạn đang làm một ứng dụng mô hình 3D, rất có thể WPF sẽ không phải là nút cổ chai của bạn - nó sẽ ổn thôi.

+0

Cảm ơn, chi phí của việc yêu cầu xử lý cửa sổ riêng biệt đang xảy ra trong Winforms là gì? Ngoài ra kể từ khi WPF cũng sử dụng GPU, sẽ có một cuộc chiến giữa các ứng dụng và WPT chính nó trong việc sử dụng tài nguyên đó? –

+1

@Janan: Mỗi tay cầm cửa sổ phải nhận các tin nhắn riêng biệt thông qua bơm thông báo. Nếu bạn tạo một màn hình với hàng trăm điều khiển, nó thực sự bị chậm trong Windows Forms - đặc biệt nếu yêu cầu hiển thị tùy chỉnh. Đối với "chiến đấu" - không thực sự. Hãy nhớ rằng, Vista + W7 sử dụng card đồ họa cho TẤT CẢ việc render máy tính để bàn của bạn - GPU hiện đại là khá tốt trong việc xử lý này. Tôi làm sci. phần mềm/mô hình 3d và sử dụng WPF dành riêng cho các sản phẩm mới của chúng tôi và yêu thích sự hoàn hảo. –

+0

Cảm ơn Reed. Suy nghĩ tốt. Ngoài ra, các ứng dụng của bạn có sẵn trực tuyến không? Đã được tự hỏi nó sẽ được mát mẻ để chỉ nhìn thấy một ảnh chụp màn hình ngay cả: O –

2

Đối với mô hình 3D, WPF rõ ràng là một lựa chọn tốt hơn rất nhiều so với WinForms - nhưng nó vẫn là một cách lâu dài từ lý tưởng. Winforms không có (trực tiếp) hỗ trợ cho dựng hình 3D ở tất cả, và WPF có một số.Tuy nhiên, đối với một chương trình nhằm mục đích chủ yếu hướng tới dựng hình 3D, bạn có thể tốt hơn với một thứ gì đó dành riêng cho công việc dựng hình 3D, chẳng hạn như OpenGL hoặc Direct3D.

Ngày của riêng mình, không phải của những người cung cấp một lợi thế rất lớn trên WPF, nhưng trừ khi những gì bạn đang làm là khá chuyên ngành, tôi sẽ không sử dụng những người trực tiếp mặc dù. Tôi muốn sử dụng một cái gì đó như OpenSceneGraph hoặc Ogre3D, có thể sử dụng một trong số đó để hiển thị, nhưng cung cấp giao diện cấp cao hơn nhiều và thực hiện nhiều hơn để quản lý hiển thị cảnh của bạn.

Một trong hai hoặc cả hai có thể sử dụng WPF cho bản vẽ thực tế - nhưng tôi chắc chắn không phải ai cũng làm, ít nhất là hiện tại. Tôi không biết liệu họ có bao giờ sẽ - họ có thể, nhưng tôi nghi ngờ đó là một ưu tiên thực sự, vì họ đã hỗ trợ OpenGL và Direct3D. Vì mục đích của họ, WPF cung cấp rất ít lợi thế.

+0

Cảm ơn, yeah nó là một ứng dụng khá chuyên ngành trong cách nó xử lý mọi thứ. Ngay bây giờ tôi chỉ muốn hỗ trợ Windows, vì vậy sẽ dính vào DirectX. Tôi biết WPF có chức năng 3d nhưng tôi không nghĩ rằng đó là một cái gì đó để cạnh tranh với DirectX chính nó nếu tôi không sai. Nhưng tất cả các giao diện người dùng, vv Tôi có kế hoạch sử dụng WPF. –

+1

Trong khi OpenGL cũng là di động, lý do chính để thích nó hơn DirextX là chỉ đơn giản là * vì vậy * đẹp hơn nhiều để làm việc với. –

1

Xem như WPF thực sự sử dụng DirectX dưới mui xe và thực tế là bạn sử dụng XAML để xác định các đối tượng DirectX, WPF là giải pháp đơn giản nhất.

Example coding a camera in xaml:

<PerspectiveCamera x:Key="Camera" 
Position="0, 0, 4" 
LookDirection="0, 0, -4" 
UpDirection="0, 1, 0" 
FieldOfView="30"/> 
+0

Cảm ơn, vì vậy bạn có nghĩa là tôi có thể truy cập toàn bộ DirectX SDK bằng XAML? Tôi đã định sử dụng SlimDX cho công cụ 3d. –

+0

Cảm ơn, điều đó có ý nghĩa. –

+0

Một lời cảnh báo: mặc dù tôi đã tìm thấy nội dung 3D của WPF tuyệt vời, không có cách nào tốt để thực sự hiển thị nội dung 3D thành bitmap, vì vậy nếu bạn cần xuất cảnh 3D của mình, tôi sẽ SlimDX cho phần 3D. Xem http://stackoverflow.com/questions/2179042/rendertargetbitmap-and-viewport3d-quality-issues để biết thêm thông tin. – Grokys

7

Đối với kịch bản ứng dụng bạn mô tả, tôi mong chờ WPF để làm tốt hơn cho công việc WinForms 3D trên một GPU đầy đủ tính năng của một biên độ rộng.

Sự khác biệt giữa các loại ứng dụng không chỉ là hiển thị đường dẫn vector 3D. Kiến trúc nội bộ của WPF hoàn toàn khác với WinForms, được thiết kế đặc biệt để khắc phục các lỗi đã học được từ nhiều năm kinh nghiệm trước đó với các ứng dụng Windows GDI và WinForms.

(WinForms là một trình bao bọc khá mỏng xung quanh Windows GDI và Mô hình người dùng ban đầu được tạo vào cuối những năm 1980. Mô hình điều khiển người dùng Windows đã phát triển trong 25 năm qua, nhưng các mẫu kiến ​​trúc cốt lõi hầu như không thay đổi.)

Ví dụ: WPF luôn tách giao diện người dùng khỏi logic ứng dụng. Khi cửa sổ WPF đi để vẽ một cái gì đó, việc dựng hình thực tế xảy ra trên một chủ đề nền. Các hình ảnh được làm mới được chuyển sang màn hình hiển thị trong khoảng thời gian truyền lại video, do đó bạn không nhận được các phần trống hoặc các hiện vật "rách" trên màn hình.

WinForms không thực hiện việc này. Nếu bạn kết xuất với bề mặt DirectX hoặc OpenGL trong ứng dụng WinForms, bạn phải thực hiện công việc lật trang video và đảm bảo rằng nó xảy ra vào đúng thời điểm để tránh hiện tượng rách màn hình.

Điều khiển mặc định của Wpf là GPU nhận thức và có thể được tùy chỉnh theo kiểu với độ sáng và độ trong suốt và không biết tất cả GPU đều tăng tốc. Các điều khiển WinForms không được hưởng lợi đáng kể từ các tính năng của GPU, vì về những điều duy nhất mà WinForms (các điều khiển người dùng Windows) sử dụng để hiển thị là bitblit 2D và hình chữ nhật lấp đầy. Glows, minh bạch, hình ảnh động là tất cả có thể với WinForms, nhưng bạn phải làm tất cả công việc để thực hiện chúng.

Trong WPF, giao diện người dùng slickness chủ yếu là vấn đề về thiết kế và tạo kiểu để có được WPF để làm điều đó cho bạn. Trong WinForms, bạn phải tự đẩy các pixel.

+0

Ba là ít nhất một điều nhỏ nhặt, nhưng khó chịu với WPF trên Windows XP. Điều này được giải quyết trong Vista và lên, do đó, nó cắn người sử dụng một phiên bản nhúng của Windows (không có RTM của mà vượt ra ngoài XP). Các tạo tác là mất đồng bộ dọc khi làm hình ảnh động tương phản cao, thậm chí một cái gì đó giống như chơi một tập tin MPEG độ tương phản cao. –

+0

Nếu bạn phải hỗ trợ WinXP hoặc cũ hơn, tôi sẽ không khuyên bạn nên sử dụng WPF anyway. Chỉ vì khung công tác có thể thực thi về mặt kỹ thuật không có nghĩa là nó sẽ hoạt động tốt. ;> – dthorpe

+0

Quay lại sau đó, không có Windows Vista Embedded, chỉ có Windows XP Embedded :) Windows 7 Embedded đến năm sau ... –

Các vấn đề liên quan