API đồ họa cấp thấp đa nền tảng


11

Khi tạo một sự trừu tượng hóa hệ thống sẽ tốt hơn khi các nền tảng API khác nhau bị ẩn bởi một giao diện chung ở mức thấp nhất có ý nghĩa.

Có tính đến các API đồ họa gốc hiện đại (không có chức năng cố định) khác nhau: OpenGLES 2.0+, OpengGL 3.0+, DirectX 10.0+, Xbox DirectX 9, LibGCM

Nếu một người tạo ra một API đồ họa cấp thấp không trạng thái để đặt lên trên tất cả, thì cách tốt nhất để làm cho nó mỏng và nhanh nhất có thể là gì?


Yêu cầu để API không trạng thái là thú vị. Ví dụ, OpenGL là trạng thái và tôi nghĩ rằng một API không trạng thái bao bọc nó sẽ chỉ có ý nghĩa nếu nó ở cấp độ cao hơn nhiều, do đó, chẳng hạn, phải đẩy và bật các ma trận giống nhau cho mỗi và mọi bề mặt nó ám.
SpoonMeiser

Tránh các thay đổi trạng thái vô dụng vẫn có thể được thực hiện ở mức cao hơn, như bằng cách sắp xếp các cuộc gọi kết xuất dựa trên trạng thái của chúng trước khi gửi chúng đến thiết bị. Và bằng cách đặt trạng thái chỉ khi nó khác với trạng thái hiện tại.
NocturnDragon

Đó không phải là không quốc tịch mặc dù. Có thể tôi sai, nhưng những gì tôi nghĩ khi tôi nghĩ về trạng thái không trạng thái, là một API trong đó mỗi cuộc gọi hoàn toàn không phụ thuộc vào các cuộc gọi trước đó. Điều đó có nghĩa là bất kỳ thông tin nào thường được lưu trữ ở trạng thái ở đâu đó phải được chuyển trong mọi cuộc gọi cần thông tin đó. Ví dụ, đối với OpenGL, đây sẽ là các ma trận trên các tùy chọn ngăn xếp, chiếu sáng, đệm z và chuẩn hóa.
SpoonMeiser

Có, với mỗi cuộc gọi rút thăm bạn sẽ cần, dữ liệu lưới, trạng thái trộn, kết cấu cần liên kết, trạng thái lấy mẫu, v.v. Việc tối ưu hóa có thể được thực hiện sau đó, mà không thay đổi API tho. Hoặc có thể tôi đang đọc bình luận của bạn sai ..
NocturnDragon

Câu trả lời:


6

Mức thấp nhất có ý nghĩa theo quan điểm của tôi là một cái gì đó nói về các tài nguyên liên quan đến kết xuất - vb / ib, kết xuất bề mặt, kết cấu, đổ bóng, khối trạng thái, v.v.

Vấn đề ở đây là một số trong số này cần phải ở các định dạng khác nhau, tùy thuộc vào API - đó là nơi nó có một chút khó khăn. Cách dễ nhất là xử lý trước các tài nguyên tĩnh cho API tương ứng. Đối với những người năng động, chỉ sử dụng các trình tạo bóng để tạo ra chúng - điều đó khiến cho việc giữ nguyên các định dạng gốc khá đơn giản.

Tất cả những gì bạn làm ở cấp độ cao hơn là thiết lập các đường ống với các tài nguyên được đính kèm và đưa chúng cho GPU. Bạn sẽ thấy rằng không phải mọi thứ đều có thể được trừu tượng hóa theo cách đó, đặc biệt nếu bạn tận dụng các thủ thuật dành riêng cho phần cứng. Nhưng đó là một khởi đầu tốt.

(Sidenote: nếu bạn coi các thủ thuật dành riêng cho nền tảng là một loại tài nguyên đặc biệt, bạn có thể đẩy toàn bộ khái niệm này đi khá xa.)

Vì vậy, theo một cách nào đó, bạn sẽ tạo ra hai điều: Trình quản lý tài nguyên phần cứng, cộng với bộ công cụ để thiết lập DAG của các tài nguyên này.


Tôi chưa bao giờ nghĩ về việc coi những thứ đặc thù của nền tảng là tài nguyên. Nghe có vẻ là một ý tưởng rất tốt! Cảm ơn.
NocturnDragon

10

Do phạm vi API rộng mà bạn muốn đề cập, cách tiếp cận gói điển hình có thể không hiệu quả và dễ gặp khó khăn trong việc ánh xạ các khái niệm API qua một số API khác có thể hoặc không hỗ trợ các chức năng cụ thể ở các mức độ khác nhau.

Kết quả là, cách tiếp cận hợp lý nhất sẽ là tạo ra một API tập trung vào tính năng . Mặc dù cách tiếp cận này ngăn người dùng API sử dụng tất cả các chức năng có sẵn, nhưng nó đơn giản hóa đáng kể việc triển khai từng phụ trợ và cho phép tối ưu hóa cụ thể phụ trợ mà không thể thực hiện được.

Nó cũng đơn giản hóa rất nhiều việc quản lý chức năng không được hỗ trợ cho người dùng API; họ không còn phải kiểm tra xem hàm X có tồn tại hay không và xác định các tính năng nào bị ảnh hưởng, mà thay vào đó chỉ cần truy vấn chính tính năng đó để xem nó có được hỗ trợ với cấu hình hiện tại không. Ngay cả khi bạn hỗ trợ các chế độ một phần hoặc giới hạn cho các tính năng, bối cảnh được cung cấp sẽ giúp quản lý dễ dàng hơn nhiều.

Về mặt tạo trình kết xuất không trạng thái (còn được gọi là trình kết xuất dựa trên trình), thông thường, khóa 64 bit được sử dụng để đóng gói và gửi lệnh để kết xuất. Từ thời điểm đó, có rất nhiều sự linh hoạt về cách thực hiện các lệnh và thông tin nào cần gửi tùy thuộc vào các tính năng và khả năng bạn muốn hỗ trợ.


Đây thực sự là một ý tưởng tốt. Và nó là một phần của thiết kế mà tôi đang cố gắng tạo ra, nhưng điều tôi có trong đầu là triển khai các tính năng này trên một API cấp thấp phổ biến. Nhưng nó có thể là trường hợp đối với một số tính năng bạn vẫn cần đi sâu vào API gốc cho một số trường hợp cụ thể hơn.
NocturnDragon

Một phần của ý tưởng là để tránh xây dựng API cấp thấp phổ biến và phải xử lý gói bằng cách tiếp cận mẫu số chung thấp nhất. Bằng cách di chuyển mức độ trừu tượng lên một mức, bạn sẽ hạn chế phần nào tính năng được thiết lập, nhưng bạn cũng có thể khai thác từng nền tảng. Để xử lý nhu cầu thỉnh thoảng để truy cập sâu hơn, tôi thích cung cấp một tiêu đề hiển thị các tiêu đề nền tảng và một số trợ giúp nội bộ; nó có thể phá phiên bản thành phiên bản, nhưng nó ở đó nếu bạn cần.
Jason Kozak

1

Để bắt đầu, mỗi API thực hiện mọi thứ khác nhau, do đó, không cần phải nói rằng việc gói tất cả các API ở trên sẽ khó khăn. Điều đó nói rằng, đôi khi cần phải làm như vậy: tại một số điểm, một trò chơi chỉ cần chạy trên nhiều nền tảng bất kể nó khó đến mức nào.

Tôi nghĩ rằng cách tốt nhất để thực hiện điều này là đưa ra các chức năng có thể được triển khai trên tất cả các API cơ bản và trừu tượng đó và chỉ có thế. Nếu bạn đang phát triển một trò chơi đa nền tảng, bạn sẽ không triển khai mọi chức năng tối nghĩa mà mỗi API hỗ trợ, bạn sẽ chỉ thực hiện những gì bạn cần. Điều này cũng giúp giữ cho API nhỏ và nhanh.

Để tránh sự lộn xộn của mỗi triển khai API khác nhau được đóng gói vào đầu ra, việc biên dịch phải được thực hiện với các tệp tiêu đề trung lập nền tảng và các tệp mã cụ thể của nền tảng. Sau đó, tệp mã cụ thể cho nền tảng đích sẽ là tệp duy nhất được biên dịch giữ API nhỏ.



-4

Bạn có thể muốn kiểm tra thư viện SDL hoặc Allegro . Cả hai đều là thư viện trò chơi cấp độ thấp, có tính di động cao, có cách cắm chúng vào ngữ cảnh OpenGL để bạn có thể kết xuất đồ họa của mình ở đó. SDL nổi tiếng khi được Loki Games sử dụng để chuyển một số trò chơi phổ biến từ những năm 2000 sang Linux, và Allegro có nhiều thời gian hoạt động và có một cộng đồng lớn các nhà phát triển trò chơi nghiệp dư.


4
Điều này thực sự không trả lời được câu hỏi, chưa kể rằng rất có thể bao bọc cả OpenGL và DirectX (xem Ogre3D, Irrlicht, v.v.).
Jason Kozak

Hãy xem xét các trò chơi bạn đã chơi. Có bao nhiêu trong số chúng có các tùy chọn để sử dụng DirectX hoặc OpenGL? Đó là cách tạo ra nhiều hàm bao cho hai thư viện để có thể hỗ trợ một trong hai. Bạn có một trí tưởng tượng hạn chế. :-P
Ricket

Tôi nhận ra rằng có một số trò chơi cho phép bạn chọn xem bạn muốn kết xuất đồ họa bằng OpenGL hay DirectX, nhưng câu hỏi là về API đa nền tảng, vì vậy tôi nghĩ rằng câu trả lời là đầy đủ, tôi sẽ chỉnh sửa đoạn đầu tiên, Tuy nhiên.
chiguire

1
câu hỏi là về API cấp thấp không trạng thái đa nền tảng. SDL và Allegro không có gì để làm với nó.
NocturnDragon

@NocturnDragon - tiêu đề câu hỏi hơi sai lệch. Thoạt nhìn, tôi mong đợi câu hỏi là về các lựa chọn API có sẵn và tôi cho rằng người trả lời này cũng làm như vậy.
a_m0d
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.