OpenGL, SFML ve SDL’nin yazılıma göre avantajı nedir?


24

Casey Muratori'nin çerçeveleri kullanmadan bir oyun motoru yarattığı Handmade Hero akışını izlemeye başladım . Dün, bir görüntünün ekrana nasıl çekildiğini gösterdiği kısma geldim. Anladığım kadarıyla, çizmek istediği ekranın büyüklüğü kadar büyük bir hafıza ayırdı. Sonra ayırdığı tampon belleğe geçtiği bir bitmap yarattı ve os'a özgü bir işlev kullanarak ekrana çizdi.

Bu oldukça yalındır görünüyor. GameMaker'ı kullandım, Love2D'ye değiştirdim, Sprite Kit ile biraz çalıştım ama bu kafa karıştırıcı katmanların altında gerçekte neler olup bittiğini merak ediyordum.

Buna göre, yapmanız gereken tek şey bir tampon ayırmak, bir bitmap geçmek ve ekrana çizmek iken neden grafik kütüphanelerini (OpenGL, SFML, SDL,…) kullanmaktan rahatsız olmalısınız?

Eğer ekranınıza farklı şeyler çizmek istiyorsanız, onları sadece bitmap'inize yazıp ara belleğe geçirin. Programlama konusunda oldukça yeniyim, ama bu benim için oldukça basit görünüyor. Yanılıyorsam lütfen beni düzeltin.


11
Daha sonra dizisinde (bölüm 220 civarında) opengl kullanacak. Bunu yapmasının nedeni hız.
cırcır ucube,

5
Hile ekrana ne çizileceğini belirliyor . Her bir pikselin hangi renge karar vereceğine karar vermek için önce tüm GPU dokusu / gölgelendirme öğeleri, üçgenler, kamera projeksiyonları vb. Piksel renklerini ekrana iterek kolay olanıdır.
kullanici14146

2
Kayıt için, SDL ve OpenGL birbirini dışlayan değil. SDL aynı zamanda pencereleri, olayları ve girişi sadece bir grafik kütüphanesi olmak yerine ele alan bir "donanım soyutlama katmanı" dır. Ayrıca SDL, OpenGL ile birlikte kullanılma desteğine sahiptir, böylece OpenGL grafikleri idare ederken SDL, grafik olmayan tüm işleri yapabilir. Ayrıca, OpenGL’nin en sık GPU’yla doğrudan çalıştığını, SDL’nin derlenmekte olan sürüme ve sisteme bağlı olabileceğini veya olmayabilir.
Pharap

SFML oluşturma için OpenGL kullanır, dolayısıyla gerçekten tüm SFML'ler OpenGL kullanımı için daha basit bir arayüz sağlar.
Cornstalks

2
Casey'nin yaptığı şey hala bir grafik kütüphanesi kullanıyor. Kitaplığa GDI adı verilir ve işletim sisteminin ana API'sinin bir parçası olmasına rağmen, teknik olarak hala bir grafik kitaplığıdır.
Pharap

Yanıtlar:


41

Bu sadece uygulama hızı ile ilgili değil, aynı zamanda basitlikle de ilgilidir. Bu örnekte kullanılan yazılım oluşturma, donanım ivmesini (GPU) kullanmaktan çok daha yavaş olsa da, ekrana birkaç bitmap çizmek, performans düşüşünü fark etmeyeceğiniz önemsiz bir iştir.

Bununla birlikte, üçgen rasterleştirme, derinlik sıralaması ve benzeri gibi düşük seviyeli aktivite, GPU'nun birkaç komutla dolaylı olarak ele alabileceği iyi anlaşılmış kavramlardır. Bunları yazılım kipinde yeniden uygulamak esasen tekerleği yeniden icat ediyor. Oluşturma işleminin nasıl yapıldığına dair düşük düzeyde bir anlayış kazanmak istiyorsanız, sorun değil, kendimi biraz keşfetmek için bir 3B yazılım oluşturucuyu yazdım, ancak çoğu durumda OpenGL'in daha hızlı yapabileceği zaman kaybı kutu.

Verdiğiniz örnek son derece basit, ekranda sadece tek bir görüntü çiziyor, bu nedenle uygulama kolaydır. Yine de karmaşıklığı katmanlaştırmaya başladığınızda, her şeyin doğru şekilde oluşturulmasını sağlamak için giderek daha karmaşık hale geldiğini göreceksiniz. İnsanların, Quake 3B yazılım oluşturma günlerinde geri yapmak zorunda oldukları şeyler delilikteydi, yine de çok fazla gitmediğinizi takdir ediyorum.


12
OpenGL noktalar, çizgiler ve üçgenler gibi terimleri bilir. Çoğu zaman üçgenlerle çalışacaksınız. Öğrenmek için OpenGL ile çalışmak nasıl önerebilir I opengl-tutorial.org . OpenGL’nin kaputun altında ne yaptığını öğrenmek için resmi wiki’ye bir göz atın: opengl.org/wiki/Rendering_Pipeline_Overview
tkausl

1
+ 1'e gidecektim ama “tekerleği yeniden icat etme” ile ilgili biraz hoşuma gitmedi çünkü bilgisayar tarihi açısından yanlış bir izlenim bıraktığını hissediyorum. Bitmap görüntülemesi ilk olarak gerçekleşti, bu nedenle OpenGL "tekerleği yeniden icat eden" oldu. Ancak bunu yapmak için iki iyi nedenleri vardı: 1) Standardizasyon ve 2) GPU hızlandırma. Yeni versiyon iyileştirilmişse (yani ahşap vagon tekerleklerine sahip lastikli jantlar), tekerleğin yeniden icat edilmesi her zaman kötü bir şey değildir. Buradaki kilit nokta, yazılım gösteriminin tekerleği yeniden icat etmesi değil, GPU görüntülemesinden daha düşük olması gerektiği olmalıdır.
Pharap

4
@Pharap şimdi dışında , bir yazılım oluşturucuyu yazmak, tarihsel olarak olup olmamasından bağımsız olarak kesinlikle tekerleği yeniden icat ediyor.
porglezomp

1
Bu sadece yarım cevap. Bir sonraki cevap diğer yarısıdır, ancak tam bir cevap (OpenGL ile bahsettiği diğer şeyler arasındaki farkın bir açıklaması da dahil olmak üzere) bu sorunun doğru cevabı olacaktır.
Jasper

1
@ user148013 "opengl nokta, çizgi, üçgen gibi terimleri biliyor mu?" Modern OpenGL sadece bu ilkellerle ilgilenir . Onlardan başka hiçbir şeyi rasterleştiremezsiniz.
Nax 'vi-vim-nvim'

25

Benim sorum şudur: Yapmanız gereken tek şey bir tampon ayırmak, bir bitmap geçmek ve ekrana çizmek iken neden açık gl, sfml, sdl gibi bir şey kullanmaktan rahatsız olmalısınız?

Kısa: Çünkü hızlı (OpenGL, DirectX).

Uzun:

Bunu kendin yapabileceğini düşünebilirsin. Ekrana piksel çizin. Dörtlü veya üçgen gibi şekiller çizmek için küçük bir kütüphane yazabilirsiniz. Bu elbette işe yarayacak. Tam olarak bunu yapmak için bir sürü kütüphane var. Hatta bazıları, Casey Muratori'nin yaptığı şeyi yapacak olan OpenGL-spesifikasyonunu (opengl için bir yazılım tarafı gibi) uygularlar. Her şeyi yazılım tarafında hesaplarlar, pikselleri yazılım tarafında ayarlarlar ve sonucu ekrana yazarlar.

Ancak bu yavaş . Sonunda tüm bunları yürütecek olan CPU bu senaryo için yapılmamıştır. GPU'lar bunun için var. OpenGL’in yaptığı (elbette bir yazılım uygulaması olmadığı sürece), yapmanız gereken her şeyi almak ve tüm verileri, tüm aramaları, neredeyse her şeyi grafik kartına itmek ve GPU’ya işi yapmasını söylemektir . GPU, bu tür işler için özel olarak hazırlanmıştır. Kayan noktalı sayıları çarpma ( 3B sahne çekerken çok şey yaptığınız şey ) ve gölgelendiricileri çalıştırma. Ve buna paralel olarak. GPU'nun ne kadar hızlı olduğu hakkında bir fikir sahibi olmak için 1920x1080 piksel çözünürlükte 3D olarak basit bir sahne düşünün. Bunlar, çarpılmak üzere 2.073.600 pikseldir. İçin her piksel, grafik işlemcisi fragmanı tarayıcılı çalışacaktıren az bir kez , çoğu zaman bir defadan fazla. Şimdi, saniyede 60 kare hızında çalıştığımızı varsayalım. Bu, GPU’nun parça gölgelendiriciyi saniyede 2,073,600 * 60 = 124,416,000 kez çalıştırdığı anlamına gelir . İşlemcinizde böyle bir şey yapabileceğinizi düşünüyor musunuz? (Bu oldukça basitleştirilmiş bir açıklama, daha yakın nesnelerle ne kadar piksel çektiğiniz , ne kadar MSAA kullandığınız vb. Gibi göz önünde bulundurulacak çok daha fazla şey var, ancak saniyede 124.416.000 kez muhtemelen alabileceğiniz en düşük değer ve Basit bir sahne ile kolayca 60fps'den daha fazlasını elde edersiniz)

OpenGL ve Direct3D'nin yaptıkları şey, @Uri Popov'un cevap verdiğini gördüğümüz motorlar için.


8
Bir 2D oyunu yaratıyor, bu da 3D olduğu gibi başka bir konu. Ve yavaş derken , mutlaka 60 fps'den daha azına sahip olduğu anlamına gelmez, ancak grafik kartı aynı işi CPU'nun ihtiyaç duyduğu zamanın bir kısmını, en azından 3D alanına geldiğinde yapar.
tkausl

4
GPU'ların daha iyi olmasının nedeni, gölgelendirici çağrılarını paralel hale getirmek için ayarlanmış olmalarıdır.
cırcır ucube,

4
@ user148013 Bu adamdan gördüğüm kadarıyla, "çok akıllıca" nın tam karşıtı olduğunu söyleyebilirim.
Bartek Banachewicz

4
Sadece yavaşlaması değil (Casey'nin yazılım oluşturucusu şaşırtıcı derecede hızlıydı). Aynı zamanda genel RAM’den video RAM’e zorlamak için de çok fazla veri var. Veriyolunun türüne bağlı olarak dev bir bitmap'i video kartına iterek kare zamanının önemli bir bölümünü alabilir. GPU'yu kullanarak, ara sıra dokuları iter ve bunları kare kare için kullanırsınız.
Adrian McCarthy

2
@ user148013 Gösterişli ve iyi programlama arasında bir fark var. Üst üste gelebilirler, ancak sıklıkla çatışma içindedirler. Gösterişli ve kesinlikle kesinlikle iyi olmayan bir yazılımda [MESA'nın yapabildiği gibi ...] yazılım oluşturabilirim .

11

Yaptığı işe yazılım oluşturma , OpenGL'e yaptığı işlemleri GPU oluşturma denir.

Aralarındaki fark nedir? Hız ve hafıza.

Rasterleştirme (ekrandaki üçgenleri doldurma) biraz zaman alır. Eğer CPU üzerinde yaparsanız, özellikle de iyi bir şekilde optimize edilmemişse, esasen o zamanı oyun mantığından uzaklaştırırsınız.

Ve görüntünün ne kadar küçük olduğu önemli değil, bunun için belirli miktarda bellek ayırması gerekiyor. GPU'ların bunun için bir video belleği var.


OS X'te yazılım oluşturma da mümkün mü? Çünkü grafiklerle ilgili olan her şey OpenGl tarafından şimdi Metal tarafından yapıldı.
user148013,

2
@ user148013 Bazı yanlış anlamalar var. O kadar OpenGL, bir çok platformlu API'si olan edebilir , OS X üzerinde çalışan aslında bir "modern" (post 2000) GPU ile her konuda çalışabilir. Metal, yalnızca Apple cihazları için ayrı bir API'dir. Yazılım oluşturma aynı zamanda her ikisinden de ayrı bir şeydir ve evet, OS X'te de yapılabilir. Temelde sadece CPU ile ekranda piksellerin manuel olarak ayarlanmasıdır.
Bálint

İşte bu yüzden sordum çünkü yazılım oluşturma işleminin OS X'te yapılamayacağını biliyorum. Şimdi hepsi Metal'i daha hızlı kullanıyor. Ancak GPU (OpenGl, Metal) kullanılmadan ekrana tampon çizen tek bir işlev bulamadım.
user148013,

1
@ user148013 Çünkü bir işletim sistemine veya uygulamalara özgü değildir. Diyelim ki onu java'da uygulamak istiyorsunuz, çünkü bu çoklu platform geliştirme için ünlü bir seçimdir. Java ile, önce bir pencere (JFrame) oluşturarak, ardından üzerine düz bir çizim yapmak yerine, bir resim çizer, sonra bu resmi çerçeveye koyarsınız. Bununla birlikte, "üçgen" veya "çizgi" terimlerini bilmeyecektir. Sadece renkler. Bunu bir rasterleştirme algoritmasıyla uygulamanız gerekir. Bu yüzden OpenGL'i tercih ediyoruz, daha hızlı ve kullanımı biraz daha kolay. Temelde bir rasterleştirme API'sı.
Bálint

2
@ user148013 Neden yapamadılar? Bir pencere açabiliyorlarsa ve üzerine bir API olmadan 1 resim çizebiliyorlarsa, yapabilirler.
Bálint

8

Diğerlerinden gelen cevaplar, verebileceğim herhangi bir cevaptan daha doğru olsa da, sorunuzun temelini oluşturduğunu düşündüğüm yazılım geliştirmenin nasıl çalıştığı ile ilgili temel yanlış anlamalara dikkat çekmek istiyorum. Her şeyi bir çerçeve olmadan "kendi başınıza" yapmak her zaman mümkün olsa da ve bunu yapmanın büyük bir eğitim yararı olsa da, gerçek şu ki modern yazılım böyle yaratılmaz.

Birisi donanım ve üzerinde çalışan makine dillerini yarattı. Başka biri daha yüksek seviyeli diller ve derleyiciler, sürücüler ve işletim sistemleri, grafik kütüphaneleri ve daha fazlasını oluşturur. Her birimiz öncekilerimizin çalışmaları üzerine inşa ediyoruz. Bu sadece "tamam" değil, bir gerekliliktir.

Takım zincirinde keyfi bir noktada “kabul edilebilir” olan veya olmayan bir çizgiyi çiziyorsunuz. "Montajda aynı şeyi yaparken neden C ++ kullanmalısınız?" Veya "kablolarından çıkan gerilimleri kolayca okuyabilmeniz ve bunları kendiniz hesaplayabilmeniz için neden klavye sürücülerine güvenebilirsiniz?" Herkesin her şeyi kendi başına yapması için gün içinde saatler veya yaşam boyu yıllar yoktur.

Bu sadece yazılım geliştirme için değil, genel olarak modern yaşam için de geçerlidir. Hiç tost makinesi yapan kişiyi sıfırdan hiç duydunuz mu? http://www.thomasthwaites.com/the-toaster-project/ . Çok uzun zaman aldı ve çok çaba sarf etti. Bir ekmek kızartma makinesi için. Eterden bir video oyunu gerçekleştirmek için gereken her şeyi kendi başınıza yapmayı deneyin !


2
Bence bu iyi bir cevap çünkü çerçevelerin kullanımının, eğitim amaçlı tekerleği yeniden icat etme fikrini küçümsemeden neden iyi olduğunu belirtiyor.
Pharap

3

Motorlar, sadece ekrana bir resim çekmek için çok daha fazlasını yapar. Aydınlatmayı, gölgeleri, girişi, çarpışma algılamayı idare ederler. Sadece görüntü oluşturma kısmı bile ekrana bir tampon bastırmaktan çok daha karmaşıktır. Özellikle 3 boyutlu sahneler için, bir bitmap'ten çok daha karmaşık veriler üzerinde çok fazla hesaplama yapmanız gerekir. Size araba ile bir benzetme vereyim: Basit olarak tanımladığınız şey aracın egzozudur. Sadece doğru ölçülere sahip bir boru üretiyorsunuz ve sonra gazı bir uçtan diğerine itiyorsunuz. Ancak bu arabanın mekanizmasında meydana gelen tek şeyden uzak.


3

Yukarıdaki cevaplar mükemmel, ancak hiçbiri OpenGL ve benzeri neden tercih edildiğine dair en önemli nedenden hiçbirini anlamadı. Ana sebep, özel donanımdan faydalanmaktır. ekran üzerinde milyonlarca piksel oluşturma gibi şeylerle çalışmak için tasarlanmış , GPU .

İşlemciyi kullanan, CPU kullanarak, görüntüleyici bir bitmap üzerindeki tüm pikseller üzerinde birer birer döngü oluşturacak ve her birini ekranda göstermek için siparişler verecek. Yani 1000x1000 boyutunda bir görüntü oluşturuyorsanız, CPU'nuzun geçmesi için bu 1.000.000 döngü. Sonuçta kontrol göz önünde bulundurularak tasarlanmıştır; çok sayıda koşul varsa, bir talimat setinden diğerine atlayarak ve sıkı bir kontrol akışı yönü. Ancak, bir GPU yapacağını bilerek tasarlanmıştır ekrandaki pikseller üzerinde çok fazla benzer döngü .Bir GPU, 1000000 yinelemeli bir for döngüsü kullanacak ve işi her biri için ** paralel olarak ve birbirinden bağımsız olarak çalışacak şekilde devasa sayıdaki çekirdeğine bölecektir. Bu nedenle, CPU'dan farklı olarak, bir GPU bir if-else koşuluyla karşılaştığında, her iki kod dalını da iki çekirdeğe koyacaktır VE SONRA, en sonunda, koşulun neye göre değerlendirildiğine ve attığı şeye bakacaktır. Gereksiz dalın sonucu (bu nedenle GPU gölgelendiricilerindeki birçok başka koşulun üzerine kaşlarını çattığın; her zaman bir atıktan sorumlu oldukları).

Yani evet, GPU'lar paralellik etrafında inşa edilmiştir . Bu, CPU'lara kıyasla pikseller üzerinde çalışmayı çok daha hızlı hale getirir.


0

Bkz. Gerçekten bir grafik API kullanmam gerekiyor mu?

Elbette, bir tampon isteyebilir, içinde bir miktar bit ayarlayabilir ve ekrana yazabilirsiniz. Esasen PC’de grafik programlama yapmanın tek yolu buydu, 90’lı yılların ortalarında 3DFX’teki grafik hızlandırıcıların bulunması. Windows'da bile DirectX, video belleğine doğrudan erişim sağlamak için geliştirilmiştir.

Ancak PC dışı donanım ve özel oyun makinelerinde, işlemciyi işlemden boşaltarak grafikleri hızlandırmak için her zaman teknikler vardır. Atari 2600 bile “donanım sprite” a sahipti, çünkü kısmen bir çerçeve için yeterli RAM yoktu.

Daha sonra (80'lerin ortalarında) oyun konsolları platform oyunları için optimize edildi. Yine, hiçbir çerçeve yok; bunun yerine programcı karoların ızgaralarını belirleyebilir :

Genesis grafik donanımı 2 kaydırılabilir düzlemden oluşuyor. Her uçak karolardan oluşur. Her karo, piksel başına 4 bit içeren 8x8 piksel karedir. Böylece her piksel 16 renge sahip olabilir. Her döşeme 4 renk tablosundan birini kullanabilir, böylece ekranda bir kerede 64 renk elde edebilirsiniz, ancak belirli bir döşemede yalnızca 16 görüntü elde edebilirsiniz. Fayans 32 bayt gerektirir. 64K grafik belleği var. Başka bir şey için bellek kullanılmışsa, bu 2048 eşsiz döşemeye izin verecektir.


-2

Modern CPU'lar yazılımdaki herhangi bir 2d oyunu yapacak kadar hızlıdır, bu nedenle 2d grafikler için OpenGL / DirectX, projenize bir başka bağımlılık ve karmaşıklık katmanı eklemenin yanı sıra, bir demet çizmek için bir 3d projeksiyon matrisi ayarlamak gibi hiçbir avantaj sunmaz sprite ve veriyi GPU'ya yükleme.

OpenGL ayrıca tüm sprite'larınızı 512x512 dokular (PSX gibi eski konsollardan oluşan bir eserdir), grafikleri video belleği sayfalarına yerleştirme, paketlemek için karmaşık bir sprite paketleme kodu yazmanızı gerektirir.

Öte yandan, 3B yapıyorsanız, karmaşık gölgelemeyle milyonlarca üçgen çiziyorsanız, GPU kaçınılmazdır. Uzun zaman önce, GPU'nun sprite çizimini hızlandırdığı DirectDraw adı verilen DirectDd'nin daha basit bir 2d sürümü vardı, ancak şimdi Microsoft artık desteklemiyor, çünkü CPU'lar enerji tasarrufu umursamamanız durumunda herhangi bir hızlanma olmadan 2d yapmak için yeterince hızlı oldukları için .

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.