Mengapa kita memiliki kerangka kerja grafis seperti OpenGL dan DirectX, padahal game hanya bisa menggambar piksel secara langsung?

16

Game dan aplikasi intensif grafis lainnya menggunakan kerangka kerja seperti OpenGL dan DirectX. Mereka juga membutuhkan fitur seperti pixel shader dan DX12.

Tetapi mengapa kita membutuhkan semua kerangka kerja dan fitur GPU ini ketika kita bisa menggambar semuanya piksel demi piksel?

Pertama, gim harus dikompilasi sedemikian rupa sehingga dapat ditarik piksel demi piksel. Ini mungkin membuat game ini dapat dieksekusi besar, tetapi apakah ini akan lebih cepat dan bekerja pada GPU warna 32-bit (bahkan yang lama)?

Saya tahu bahwa game 3D pertama digambar pixel demi pixel, tetapi mengapa mereka tidak melakukannya sekarang?

Suici Doga
sumber
Secara umum melakukan satu operasi pada banyak hal lebih efisien dan lebih mudah untuk dipikirkan daripada melakukannya pada setiap hal secara individual.
user541686
2
Karena setiap game perlu ditulis ulang untuk setiap kartu grafis. Kecuali mereka tidak menggunakan kartu grafis, tetapi mereka akan lambat.
user253751
Saya pikir perusahaan GPU harus membuat driver DirectX mereka sendiri
Suici Doga
1
"Tapi mengapa kita membutuhkan semua kerangka kerja dan fitur GPU ini ketika kita bisa menggambar semuanya piksel demi piksel?" itulah yang dilakukan pada hari-hari baik. Wolfenstein 3D, Doom, Duke Nukem 3D, Quake dan sebagian besar game lainnya pada akhir '90 menggunakan rendering perangkat lunak murni (Quake menawarkan renderer OpenGL sebagai opsi).
el.pescado
1
@MatthewRock Anda tidak sedang membantu. Anda tentu dapat membundel OS dengan game di dalam wadah buruh pelabuhan dan mendistribusikannya. Dengan begitu, pengguna tidak perlu menginstal dependensi perpustakaan untuk distro mereka.
Navin

Jawaban:

23

Kecepatan adalah alasan paling umum mengapa ini tidak dilakukan. Bahkan Anda dapat melakukan apa yang Anda usulkan, jika Anda membuat sistem operasi Anda sendiri, itu hanya akan sangat lambat karena alasan arsitektur. Jadi anggapan bahwa ini lebih cepat sedikit cacat. Bahkan jika itu akan lebih cepat, itu akan kurang efisien dalam hal pengembangan (seperti peningkatan kecepatan 1% selama 10 kali pekerjaan).

Menyalin data dari CPU ke kartu grafis adalah operasi yang relatif lambat. Semakin sedikit Anda menyalin semakin cepat kecepatan pembaruan Anda. Jadi idealnya Anda memiliki sebagian besar data pada GPU Anda dan hanya memperbarui potongan kecil data. Ada perbedaan besar antara menyalin lebih dari 320x200 piksel dibandingkan dengan 1920x1200 atau lebih. Lihat jumlah piksel yang Anda perlu perbarui tumbuh secara kuadrat ketika sisi tumbuh.

Contoh: Lebih murah memberi tahu GPU untuk memindahkan gambar 10 piksel ke kanan daripada menyalin piksel secara manual ke memori video di lokasi yang berbeda.

Mengapa Anda harus menggunakan API? Hanya karena itu bukan sistem Anda. Sistem operasi tidak memungkinkan Anda untuk melakukan apa pun yang Anda inginkan untuk alasan keamanan. Kedua, karena sistem operasi perlu memisahkan perangkat keras, bahkan OS sedang berbicara dengan driver melalui beberapa sistem yang disarikan, sebuah API jika Anda mau.

Bahkan saya akan menilai kemungkinan bahwa sistem Anda akan lebih cepat, jika Anda hanya melakukan semua pekerjaan sendiri, hampir mendekati nol. Ini seperti membandingkan C dan perakitan. Tentu Anda dapat menulis assembly, tetapi kompiler cukup pintar hari ini dan mengoptimalkan lebih baik dan lebih baik setiap saat. Sulit untuk menjadi lebih baik secara manual, bahkan jika Anda bisa, produktivitas Anda akan berkurang.

PS: API tidak memungkinkan untuk melakukan pembaruan ini seperti halnya game lama melakukannya. Itu hanya tidak efisien itu saja. Bukan karena pikiran API tetapi karena periode tidak efisien.

PPS: Inilah mengapa mereka meluncurkan Vulkan.

joojaa
sumber
6
See the number of pixels you need to update grows exponetially when the sides grow.Secara kuadrat, saya pikir.
Cthulhu
"Menyalin data dari CPU ke kartu grafis adalah operasi yang relatif lambat." Ini benar, tetapi tidak relevan. Menyalin lebih dari beberapa juta piksel pada 60 fps dapat dengan mudah dicapai melalui tautan PCI-E yang sederhana (hanya membutuhkan beberapa ratus megabita per detik).
Coxy
2
@ pjc50 Itu tidak salah, tetapi juga tidak sepenuhnya benar. GPU khusus untuk menjalankan satu program (biasanya shader) secara paralel pada sejumlah besar data. Jadi, Anda perlu melakukan operasi yang sama pada banyak data untuk benar-benar menggunakan kekuatan komputasi GPU. Jika program Anda tidak, lebih baik Anda menjalankan program pada CPU.
Nero
2
x22x
1
Anda berbicara tentang menyalin dan memindahkan, tetapi yang lebih penting adalah pembuatan gambar yang sebenarnya. Anda harus menentukan objek mana yang akan terlihat pada titik mana, bagaimana hal itu akan menyala, apa yang akan menjadi efek asap, dll, dll. GPU sangat dioptimalkan untuk melakukan operasi ini dengan cepat dan secara paralel. API membuatnya mudah untuk mengekspresikan operasi umum.
IMil
15

bekerja pada GPU warna 32-bit (bahkan yang lama)?

Sedikit sejarah di sini: ini adalah bagaimana permainan dilakukan pada PC hingga akselerator grafis mulai tersedia pada pertengahan 90-an. Itu memang bekerja pada semua perangkat keras, karena perangkat keras tidak melakukan banyak hal.

Akselerator grafis memungkinkan gambar piksel jauh lebih cepat daripada CPU, dengan menggunakan perangkat keras dan paralelisme khusus. Akselerator berisi sejumlah inti prosesor. PC desktop akan memiliki antara 1-8 core tergantung pada usia. Kartu grafis GTX970Ti saya memiliki inti 1664 (seribu enam ratus enam puluh empat!). Ini jelas mengalahkan PC untuk kecepatan mentah dengan jauh.

Namun, akselerator tidak distandarisasi, dan seringkali menyertakan trik arsitektur komputer yang aneh untuk mencapai kecepatan mereka. Untuk menulis game yang tidak dikustomisasi untuk merek dan model kartu tertentu, API harus ada. Dan itulah yang digunakan untuk DirectX, GL dan bahasa shader. Sebenarnya, menulis shader adalah hal yang paling dekat dengan menulis program yang menarik piksel secara langsung - hanya saja kartu akan menjalankan seribu salinan program itu untuk Anda secara paralel, satu per piksel.

pjc50
sumber
APU laptop saya memiliki 256 core shader @ 686MHZ sedangkan tablet saya memiliki 192.
Suici Doga
Hei, Titan X memiliki 5760 core di dalamnya.
Daniel
@Daniel Apakah ada permainan yang berjalan di Titan X <30fps di ketinggian sangat tinggi. Titan X sangat kuat
Suici Doga
Ummm, Salah satunya, mungkin: maximumpc.com/10-most-graphically-demanding-pc-games
Daniel
@Daniel Para pengembang game-game itu pasti membutuhkan sekitar 2-4 kartu Titan X :)
Suici Doga
14

Hanya untuk menambah jawaban joojaa , hal-hal yang masih ditarik pixel dengan pixel. Anda hanya menghasilkan piksel menggunakan vertex shader / assembler / rasterizer, lalu membuat tekstur dan menyalakannya menggunakan fragmen shader. Ini semua dilakukan dalam perangkat lunak di tahun 90-an ketika kartu video Anda tidak lebih dari sebuah blitter dan buffer bingkai, tetapi lambat sekali. Oleh karena itu penemuan GPU modern.

Matematika menggambar yang terjadi pada dasarnya sama dengan yang ada di masa Doom, tapi sekarang ini dijalankan pada ratusan / ribuan ALU shader daripada beberapa core CPU. API memetakan pada dasarnya ke set instruksi GPU yang sama di belakang layar. Mereka hanya di sana untuk menghentikan Anda harus menulis satu ton perakitan GPU degil di berbagai platform vendor.

russ
sumber