Trường hợp Khung (XNA) kết thúc và API (DX) bắt đầu ở đâu?


7

Tôi đã đọc rất nhiều câu hỏi thú vị khi hỏi về XNA so với OpenTK so với SlimDX so với OpenGL so với DX và trong khi thật sự hữu ích để có được những ấn tượng chung khác từ 100 giờ sử dụng các API / Khung khác nhau này, tôi đã không thấy bất kỳ câu trả lời nào xác định rõ phạm vi của mỗi là gì.

Về mặt lý thuyết, người ta hiểu sự khác biệt giữa API, Engine và Framework là gì, nhưng đối với một người có kinh nghiệm hạn chế với các hệ thống đồ họa, thì khó có thể thấy những gì ở khía cạnh thực tế rơi vào mỗi loại. (Không được thực hiện dễ dàng hơn bởi tất cả các phần trùng lặp! Ví dụ: XNA triển khai đường ống nội dung như một phần không thể thiếu)

Lấy ví dụ về việc loại bỏ khuôn mặt - XNA 'làm' điều này trong nền mà không cần lập trình viên cần phải suy nghĩ về nó, nhưng nó xảy ra ở đâu? Có chức năng 'cull face' trong DX phải được gọi, hoặc có lẽ ở trên trong XNA không? Hoặc GPU hoặc trình điều khiển của nó làm điều đó?

Tôi đã đọc trong tài liệu cho một trong những dự án được quản lý (thật khó chịu là tôi không thể nhớ được) về việc khó thực hiện mã kết xuất hiệu quả và cách dự án đó trừu tượng hóa nó. Điều này làm tôi lo lắng một chút và khiến tôi tự hỏi không biết XNA đang làm gì bên dưới Draw IndexedPrimologists sẽ phải được thực hiện thủ công nếu khung công tác được để lại cho thứ gì đó linh hoạt hơn.

XNA làm gì trong nền, khi kết xuất khối đó, API được quản lý sẽ không?


gamedev.stackexchange.com/questions/12701/ Quảng cáo tổng hợp công cụ so với phần khung..mà API đơn giản là cách trình bày khung / thư viện / công cụ đó.
Vịt Cộng sản

Khác với câu hỏi loại trừ khuôn mặt của bạn, câu hỏi này khá mơ hồ. Bạn đang tìm kiếm loại câu trả lời nào? Dường như với tôi rằng bạn đang yêu cầu một danh sách tất cả mọi thứ mà mọi thư viện làm, để bạn có thể nhận ra lớp nào làm gì. Tôi nghĩ có lẽ bạn nên tham khảo tài liệu liên quan và, nếu có sẵn, mã nguồn trên cơ sở từng trường hợp. Câu hỏi loại bỏ khuôn mặt của bạn có thể được trả lời, nhưng phần còn lại của câu hỏi đóng gói dường như mở kết thúc với tôi.
Ricket

Tôi nghĩ rằng câu hỏi chính là trong tiêu đề. OP muốn biết XNA đang làm bao nhiêu "công việc bận rộn" so với lập trình trong C ++ và Direct X
Nate

@Ricket, Xin lỗi có vẻ hơi mơ hồ vì tôi không chắc chắn chính xác cách tốt nhất để diễn đạt câu trả lời. Về danh sách các lớp, bạn đã đúng; không phải là danh sách đầy đủ, nhưng có thể một vài ví dụ về loại hàm mà XNA gọi trong nền hoặc phương thức được yêu cầu để hiển thị trong OpenGL nhưng không phải trong XNA, sẽ làm tốt việc minh họa mức độ khác biệt lớn như thế nào Là. Nate là chính xác; nếu bạn đến từ cấp độ thấp, bạn sẽ dễ dàng nhìn thấy những gì đã bị ẩn , nhưng nếu bạn bắt đầu với XNA thì khó thấy những gì còn thiếu (và do đó bạn sẽ tăng lên bao nhiêu).
sebf

(Tôi đã chỉnh sửa câu hỏi để được kê đơn hơn một chút) @ Vịt Cộng sản, Cảm ơn, tôi thấy chủ đề đó hữu ích - đặc biệt là câu nói cuối cùng của bạn về Trò chơi được khai thác từ Động cơ Tôi nghĩ minh họa rất rõ Động cơ thực sự là gì.
sebf

Câu trả lời:


0

Tôi nghĩ rằng câu hỏi sẽ được trả lời tốt hơn nếu bạn đảo ngược nó. Chính xác thì card đồ họa hoạt động như thế nào và những cuộc gọi nào được DirectX hoặc OpenGL thực hiện để sử dụng các tính năng này?

Điều này sẽ không trả lời câu hỏi của bạn, nhưng vì DirectX và OpenGL thêm rất nhiều lớp cấp cao hơn để đơn giản hóa mọi thứ cho bạn, tôi tin rằng sự khác biệt quá mơ hồ với những gì XNA cung cấp chẳng hạn.

Đối với những điều cơ bản, bạn sẽ tìm thấy sự tương đồng trong các cuộc gọi DirectX / XNA bởi vì ở một mức độ (thấp hơn) nhất định, mọi thứ không thể được tiết chế nhiều hơn và các cuộc gọi sẽ phải tự thực hiện.

Vì vậy, tôi muốn nói hãy tạo một công cụ kết xuất đơn giản trong OpenGL (Tôi muốn nói dễ tiếp cận hơn để có mức độ thấp hơn) và xem nơi sẽ đưa bạn đến!


Thật khó để chọn câu trả lời khi sự đồng thuận giữa tất cả về cơ bản là câu hỏi không có, nhưng đây thực chất là những gì tôi sẽ làm như tôi nghĩ bây giờ cách duy nhất để hiểu sự khác biệt là chơi với SlimDX hoặc OpenTK (mặc dù tôi bắt đầu với hội Tôi đã rất hư hỏng bởi C # Tôi không nghĩ rằng tôi sẽ không có GC ngay bây giờ;)) và tận mắt nhìn thấy nó.
sebf

1

Một khung, về cơ bản, cung cấp một API. Thông thường, nó sử dụng hoặc kết thúc các API khác để thực hiện việc này. Hai thuật ngữ không nhất thiết phải khác biệt, không có sự khác biệt rõ ràng về phạm vi và điều đó không thực sự quan trọng đối với bạn để có thể phân biệt sự khác biệt - điều quan trọng là phải biết mức độ trừu tượng của bất kỳ API, thư viện, khung, công cụ nào, nền tảng, hoặc gói hoạt động tại. Rất tiếc, việc tìm ra điều này thay đổi tùy theo từng trường hợp.


0

Khung bắt đầu ... nơi API kết thúc. API là một tập hợp các hàm / lớp giới hạn / bất cứ thứ gì bạn có thể sử dụng và khung chỉ bao bọc tất cả những thứ đó.

Nếu bạn hỏi về bao nhiêu thứ diễn ra giữa cuộc gọi của bạn với bất kỳ chức năng khung nào bạn đang sử dụng để thực hiện bất kỳ phương thức API nào mà cuộc gọi của nó, thì điều đó thực sự không thể trả lời được trong trường hợp chung. Một số điều dễ dàng, một số điều thực sự trừu tượng hóa và có thể ẩn những điều hữu ích để biết về (đó là lý do tại sao tôi cho rằng bạn đang hỏi câu hỏi này).

Đối với XNA cụ thể, bạn có thể có thể xem mã bằng cách sử dụng một công cụ như ILSpy để mở các tệp XNA DLL và xem những gì đang diễn ra dưới mui xe.


Tôi đã có một cái nhìn về phương pháp DrawIndexedPrimologists bằng .NET Reflector, và theo nhiều cách nó rất hữu ích nhưng trong những cách khác không đầy đủ. Một mặt tôi không nghĩ rằng các lập trình viên DX điều hướng vẽ hình học bằng cách lấy một con trỏ đến một thiết bị, bù vào nó bằng một hằng số được mã hóa cứng để lấy một con trỏ hàm, và sau đó gọi nó (ít nhất là tôi thực sự hy vọng là không !: -O ). Mặt khác, có vẻ như hàm DrawUserPrimologists, ít nhất là đối với chức năng đó, chỉ là một trình bao bọc với rất nhiều kiểm tra lỗi và XNA không thực hiện bất cứ điều gì ngoài nó.
sebf

Tôi nghĩ rằng tôi có thể ước tính sai về phạm vi của các ví dụ tôi liệt kê khác nhau như thế nào và như bạn và Kylotan nói cách duy nhất để thấy là học API được quản lý.
sebf

2
Hằng số mã hóa cứng để truy xuất con trỏ hàm là kết quả của quá trình dịch ngược từ C ++ / CLI. Nếu bạn viết ứng dụng Bảng điều khiển C ++ / CLI và tham chiếu apis Direct3D gốc và thực hiện một số thứ như 'pDirect3DDevice-> EndScene ();' nó sẽ dịch ngược thành những gì bạn đã thấy (hoặc tương tự) khi được xem là C # trong Reflector - Tôi tin rằng rất nhiều XNA được viết bằng C ++ / CLI chứ không phải C #.
jeffora

@jeffora, Điều đó có ý nghĩa hơn. Liệu .NET Reflector có tự dịch ngược theo yêu cầu khi mở thư viện không?
sebf

Reflector của RedGate về cơ bản là ánh xạ IL tới ngôn ngữ được quản lý tương đương. Bạn sẽ nhận thấy bạn có thể thay đổi ngôn ngữ và thậm chí chỉ xem IL. Mã nguồn được hiển thị không phải lúc nào cũng chính xác với những gì đã nhập vào - đó là dịch ngược chính xác những gì trình biên dịch tạo ra. Mã C # từ các phần của XNA đã dịch ngược thậm chí sẽ không biên dịch nếu bạn cố gắng tự viết nó (bằng C #)
jeffora
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.