Ứng dụng WPF độc lập có thể tạo giao diện trông giống giao diện Flash không?


7

Có vẻ như WPF đã được tạo ra như là câu trả lời của ứng dụng cho Adobe Flash. Silverlight được sử dụng để tạo các trang web. Nhưng, liệu chức năng tương tự có thể được kéo vào một ứng dụng WPF độc lập. Scaleform cho phép Flash được sử dụng trong các trò chơi C ++ không được quản lý. WPF có thể được sử dụng để tạo cùng loại giao diện không? Những gì tôi đã đọc dường như khiến tôi tin rằng nó có thể. Nhưng, tôi chưa thấy bất kỳ ảnh chụp màn hình nào của các ứng dụng hiển thị loại giao diện này.


Chắc chắn là có liên quan đến trò chơi, nhưng bạn vẫn có thể nhận được câu trả lời tốt hơn trên stackoverflow.com
Iain

Câu trả lời:


5

WPF được tạo ra để cung cấp một cách tốt hơn cho các nhà phát triển Windows để xây dựng GUI cho các ứng dụng máy tính để bàn. Silverlight được tạo ra như một câu trả lời cho Flash và sử dụng lại nhiều API WPF nhưng có cách triển khai khác.

Về lý thuyết, bạn có thể sử dụng WPF để tạo GUI cho trò chơi, nhưng thực tế có lẽ bạn sẽ không: -

  • Trò chơi của bạn sẽ phụ thuộc vào .NET framework được cài đặt. Đây không còn là vấn đề lớn nữa, nhưng vẫn còn một điều đáng lo ngại nữa là không hoạt động.
  • WPF sử dụng Direct3D 9 để kết xuất. Có một phần mở rộng mà trên Vista / Win7 và XP SP3 trở lên cho phép bạn phân bổ một bề mặt và chia sẻ nó giữa WPF và công cụ trò chơi C ++ không được quản lý của bạn. Bạn có thể gặp vấn đề với DX10.1 hoặc 11.
  • Thời gian chạy .NET tạm ngưng tất cả các luồng liên quan đến bất kỳ cách nào với bộ nhớ được quản lý trong quá trình thu gom rác. Để tránh việc vòng lặp trò chơi của bạn bị treo, bạn cần đưa ra cách trao đổi dữ liệu giữa mã không được quản lý và thời gian chạy .NET để tránh gọi vào thời gian chạy .NET thông qua interop. Có lẽ bạn sẽ có một khu vực chung của bộ nhớ không được quản lý mà cả hai bạn đều có quyền truy cập và đồng bộ hóa bằng cách sử dụng các nguyên tắc phân luồng.
  • Đây là vấn đề thực sự: Nếu bạn đi xuống tuyến đường này, bạn sẽ chuyển giao quyền kiểm soát cửa sổ của mình cho WPF. Bạn chỉ cần cung cấp cho WPF một bề mặt D3D chứa kết xuất 3d cuối cùng của bạn và sau đó nó kết hợp với bất cứ thứ gì nó đã tạo trước khi trình bày nó. Bạn sẽ bị khóa với lịch làm mới của WPF và cũng không có cơ hội đi toàn màn hình theo cách mà các trò chơi 3d thường làm.

Có khả năng tình huống này có thể được giải cứu mặc dù. Có một triển khai lại mã nguồn mở của .NET được gọi là Mono. Họ có một tiểu dự án tên là Moonlight , một triển khai lại của Silverlight. Với mã nguồn có sẵn, có khả năng nó có thể được tích hợp theo cách tương tự như Scaleform và cho phép bạn xây dựng GUI bằng công cụ soạn thảo Expression Blend tuyệt vời của Microsoft. Tôi không nghĩ có ai đã làm điều này chưa nên có thể có những vấn đề cần được khám phá, nhưng tôi chỉ ném nó ra như một ý tưởng.

EDIT: Điều này xảy ra với tôi sau khi thêm điều này rằng có thể sự quan tâm của bạn không quá nhiều trong việc tận dụng các công cụ tác giả như Flash Studio hoặc Expression Blend và có thể bạn chỉ muốn có thể vẽ đồ họa 2d chất lượng cao nhanh chóng. Trong trường hợp đó, có Direct2D API mà Microsoft đã thêm vào Windows 7 và sau đó được chuyển ngược lại sang Vista.


FYI, trình thu gom rác đã được cải thiện đáng kể trong .NET 4. Hiện tại nó hỗ trợ bộ sưu tập nền của cả ba thế hệ đối tượng, nhưng tôi không biết liệu / những thay đổi có thể ảnh hưởng đến vấn đề # 3 trong danh sách của bạn hay không. Nếu ai biết, hãy chia sẻ :).
Mike Strobel

Mono và Moonlight được MIT cấp phép, do đó, việc nhúng một hoặc cả hai trong số chúng vào một trò chơi chắc chắn là có thể thực hiện được (và đang được thực hiện, ví dụ như trong Cuộc sống thứ hai). Đã có ít nhất một nỗ lực được lên kế hoạch để thực hiện việc nhúng Moonlight như vậy cho một trò chơi: tirania.org/blog/archive/2009/Nov-12-2.html#comment-22844845 (Không biết nó có xảy ra / đã thành công không hoặc không, mặc dù vậy.)
WorldMaker

1

Bạn chắc chắn có thể tạo các loại giao diện tương tự trong WPF, nhưng việc tích hợp chúng vào trò chơi Direct3D là vấn đề. Bạn có thể lưu trữ nội dung Direct3D trong WPF (thông qua D3DImage), nhưng nội dung 3D của bạn sẽ được soạn thảo trong ứng dụng WPF, do đó việc kết xuất trở nên phụ thuộc vào WPF. Do đó, bạn có thể thấy hiệu suất tương đối kém, vì bạn bị giới hạn bởi tốc độ khung hình của WPF. Ngoài ra, như U62 đã lưu ý trong nhận xét của mình, WPF chỉ có thể lưu trữ nội dung Direct3D 9 (trái ngược với Direct3D 10/11). Tuy nhiên, bạn có thể giải quyết vấn đề này vì IDirect3DDevice9Excó khả năng chia sẻ tài nguyên giữa các thiết bị. Do đó, bạn có khả năng có thể tạo mục tiêu kết xuất được chia sẻ trong Direct3D 10 hoặc 11 và đưa nó vào WPF thông qua một IDirect3DDevice9Exthiết bị trung gian . Jeremiah Morrill thảo luận về kỹ thuật này ở đây .

Một giải pháp thay thế, mặc dù khác xa, sẽ là kết xuất UI WPF của bạn trong một cửa sổ xếp lớp riêng biệt phía trên nội dung Direct3D, như được mô tả ở đây .

Ngoài ra còn có các cách để truy cập vào bề mặt Direct3D bên trong của WPF , cách này sẽ cung cấp cho bạn cách lưu trữ nội dung WPF trong cảnh Direct3D bên ngoài (thay vì cách khác). Tuy nhiên, đây là một hack khá khó chịu và có thể dễ dàng bị phá vỡ bởi các bản phát hành WPF trong tương lai.

Tất nhiên, không điều nào trong số này có liên quan nếu bạn không thực sự cần phải tương tác với Direct3D. Các trò chơi không yêu cầu đồ họa 3D phức tạp chắc chắn có thể được phát triển hoàn toàn trong WPF . WPF có một số phương tiện 3D đơn giản theo ý của mình, mặc dù chúng thường không đủ cho bất cứ thứ gì ngoài hình dạng nguyên thủy với kết cấu đơn giản. Nó cũng hỗ trợ trình đổ bóng pixel tùy chỉnh, mặc dù có nhiều hạn chế (ví dụ: chúng phải là hiệu ứng một lượt).

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.