Basit oyunlar için oyun döngüsü için ayrı bir konu zorunlu mu?


10

Oyun geliştirmede yeniyim. Öğrenmek için bu oyunu android platformunda yeniden oluşturuyorum. Yukarıdaki linkten oyun oynama videosunu izleyebilirsiniz. Basit bir oyundur.

Oyun geliştirmeye başlamakla ilgili birçok makale okudum.Neredeyse hepsi ayrı iş parçacığında bir oyun döngüsü kullanmanızı tavsiye etti, bu da diğer oyunlar için mantıklı. Ancak, bu oyun için ayrı bir konu başlatmam gerekir mi?



Bunun Android hakkında olduğu için bunun bir kopya olduğundan emin değilim. Java tabanlı bir platformda iş parçacığı oluşturma konusunda bu sorudan farklı olan başka noktalar da vardır.
Sean Middleditch

Yanıtlar:


8

Oyun döngüsü genellikle basit olduğu için önerilir . Hemen hemen her oyun bir döngü kullanılarak düzgün bir şekilde geliştirilebilir ve çalıştırılabilir ve çoğu oyunun düzgün çalışması için bir tane gerekir.

Örneğin, çoğu fizik motoru uygun bir simülasyon için güvenilir sürekli güncellemeler gerektirir. Animasyonlar ve diğer dinamik içerik ve grafiklerin her değişiklik, vb güncellenmesi gerekir ... Aka bir döngü kullanarak pratik olarak ücretsiz olsun bir şey.

Şimdi, döngünüzün ayrı bir iş parçacığında çalışması gerekmediğini unutmayın. Aslında, oyunların çoğu basitlik için ana iş parçacığında döngüyü çalıştıracaktır. Android projelerim bile bu prensibe uyar.

Şimdi burada asıl soru ne alternatiftir sen teklif? Nasıl güvenilir bir şekilde girdi elde edeceğinize dair başka bir fikriniz varsa, güncellemeler yapın ve sizin için çalışan çerçeveleri çizin, sonra devam edin! Aksi takdirde oyun döngüsü başlamanın en kolay yolu olabilir.


Sanırım alternatif, tüm eylemler seri olduğu için ana ipliğin kendisini kullanarak ekranı güncellemektir - oyuncu aynı renk topları arasında kaydırır, daha sonra tüm dokunulmuş toplar kaybolur, kalan toplar yedek toplarla birlikte yerçekimi altına düşer.
jin

Yani bir döngü gerekip gerekmediğini sormuyorsunuz? Ana endişeniz ayrı bir iş parçacığında olması gerekiyorsa, değil mi?
AturSams

1
doğru. sorum döngü değil iplik hakkında. Bu kadar basit bir oyun için (böyle bir oyun yapabilmek için şanslı olsam da) yeni bir iş parçacığı oluşturmam gerekiyor mu yoksa her şey ana iş parçacığında yapılabilir mi?
jin

1
Hayır, gerekli değil. Zamandır var gibi bir döngü , ardından oluşturmak için gerek yoktur ikinci bir döngü .

@jin gerçekten başlığı değiştirmek ve o zaman sorunuzu nasıl yazmalısınız.
Vallentin

5

Hayır , ayrı bir dişe gerek yoktur. Çok yoğun bir şey yapmıyorsanız (bize gösterdiğiniz oyunda böyle görünmüyor), her şey ana iş parçacığında yapılabilir.

Çok fazla işlem yapıyorsanız veya kullanıcı arayüzü / girişinin yanıt vermemesiyle ilgili sorunlar yaşıyorsanız ikinci bir iş parçacığı gereklidir. Örneğin, daha karmaşık oyunlarda, AI bir sonraki hamlesini hesaplarken UI / girişinin yanıt vermemesini istemezsiniz. Oyununuz öncelikle kullanıcı girişlerine yanıt veriyor ve görselleri güncelliyor gibi göründüğü için ikinci bir konuya gerek yoktur.


"Bir döngü gerekli mi" orijinal sorusunu cevaplamak.

Hayır , ancak alternatifler daha karmaşıktır, uygulanması daha zordur ve nadiren kullanılır.

Oyunlar tanım gereği etkileşimlidir. En azından, bu girişte beklemek ve çıktıyı güncellemek. Bunu yapmanın en basit yolu bir döngü ile. Bunun için yeni bir iş parçacığı oluşturmaya gerek yoktur.

Bahsettiğiniz oyun basit görünse de, etkileşimli görsellere ve seslere sahiptir ve kullanıcı girdisine dayalı olanları sürekli olarak günceller.

Bir oyun döngüsüne de çok fazla alternatif yok. Bir çeşit kesinti tabanlı sistem mümkün olabilir. Bununla birlikte, bu tür sistemler karmaşıklığı arttırır ve determinizm gibi diğer faktörleri azaltır. Oyun döngülerinin bu kadar yaygın olmasının, uygulanması kolay, anlaşılması kolay, esnek ve harika bir iş çıkarmasının bir nedeni var.


Daha düşük düzeyde kesintilerle karşılaştığım tek zaman, belirli bir HW görevinin yapıldığı ve CPU / OS'nin düzgün bir şekilde işleyebilmeleri için bilgilendirilmesi gerektiğiydi (verileri diskten belleğe okuma ve sonra geri dönebilmemiz için hazır olduğu bildirildi uygulamayı kontrol etmek ve işlemesine izin vermek) böylece ne demek istediğini bilmiyorum ve sadece yanlış yorumladım.
AturSams

2

Gerçek soruya cevap (Bir oyun döngüsünün ayrı bir iş parçacığında olması gerekiyor mu):

İnsanların genellikle ayrı bir iş parçacığı kullanmayı önermelerinin nedeni, yoğun işlemenin kullanıcı arabirimi etkileşimine müdahale etmesini istememesidir. Ayrı bir iş parçacığı için gerekli olup olmadığını söyleyebilir teksin senin oyun. Mevcut tasarımınızdaki ana oyun döngüsünün kullanıcı arayüzünün tepki süresine müdahale edip etmediği tamamen motora ve çerçeveye bağlıdır. Aksi düşünmek için bir nedeniniz olmadığı sürece (küçük projelerde) genellikle olmayacağını varsaydınız.

Kodu ayrı iş parçacıklarında tutmanın bir başka nedeni, kodu modüler ve basit tutmaktır. İlişkili olmayan iki kod parçasının birbirine karıştırılması, kodun uzun vadede daha az okunabilir ve korunabilir olmasına neden olabilir.

Bir oyun döngüsünün kendi ayrı iş parçacığında çalışması gerekiyor mu? Muhtemelen. Yanıt süresi veya koduyla ilgili bir sorun varsa ve ağır işlemden bağımsız olarak yanıtlamak için birden fazla kullanıcı arabirimine ihtiyacınız varsa veya kodu tasarım nedenleriyle aynı anda gerçekleşen belirli görevlere bölmek istiyorsanız, bununla devam edin. Ancak, gelişmiş bir programlama uygulaması olarak kabul edilir .

Basit ama belki de göstermesi gereken harika bir örnek, iki kişilik bir oyundur. Bir sınıfın kullanıcı girdisini işleyen ve oyuncu karakteri örneğindeki durum değişikliklerine dönüştüren iki örneği çalıştırmak isteyebilirsiniz.

Bazı çerçeveler, ActionScript3.0 gibi sistemin kullanılmasını teşvik eder / gerektirir. Bu durumda döngü kodu normalde OnEnterFramesaniyede 20-60 veya 120 kez gerçekleşen etkinliğe veya buna benzer bir şeye gider .


Orijinal soruya cevap (Ana döngüye ihtiyacım var mı):

Her şey program sayacına kadar kaynar . Önceden belirlenmiş bir süreden daha fazla çalışacak ve gittikçe kod üretmeyecek bir oyun yapıyorsanız, kullanıcının bilgisayarının zaten işlediği bazı talimatları tekrarlamasını ve muhtemelen neyin değişeceğini bu arada durumdur (oyunun nesnelerinde ve globallerinde saklanan değerler).

Talimatları tekrarlamanız gerektiğini bildiğiniz için, bu görevi tamamlamanın ve aynı talimatları sürekli olarak işlemenin birkaç yolu vardır. Tüm bu yöntemler, program sayacını geçerli talimatlara geri getirmeyi içerir. Kodun tekrarlanmasına neden olan en yaygın kontrol akışı ifadelerine döngüler denir, diğeri gotomodern kodda nadiren kullanılan ve bu durumda benzer bir etkiye sahip olan ifadedir (tamamen sizinle ilgili değildir).

Önceki sorunuzu cevaplamak için bir döngüye mi ihtiyacınız var? Evet yaparsın.


1
Bildiğim kadarıyla AS3 gibi olay tabanlı çerçevelerin altında hala bir oyun döngüsü var. Bir olay sistemini uygulayan bir çerçeveden değil, daha düşük düzeydeki kesintilerden bahsediyorum.
MichaelHouse

Hmm .. İnsanların oyunlarda daha düşük seviyede kesintiler kullanmadığını düşünmüyorum. AFAIK esas olarak CPU tarafından IO işlemlerini izlemek için kullanılır. Daha yüksek düzeyde bir soyutlama, her karede birkaç talimat çalıştırmak ve daha sonra HW sonucunu oluşturmasını söylemek yerine kullanıcı girişine veya donanım etkinliğine (yoklama olmadan) yanıt verdiğiniz bir tasarım uygulaması olarak düşünüyordum.
AturSams

1
Evet, insanlar artık bunları sık sık kullanmıyor. Dediğim gibi, kullanımı daha zordur ve şimdi bir şeyler yapmanın çok daha iyi yolları var. Ne dediğini anlıyorum ve kesinlikle bir şeyleri düşünmenin farklı bir yolu, ama sadece farklı bir yüzeyde göründüğü yüzey altında, aynı döngü türünün altında.
MichaelHouse

@ Byte56 ile hemfikirim, IO kesmelerini kullanan bir çekirdek düzeyi olaylarından bahsetmedikçe, bir döngüye kadar kaybolur.
concept3d

1
Biliyorum ama yaptığımız her şey yüzeyin altında aynı (dediğim gibi, program sayacının değerini değiştirmek). Bu bir sır değil ve cevapta belirtmiştim. Olay tabanlı programlama farklı görünüyor çünkü farklı olaylar meydana geldiğinde program sayacını farklı fonksiyonlara taşıyoruz. Açıkçası, bu olayların yakın zamanda gerçekleşip gerçekleşmediğini kontrol etmek için bir döngü yoklaması vardır, ancak bir tasarım prensibi olarak görünüşte farklıdır.
AturSams

0

Burada başkalarının cevaplarına, kimsenin açıkça bahsetmediği bir şey eklemek için: Oyun döngünüzü ikinci bir iş parçacığında çalıştırma riskini alırsanız ve yanıt vermiyorsa, işletim sisteminizi uygulamanızı sonlandırma riskiyle karşı karşıya kalırsınız. Bu nedenle ayrı bir iplik kullanılması önerilir. Bu nedenle (örneğin) NDK'lar native_app_glue.c/ .hdöngünüz için ayrı bir iş parçacığı oluşturur.

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.