Saat membuat abstraksi sistem lebih baik memiliki platform API yang berbeda disembunyikan oleh antarmuka umum di tingkat terendah yang masuk akal.
Memperhatikan API grafik asli modern (tanpa pipeline fungsi tetap) yang berbeda: OpenGLES 2.0+, OpengGL 3.0+, DirectX 10.0+, Xbox DirectX 9, LibGCM
Jika seseorang membuat API grafik tingkat rendah tanpa kewarganegaraan untuk duduk di atas semuanya, apa cara terbaik untuk membuatnya setipis dan secepat mungkin?
architecture
software-engineering
graphics
cross-platform
NocturnDragon
sumber
sumber
Jawaban:
Tingkat terendah yang masuk akal dari sudut pandang saya adalah sesuatu yang berbicara tentang sumber daya yang terlibat dalam rendering - vb / ib, membuat permukaan, tekstur, shader, blok negara, dll.
Masalahnya di sini adalah bahwa beberapa dari ini harus dalam format yang berbeda, tergantung pada API - di situlah agak rumit. Cara termudah untuk mengatasinya adalah dengan pra-proses sumber daya statis untuk masing-masing API. Untuk yang dinamis, gunakan hanya shader untuk menghasilkannya - yang membuatnya cukup mudah untuk tetap dalam format asli.
Yang Anda lakukan di level yang lebih tinggi adalah mengatur jalur pipa dengan sumber daya terlampir dan menyerahkannya ke GPU. Anda akan menemukan bahwa tidak semuanya dapat disarikan dengan baik dengan cara itu, terutama jika Anda memanfaatkan trik khusus perangkat keras. Tapi ini awal yang baik.
(Sidenote: jika Anda memperlakukan trik platform khusus sebagai jenis sumber daya khusus, Anda dapat mendorong keseluruhan konsep ini cukup jauh.)
Jadi, Anda akan menciptakan dua hal: Manajer sumber daya perangkat keras, ditambah toolkit untuk menyiapkan DAG sumber daya ini.
sumber
Dengan cakupan luas API yang ingin Anda bahas, pendekatan pembungkus yang tipikal cenderung tidak efisien dan rentan terhadap kesulitan dalam memetakan konsep-konsep API di beberapa API lain yang mungkin atau mungkin tidak mendukung fungsi-fungsi tertentu hingga tingkat yang berbeda-beda.
Akibatnya, pendekatan yang paling masuk akal adalah membuat API fitur-sentris . Meskipun pendekatan ini mencegah pengguna API dari menggunakan semua fungsionalitas yang tersedia, pendekatan ini sangat menyederhanakan implementasi setiap backend, dan memungkinkan optimasi spesifik backend yang tidak mungkin dilakukan.
Ini juga sangat menyederhanakan pengelolaan fungsionalitas yang tidak didukung untuk pengguna API; mereka tidak lagi harus memeriksa apakah fungsi X ada, dan menentukan fitur mana yang terpengaruh, tetapi sebaliknya hanya perlu menanyakan fitur itu sendiri untuk melihat apakah didukung dengan konfigurasi saat ini. Bahkan jika Anda mendukung mode sebagian atau terbatas untuk fitur, konteks yang disediakan membuatnya lebih mudah untuk dikelola.
Dalam hal membuat renderer tanpa kewarganegaraan (juga dikenal sebagai submission ), biasanya kunci 64bit digunakan untuk mengemas dan mengirimkan perintah untuk rendering. Dari titik itu ada banyak fleksibilitas dalam hal bagaimana menjalankan perintah dan informasi apa yang harus disampaikan tergantung pada fitur dan kemampuan apa yang ingin Anda dukung.
sumber
Untuk mulai dengan, setiap API melakukan hal-hal yang berbeda sehingga harus pergi tanpa mengatakan bahwa membungkus semua API di atas akan sulit. Yang mengatakan, kadang-kadang perlu untuk melakukannya: pada titik tertentu permainan hanya perlu dijalankan pada lebih dari satu platform terlepas dari seberapa sulit untuk melakukannya.
Saya pikir cara terbaik untuk melakukan ini adalah menemukan fungsionalitas yang dapat diimplementasikan pada semua API yang mendasarinya dan abstrak itu dan hanya itu. Jika Anda mengembangkan game multi platform, Anda tidak akan menerapkan setiap fungsi yang tidak jelas yang didukung oleh setiap API, Anda hanya akan mengimplementasikan apa yang Anda butuhkan. Ini juga membantu menjaga API tetap kecil dan cepat.
Untuk menghindari kekacauan dari setiap implementasi API yang berbeda yang dimasukkan ke dalam output, kompilasi harus dilakukan dengan file header netral platform dan file kode platform spesifik. Kemudian, file kode khusus untuk platform target akan menjadi satu-satunya yang dikompilasi menjaga API kecil.
sumber
Ada artikel tentang GPU Pro tentang ini, oleh Emil Persson (Humus)
http://gpupro.blogspot.com/2009/12/making-it-large-beautiful-fast-and.html
sumber
Anda mungkin ingin memeriksa perpustakaan SDL atau Allegro . Keduanya adalah pustaka permainan tingkat rendah, sangat portabel, yang memiliki cara untuk menghubungkannya dalam konteks OpenGL sehingga Anda dapat membuat grafik Anda di sana. SDL terkenal karena ia menonaktifkan Loki Games untuk memindahkan beberapa game populer dari tahun 2000 ke Linux, dan Allegro memiliki banyak waktu untuk berjalan dan memiliki komunitas pengembang game amatir yang hebat.
sumber