Neden oyunların doğrudan piksel çizebileceği OpenGL ve DirectX gibi grafik çerçevelerimiz var?


16

Oyunlar ve diğer grafik yoğun uygulamalar OpenGL ve DirectX gibi çerçeveler kullanır. Ayrıca piksel gölgelendirici ve DX12 gibi özelliklere ihtiyaç duyarlar.

Peki her şeyi piksel piksel çizebildiğimizde neden tüm bu çerçevelere ve GPU özelliklerine ihtiyacımız olsun?

İlk olarak, oyunun bir şekilde derlenmesi gerekir, böylece piksel piksel çizilir. Bu, büyük olasılıkla oyunu yürütülebilir hale getirir, ancak daha hızlı olacak ve herhangi bir 32 bit renk GPU (hatta eski GPU) üzerinde çalışacak mı?

İlk 3D oyunların piksel piksel çizildiğini biliyorum, ama neden şimdi yapmıyorlar?


Genel olarak bir çok şey üzerinde bir işlem yapmak, her şey üzerinde ayrı ayrı yapmaktan daha etkili ve düşünülmesi daha kolaydır.
user541686

2
Çünkü her oyunun her grafik kartı için yeniden yazılması gerekiyor. Grafik kartını kullanmadığı sürece, ama yavaşlardı.
user253751

GPU şirketlerinin kendi DirectX sürücülerini yaratmaları gerektiğini düşünüyorum
Suici Doga

1
"Ama her şeyi piksel piksel çizebildiğimizde neden tüm bu çerçevelere ve GPU özelliklerine ihtiyacımız olsun?" işte o iyi ol' günlerde nasıl yapıldığını. Wolfenstein 3D, Doom, Duke Nukem 3D, Quake ve geç 90'ların diğer oyunlarında saf yazılım oluşturma kullanılmıştır (Quake, OpenGL oluşturucuyu bir seçenek olarak sundu).
el.pescado

1
@MatthewRock Yardımcı olmuyorsun. Bir işletim sistemini bir docker konteynerinin içindeki bir oyunla kesinlikle paketleyebilir ve konteyneri dağıtabilirsiniz. Bu şekilde, kullanıcının dağıtımı için kütüphane bağımlılıkları yüklemesi gerekmez.
Navin

Yanıtlar:


23

Hız, bunun olmamasının en yaygın nedenidir yapılmamasının . Aslında önerdiğiniz şeyi yapabilirsiniz, eğer kendi işletim sisteminizi yaparsanız, mimari nedenlerle çok yavaş olacaktır. Yani daha hızlı olduğu biraz varsayım. Daha hızlı olsa bile, geliştirme açısından daha az verimli olacaktır (işin 10 katı için% 1 hız artışı gibi).

Verilerin CPU'dan grafik kartına kopyalanması nispeten yavaş bir işlemdir. Ne kadar az kopyalarsanız güncelleme hızınız o kadar yüksek olabilir. İdeal olarak, GPU'nuzdaki verilerin çoğuna sahip olmanız ve yalnızca küçük veri yığınlarını güncellemeniz gerekir. 1920x1200 veya daha fazlasına kıyasla 320x200 pikselden fazla kopyalama arasında bir dünya var. Kenarlar büyüdüğünde güncellemeniz gereken piksel sayısının karesel olarak arttığını görün.

Örnek: GPU'ya görüntüyü pikselleri manuel olarak farklı konumlardaki video belleğine kopyalamaktan 10 piksel daha hareket ettirmesini söylemek daha ucuzdur.

Neden bir API ile uğraşmak zorundasınız? Çünkü bu sizin sisteminiz değil. İşletim sistemi, güvenlik nedeniyle istediğiniz her şeyi yapmanıza izin veremez. İkincisi, işletim sisteminin donanımı soyutlaştırması gerektiğinden, işletim sistemi bile bazı soyut sistemlerle sürücü ile konuşur.

Aslında, tüm işi kendiniz yaptıysanız, sıfıra yakın olarak sisteminizin daha hızlı olma olasılığını değerlendiririm. Bu biraz C ve montajı karşılaştırmaya benziyor. Tabii montaj yazabilirsiniz, ancak derleyiciler bugünlerde oldukça akıllı ve her zaman daha iyi ve daha iyi optimize. Verimliliğiniz azalsa bile manuel olarak daha iyi olmak zordur.

Not: Bir API, tıpkı eski oyunlarda olduğu gibi bu güncellemeyi yapmayı imkansız kılmaz. Hepsi bu kadar verimsiz. API zihni yüzünden değil, verimsiz bir dönem olduğu için.

PPS: Bu yüzden Vulkan'ı dağıtıyorlar.


6
See the number of pixels you need to update grows exponetially when the sides grow.İkinci olarak, sanırım.
Cthulhu

"Verileri CPU'dan grafik kartına kopyalamak nispeten yavaş bir işlemdir." Bu doğru, ama alakasız. 60 milyon / saniyede birkaç milyon pikselden fazla kopyalama, mütevazı PCI-E bağlantılarında bile kolayca elde edilebilir (saniyede yalnızca birkaç yüz megabayt gerekir.)
Coxy

2
@ pjc50 Bu yanlış değil, aynı zamanda tam olarak doğru değil. GPU, büyük miktarda veriye paralel olarak tek bir programı (genellikle bir gölgelendirici) çalıştırmak için uzmanlaşmıştır. Bu nedenle, bir GPU'nun hesaplama gücünü kullanmak için aynı işlemleri birçok veri üzerinde gerçekleştirmeniz gerekir. Programınız bunu yapmazsa, programı CPU üzerinde çalıştırmanız daha iyi olur.
Nero

2
x22x

1
Kopyalama ve taşıma hakkında konuşuyorsunuz, ancak daha da önemlisi gerçek görüntü üretmektir. Hangi nesnenin hangi noktada görüneceğini, nasıl aydınlatılacağını, dumanın etkilerinin ne olacağını vb. Belirlemelisiniz. GPU'lar bu işlemleri hızlı ve paralel olarak gerçekleştirmek için oldukça optimize edilmiştir. API'lar yaygın işlemleri ifade etmeyi kolaylaştırır.
IMil

15

32-bit renkli GPU (eski olanlar bile) üzerinde çalışıyor musunuz?

Burada biraz tarih var: 90'lı yılların ortalarında grafiksel hızlandırıcılar kullanıma başlayana kadar PC'de oyunlar böyle yapıldı. Gerçekten tüm donanımlarda işe yaradı, çünkü donanım çok fazla iş yapmıyordu.

Bir grafik hızlandırıcı, özel donanım ve paralellik kullanarak bir CPU'dan çok daha hızlı piksellerin çizilmesine izin verir . Hızlandırıcı bir dizi işlemci çekirdeği içerir. Bir masaüstü bilgisayarda yaşa bağlı olarak 1-8 arasında çekirdek bulunur. GTX970Ti grafik kartımda 1664 (bin altı yüz altmış dört!) Çekirdek var. Bu açıkça ham hız için PC'yi uzun bir şekilde yener.

Ancak, hızlandırıcılar standart değildir ve hızlarına ulaşmak için genellikle garip bilgisayar mimarisi hilelerini içerir. Kartın belirli bir marka ve modeline göre özelleştirilmemiş bir oyun yazmak için bir API'nin olması gerekir. DirectX, GL ve gölgelendirici dilleri bunun için kullanılır. Aslında, gölgelendiricileri yazma olduğunu doğrudan piksel çizer bir program yazmaya en yakın şey - bu kart, paralel olarak sizin için piksel başına bir tane o programın Bin kopyayı çalışacaktır sadece var.


Dizüstü bilgisayarımın APU'su 686MHZ'de 256 gölgelendirici çekirdeğine sahipken, tabletimin
192'si

Hey, Titan X'in içinde 5760 çekirdek var.
Daniel

@Daniel Titan X'in ultra yükseklikte 30 fps'ye çıktığı herhangi bir oyun var mı? Titan X çok güçlü
Suici Doga


@Daniel Bu oyunların geliştiricileri yaklaşık 2-4 Titan X kartına ihtiyaç
duymalı

14

Sadece joojaa'nın cevabına eklemek için işler vardır hala piksel piksel çekiliyor. Pikselleri bir köşe gölgeleyici / montajcı / rasterleştirici kullanarak oluşturuyorsunuz, daha sonra bir parça gölgelendirici kullanarak tekstüre ediyor ve aydınlatıyorsunuz. Tüm bunlar, video kartınız bir blitter ve bir çerçeve arabelleğinden çok daha fazlası olmadığında 90'lı yıllarda yazılımda yapıldı, ancak cehennem kadar yavaştı. Böylece modern GPU'ların icadı.

Gerçekleşen çizim matematiği temel olarak Doom günlerinde olduğu gibi aynıdır, ancak şimdi bir avuç CPU çekirdeği yerine yüzlerce / binlerce gölgelendirici ALU'da çalışıyor. API'ler, perde arkasında aynı GPU talimatlarıyla eşleşir. Onlar sadece birden fazla satıcı platformunda bir ton gnarly GPU meclisi yazmak zorunda kalmamak için var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.