Apakah saya benar-benar perlu menggunakan API grafik?

22

Apakah perlu menggunakan API grafis untuk mendapatkan akselerasi perangkat keras dalam game 3D? Sejauh mana dimungkinkan untuk bebas dari ketergantungan pada API kartu grafis seperti OpenGL, DirectX , CUDA, OpenCL atau yang lainnya?

Bisakah saya membuat API grafik atau perpustakaan saya sendiri untuk game saya? Meskipun sulit, apakah secara teori aplikasi 3D saya dapat secara mandiri menghubungi driver grafis dan membuat semuanya pada GPU?

Rubayet Bijoy
sumber
30
CUDA dan OpenCL bukan API grafik.
Soapy
4
Untuk "hubungi driver grafis secara mandiri" Anda selalu memerlukan API!
Josef
21
Tidak, Anda tidak memerlukan API untuk grafik, Anda dapat mengakses driver secara langsung, bahkan tidak berhenti di situ, Anda dapat menulis driver Anda sendiri untuk berbicara dengan perangkat keras secara langsung jika Anda menginginkannya. Tetapi pertanyaan Anda berikutnya jauh lebih penting: "Haruskah saya menggunakan grafik API?", Ya, ya Anda harus.
Kevin
5
Anda orang sadar bahwa API juga dibuat pada satu titik? Pengemudi terkena panggilan eksternal yang mengimplementasikan dan membungkus API dengan mudah menggunakan panggilan API.
Kevin
3
Tidak ada kartu grafis (atau OS, pada titik ini) yang tidak mendukung OpenGL. Ini benar-benar berjalan pada segalanya, jadi jika satu-satunya alasan Anda tidak ingin menggunakannya adalah untuk "kompatibilitas", itu adalah masalah yang sepenuhnya tidak berdasar.
Sandalfoot

Jawaban:

39

Saya pikir banyak jawaban kehilangan satu poin penting: Anda dapat menulis aplikasi yang mengakses perangkat keras secara langsung, tetapi tidak pada sistem operasi modern . Ini bukan hanya masalah waktu, tetapi masalah "Anda tidak punya pilihan".

Windows, Linux, OSX, dll. Semua melarang akses perangkat keras langsung ke aplikasi yang sewenang-wenang. Ini penting untuk alasan keamanan: Anda tidak ingin aplikasi acak dapat membaca memori GPU yang sewenang-wenang karena alasan yang sama Anda tidak ingin aplikasi acak dapat membaca memori sistem. Hal-hal seperti framebuffer untuk rekening bank Anda atau yang lainnya tinggal di memori GPU. Anda ingin hal itu terisolasi dan dilindungi dan akses dikendalikan oleh OS Anda.

Hanya driver yang dapat berbicara langsung dengan sebagian besar perangkat keras, dan satu-satunya cara untuk berbicara dengan pengemudi adalah melalui OS HAL yang terbuka dan antarmuka masing-masing driver yang tidak kompatibel. Antarmuka driver itu tidak hanya akan berbeda untuk setiap vendor tetapi bahkan akan berbeda antara versi driver itu sendiri, sehingga hampir tidak mungkin untuk berbicara langsung ke antarmuka dalam aplikasi konsumen. Lapisan-lapisan ini sering ditutupi oleh kontrol akses yang semakin membatasi kemampuan aplikasi untuk mengaksesnya.

Jadi tidak, game Anda tidak bisa hanya menggunakan perangkat keras secara langsung, kecuali tentu saja Anda hanya menargetkan sistem operasi yang tidak aman seperti DOS, dan satu-satunya pilihan Anda yang layak untuk sebuah game pada sistem operasi konsumen modern adalah menargetkan API publik seperti DirectX, OpenGL atau Vulkan.

Sean Middleditch
sumber
Salam, tambahan yang bagus untuk diskusi. Anda belajar sesuatu yang baru setiap hari.
Insinyur
1
Apa yang membatasi pilihan Anda menulis modul kernel untuk melakukan akses perangkat keras? Juga, jika Anda menargetkan satu kartu (yang ada di mesin Anda), masalah kompatibilitas akan hilang; meskipun masih jauh dari hal sepele untuk dilakukan; tetapi dalam ranah yang layak, diberikan driver direkayasa terbalik; terutama jika Anda hanya memiliki ruang lingkup terbatas tentang apa yang ingin Anda lakukan dengan kartu tersebut.
Joel Bosveld
1
Pengisian driver pada banyak OS membuatnya sulit untuk mendistribusikan modul Anda. Anda tentu dapat membangun semua jenis driver OS dan peretasan secara lokal, tetapi Anda tidak akan dapat mendistribusikan gim Anda secara luas, yang saya asumsikan adalah aspek yang diinginkan karena OP bertanya tentang membuat gim yang sebenarnya, bukan sia-sia demo teknologi. : p
Sean Middleditch
27

Praktis itu perlu, ya. Ini perlu karena kecuali jika Anda ingin menghabiskan waktu bertahun-tahun menulis apa yang pada dasarnya kode driver untuk banyak konfigurasi perangkat keras yang berbeda di luar sana, Anda perlu menggunakan API yang menyatukan terhadap driver yang ada yang ditulis oleh vendor GPU untuk semua sistem operasi dan perangkat keras yang populer.

Satu-satunya alternatif yang realistis adalah Anda tidak menggunakan akselerasi 3D, dan alih-alih mencari rendering perangkat lunak yang, asalkan ditulis dalam sesuatu yang benar-benar portabel seperti C, akan dapat berjalan di hampir semua sistem / perangkat. Itu bagus untuk gim yang lebih kecil ... sesuatu seperti SDL cocok untuk tujuan ini ... ada juga yang lain di luar sana. Tetapi ini tidak memiliki kemampuan 3D yang melekat sehingga Anda harus membuatnya sendiri ... yang bukan tugas sepele.

Juga ingat bahwa rendering CPU tidak efisien dan menderita kinerja yang buruk dibandingkan dengan GPU.

Insinyur
sumber
11
Untuk memanfaatkan manfaat OP: rendering perangkat lunak juga memiliki kinerja yang secara signifikan lebih buruk. Meskipun ini mungkin tidak masalah dalam hal frame rate untuk permainan yang lebih sederhana, saya ragu banyak pelanggan akan menghargai pengurangan masa pakai baterai yang mereka derita karena perenderan perangkat lunak menjaga CPU mereka jauh lebih aktif daripada yang seharusnya diperlukan.
Chris Hayes
1
Poin bagus, @ChrisHayes ... diedit untuk ditambahkan. Seseorang kadang-kadang menganggap hal-hal seperti itu jelas.
Insinyur
1
Sepertinya paragraf pertama Anda mengatakan bahwa secara teknis tidak perlu menggunakan API. Tentu, ini menghemat banyak waktu programmer, mungkin lebih dari satu orang yang ditawarkan, tetapi itu tidak perlu . Seperti yang saya harapkan, kecuali ada semacam verifikasi kriptografi yang terjadi antara driver kartu grafis dan perpustakaan perangkat lunak tingkat tinggi.
David Z
5
@ DavidZ Apakah Anda punya driver tertulis? Apakah Anda tahu bagaimana rasanya berinteraksi dengan perangkat keras yang rumit ketika Anda bahkan tidak memiliki spesifikasi, ketika bahkan insinyur yang dipekerjakan oleh produsen kartu memerlukan waktu berbulan-bulan untuk mengembangkan driver? Sekarang gandakan dengan banyak arsitektur yang harus Anda dukung. Jika saya berkata, "Mustahil untuk mendaki Everest tanpa peralatan," tentu saja ada kemungkinan Anda bisa, tetapi itu adalah kesempatan yang sangat kecil ... mengapa ada orang yang mempermasalahkan hal itu?
Insinyur
1
Tanyakan pada OP mengapa mereka ingin memperdebatkan intinya ;-) tetapi terutama setelah diedit, cukup jelas itulah yang mereka inginkan.
David Z
8

API seperti OpenGL atau DirectX sebagian diimplementasikan oleh sistem operasi dan sebagian diimplementasikan oleh driver grafis itu sendiri.

Itu berarti ketika Anda ingin membuat API tingkat rendah Anda sendiri yang memanfaatkan kemampuan GPU modern, Anda pada dasarnya perlu menulis driver grafis sendiri. Memastikan bahwa driver Anda bekerja dengan semua kartu grafis umum akan menjadi tantangan, terutama karena vendor sering tidak terlalu terbuka dengan spesifikasinya.

Philipp
sumber
6

Boot PC Anda ke dalam MS-DOS. Kemudian, menggunakan salinan Ensiklopedia Pemrogram Game PC Anda, Anda dapat menulis langsung ke dalam register VESA kartu dan ke dalam memori video. Saya masih memiliki kode yang saya tulis 20 tahun lalu untuk melakukan ini dan membuat 3D yang belum sempurna dalam perangkat lunak.

Atau, Anda bisa menggunakan DirectX; ini adalah lapisan abstraksi yang sangat tipis, dan juga memungkinkan Anda menulis langsung ke buffer video dan kemudian menukarnya ke layar.

Ada juga pendekatan ekstrem untuk membangun perangkat keras video Anda sendiri .

pjc50
sumber
4

Jawaban lain menjawab pertanyaan utama Anda dengan cukup baik: secara teknis, itu mungkin, tetapi dalam praktiknya, jika tujuan Anda adalah untuk memperluas basis pelanggan Anda, Anda sebenarnya melakukan yang sebaliknya. Sambil membuang banyak sekali pekerjaan untuk mendukung ribuan konfigurasi perangkat keras dan OS yang berbeda yang perlu Anda dukung.

Namun, itu tidak berarti Anda harus 100% bergantung pada satu API tertentu. Anda selalu dapat membuat kode lapisan abstraksi Anda sendiri, dan kemudian menukar implementasi yang lebih spesifik (misalnya implementasi DirectX, implementasi OpenGL, ...) masuk dan keluar.

Bahkan kemudian, itu mungkin tidak sepadan. Pilih saja sesuatu yang berfungsi cukup baik untuk keperluan Anda, dan selesaikanlah. Anda adalah pembuat game indie - Anda harus tetap fokus pada hal-hal yang membuat game, bukan pada minutae. Buat game saja!

Luaan
sumber
4

Singkatnya: Secara teoritis Anda bisa, tetapi tidak layak, dan Anda tidak akan mendapatkan keuntungan apa pun. Keterbatasan yang dimiliki API hari ini berkurang setiap hari, Anda memiliki CUDA dan OpenCL dan shader. Jadi memiliki kendali penuh tidak lagi menjadi masalah.


Penjelasan lebih lengkap:

Menjawab ini membosankan ya . Pertanyaan sebenarnya adalah mengapa ?

Saya tidak bisa membayangkan mengapa Anda ingin melakukan ini selain untuk tujuan belajar. Anda harus tahu bahwa pada titik tertentu, pengembang memiliki kebebasan untuk melakukan apa pun dengan implementasi rendering CPU mereka, semua orang memiliki API sendiri, mereka mengendalikan semua yang ada di "jalur pipa". Dengan diperkenalkannya saluran pipa tetap dan GPU, semua orang beralih ..

Dengan GPU Anda mendapatkan kinerja "lebih baik", tetapi kehilangan banyak kebebasan. Pengembang grafis mendorong untuk mendapatkan kebebasan itu kembali. Oleh karena itu, lebih banyak pipa kustomisasi setiap hari. Anda dapat melakukan hampir semua hal menggunakan CUDA / OpenCL dan bahkan shader, tanpa menyentuh driver.

concept3d
sumber
1

Anda ingin berbicara dengan perangkat keras. Anda perlu menggunakan cara untuk berbicara dengan perangkat keras. Cara itu adalah antarmuka ke perangkat keras. Itulah yang OpenGL, DirectX, CUDA, OpenCL dan apa pun itu.

Jika Anda naik ke level yang lebih rendah, Anda hanya menggunakan antarmuka level yang lebih rendah, tetapi Anda masih menggunakan antarmuka, hanya kartu yang tidak berfungsi dengan banyak kartu yang berbeda dengan kartu yang lebih tinggi.

Peter - Unban Robert Harvey
sumber
1

Untuk mendapatkan Akselerasi Perangkat Keras 3D tanpa menggunakan API tradisional, Anda pada dasarnya perlu menulis kode Anda sendiri untuk menduplikasi fungsi driver grafis. Jadi cara terbaik untuk belajar bagaimana melakukan ini adalah dengan melihat kode driver grafis.

Untuk kartu NVIDIA, Anda harus melihat proyek open source nouveau . Mereka memiliki koleksi sumber daya yang hebat di sini .

Untuk merek lain dari kartu grafis, Anda dapat menemukan proyek dan dokumentasi serupa.

Perhatikan bahwa seperti yang telah disebutkan dalam jawaban lain, sebagian besar sistem operasi modern akan mencegah program ruang pengguna untuk secara langsung mengakses perangkat keras, sehingga Anda perlu menulis kode Anda dan menginstalnya sebagai driver sistem operasi. Sebagai alternatif, Anda dapat menggunakan sistem operasi FreeDOS, yang tidak memiliki batasan seperti itu, dan seharusnya Anda (secara teori) langsung mengakses perangkat keras, dan memungkinkan Anda untuk menulis program reguler yang membuat grafik akselerasi perangkat keras 3D. Perhatikan bahwa, bahkan memanfaatkan kode dari driver grafis open source yang ada, ini akan menjadi pekerjaan non-sepele yang luar biasa (dan sejauh yang saya ketahui, belum pernah dilakukan, dan karena berbagai alasan, mungkin sebenarnya tidak secara teknis memungkinkan).

john
sumber
1

Menyingkirkan DirectX atau OpenGl tidak akan menghapus dependensi, itu akan memperkenalkan lebih banyak dari mereka. Jawaban lain sudah mengandung beberapa poin bagus mengapa bahkan tidak mungkin untuk berbicara dengan perangkat keras grafis secara langsung (setidaknya itu tidak layak), tetapi jawaban pertama saya adalah: Jika Anda memang menulis perpustakaan yang abstrak semua 3d umum perangkat keras grafis ke dalam API tunggal Anda akan secara efektif telah menulis ulang DirectX / OpenGl. Jika Anda menggunakan kode Anda untuk menulis permainan, Anda akan menambahkan perpustakaan baru Anda sebagai dependensi baru, sama seperti Anda sekarang memiliki DirectX / OpenGl sebagai dependensi.

Dengan menggunakan DirectX atau OpenGl, dependensi Anda pada dasarnya mengatakan "Kode ini bergantung pada pustaka untuk menyediakan kode yang menjelaskan cara menjalankan perintah tertentu pada kartu grafis yang berbeda". Jika Anda pergi tanpa perpustakaan seperti itu, Anda akan memperkenalkan ketergantungan "Kode ini tergantung pada perangkat keras grafis yang berperilaku persis sama dengan perangkat keras yang ada saat saya membangun permainan."

Abstraksi seperti OpenGl atau DirectX memungkinkan produsen perangkat keras untuk memberikan kode mereka sendiri (driver) yang mengarah ke basis kode umum, sehingga game lebih mungkin dijalankan pada perangkat keras yang bahkan tidak ada saat permainan ditulis.

Lars Kokemohr
sumber
0

Pertama-tama, CUDA dan OpenCL bukan grafis apis. Mereka menghitung apis.

Masalah dengan menulis api grafis Anda sendiri adalah sangat kompleks. Anda dapat berinteraksi dengan perangkat keras secara langsung, tetapi tidak ada jaminan bahwa jika ia bekerja pada sistem dengan X CPU, X GPU, jumlah X ram dan sistem operasi X, ia akan bekerja pada sistem dengan Y CPU, Y GPU, dll. Satu poin bagus adalah DirectX bekerja dengan driver mode kernel. Itu di-root ke dalam kernel. Juga, apis grafis tidak dibuat untuk mendukung GPU. GPU (dan drivernya) dibuat untuk mendukungnya. Jadi, Anda tidak bisa membuat grafik api kecuali Anda membuat OS sendiri dan menggunakan x86, interupsi VGA yang disediakan. Tetapi Anda masih tidak dapat berinteraksi dengan GPU dengan benar dan Anda akan terjebak pada resolusi rendah.

Saya mengerti bahwa Anda ingin membangun semuanya sendiri dan tidak menggunakan mesin atau semacamnya. Tetapi membuat api grafik Anda sendiri hanya akan menciptakan ketidaknyamanan bagi pengguna.

UDXS
sumber
0

Anda dapat menulis driver dan API Anda sendiri, tidak ada yang bisa menghentikan Anda kecuali kemampuan dan tingkat pengetahuan Anda. Jika tidak ada yang lain itu akan menjadi pengalaman belajar yang baik, masalah sebenarnya adalah bahwa tanpa memiliki banyak pengalaman grafis sebelumnya maka bahkan jika Anda seorang programmer yang hebat Anda mungkin akan bingung dengan apa yang perlu Anda lakukan ... atau bahkan untuk memulai.

Namun antarmuka yang Anda buat sendiri akan lebih mudah digunakan dan lebih stabil untuk Anda daripada sesuatu yang diperbarui di belakang Anda terus-menerus. Jadi sedikit mengejutkan bagi saya bahwa lebih banyak orang tidak mengikuti rute ini, tetapi kenyataannya hanya sedikit orang yang memiliki ketajaman teknis dan tidak ada yang mau membayar seseorang selama bertahun-tahun untuk belajar bagaimana melakukan semua ini, maka mungkin memiliki mereka meninggalkan perusahaan dan meninggalkan mereka dalam kesulitan. Hal yang baik bagi mereka tentang standardisasi adalah membuat karyawan jauh lebih bisa dikeluarkan dan mengurangi risiko.

Yudrist
sumber