Aktörler olarak Spritelar


12

Oyun Geliştirme ile ilgili sorularda değil, programcı olarak deneyimliyim. Scala dilinde, duyduğum gibi çok istikrarlı Aktörler ile ölçeklenebilir çok görevli olabilirsiniz. Hatta yüz binlerce insanın aynı anda sorunsuz çalışmasını sağlayabilirsiniz.

Ben de belki bunları 2D-Sprite'lar için bir temel sınıf olarak, tüm spritelardan geçip onları hareket ettirmek için gereken oyun döngüsü şeylerinden kurtulmak için kullanabileceğinizi düşündüm. Temelde kendilerini olay odaklı yönlendiriyorlardı.

Bu bir oyun için anlamlı olur mu? Böyle çoklu görev mi yaptınız? Sonuçta, JVM'de çalışacak, ancak bu, günümüzde çok fazla sorun olmamalı.

DÜZENLE:

Bir süre dinlendikten sonra, bu fikrin tek bir gerçek avantajı olduğunu fark ettim: Çok Çekirdekli Destek. Basit bir oyun döngüsü sadece bir çekirdek üzerinde çalışacak ve her şeyi sırayla çalışacaktır.

Modern bilgisayarlar, evde bile, günümüzde yerleşik iki veya daha fazla çekirdek olduğundan, oyun programcılarının diğer çekirdekleri verimli bir şekilde kullanmasını sağlamak iyi bir fikirdir. Sonuçta, genellikle oyuncunun sadece sekiz çekirdekli makinesinde çalışan bir oyuna sahip olacağını düşünüyorum, neden olmasın.

Gördüğüm diğer avantaj, Scala'da sahip olabilirsiniz RemoteActors, ki bu da aynı şekilde tedavi edilebilir, ancak başka bir bilgisayarda çalıştırılabilir. Belki de bu ağ oyunlarını da basitleştirebilir.

Bunu en kısa sürede Scala 2D motoruma inşa etmeyi planlıyorum.


Bunun nasıl ortaya çıktığını bilmekle çok ilgilenirim. Scala'ya birkaç kez baktım ama daha önce hiç uğraşmadım.
Davy8

Birçoğu, açık çok çekirdekli destek için süreçlerden (ve Scala aktörleri model süreçlerinden) ziyade iş parçacıklarından daha iyi olduğunuzu iddia eder. Bunun nedeni, iş parçacıkları arasında paylaşılan bellekten yararlanabilmenizdir. Tabii ki, bu Aktör modelinin olmadığı şekillerde hataya açıktır.
Kylotan

Scala aktörleri bir iş parçacığı havuzunun üstünde çoklanır, böylece iş parçacıklarından daha hafif olabilirler. Bu, düzgün bir şekilde senkronize olmaları koşuluyla, paylaşılan belleği iletişim kurmak için değiştirebilecekleri anlamına gelir. Uzak aktörler kullanıyorsanız, bunlar farklı işlemlerde olabilir ve iletişim kurmanın tek yolu mesaj göndermektir.
axel22

Yanıtlar:


7

Denemedim, ama ben bir Scala programcısıyım ve bunun en iyi yaklaşım olmadığını söyleyebilirim. Sprite'ların eşzamanlı olarak canlandırılması gerekir. Aktörlerin adil bir şekilde icra edileceğine dair hiçbir garantisi yoktur - bu nedenle bazı spritelar diğerlerinden daha hızlı olabilir, bu da istediğiniz şey değildir. Onları senkronize etmek için bir bariyer kullanmak isteyebilirsiniz, ama sonra neden aktörleri kullanıyorsunuz? Yalnızca mesaj iletmeye güveniyorsanız, bu tür bir senkronizasyonu uygulamak (1000+ oyuncu için bir bariyer uygulamak) aşırı bir iştir.

Başka bir sorun - mesaj geçişini ne için kullanırsınız? İletişim kurmak için spritelarınıza mı ihtiyacınız var? Usta oyuncu tarafından bir mesaj gönderebilir, her bir hareketli grafiğe bir sonraki kareye geçmesini söyleyebilirsiniz, ancak performans açısından, bu büyüklükler ve büyüklükler, yöntemleri doğrudan çağırmaktan ve bir dizi sprite üzerinden yinelemekten daha büyüktür.

Bana öyle geliyor ki burada ihtiyacınız olan şey çok hafif bir çoklu görev ve hiç mesajın geçmediği. Adil olmak için kendi aktör benzeri uygulamanızda yuvarlanmak, bunu sağlamak istiyorsanız muhtemelen en iyi yoldur, ancak bu çok az kazanç için çok fazla iştir. Bakılacak başka bir şey fonksiyonel reaktif programlama ve scala.reactbu kullanım durumu için daha iyi bir eşleşme olduğuna inanıyorum.

Scala'da 2 boyutlu izometrik bir oyun motoru uyguladım. Animasyonlu görünür spriteları güncellemek için sadece 1 global aktör kullandım.

Oyun mantığınızı aktörleri kullanarak uygulamak isteyebilirsiniz - örneğin, oyun haritanızın farklı bölümlerindeki hesaplamaları farklı aktörlere dağıtmak, böylece oyun durumunu paralel olarak güncellemek ve bir performans kazancı elde etmek için. Oyun nesnesi başına tek bir oyuncu değil, bölge başına bir oyuncu kullanmam. Çok ince taneli olursanız performans düşer.

Yine de, ben olsaydım, ne olacağını görmek için denerdim.


1

Ben de belki bunları 2D-Sprite'lar için bir temel sınıf olarak, tüm spritelardan geçip onları hareket ettirmek için gereken oyun döngüsü şeylerinden kurtulmak için kullanabileceğinizi düşündüm. Temelde kendilerini olay odaklı yönlendiriyorlardı.

Onları hareket ettiren olay ne olurdu?

Her karede bir kez yayınladığınız bir olay olur mu?

Ve eğer öyleyse, bu sistemi herhangi bir pratik şekilde nasıl değiştirdi?

Başlangıçta C ++ bağlamında nesne yönelimi okurken, bazı insanların xyz.doThis(x)'doThis mesajını xyz'e (x yükü ile gönder) ve hemen yanıt bekle' gibi bir ifade düşünmeyi sevdiklerini öğrendim . Bu düzeyde bakıldığında, bir olay veya mesaj tabanlı sistem ile normal bir prosedür sistemi arasında gerçek bir fark yoktur.


Aktörler çok iş parçacıklı bir çözümdür. İletişim senkronize değildir. Scala aktörleri (Erlang konsepti) çok çekirdekli kolay programlamaya olanak tanır.
Ellis

Burada bir noktanız var, ancak buradaki fark, Aktör tabanlı sprite'ın eylemi gerçekleştirirken oyun döngüsünü engellememesi, yöntem yaklaşımı bitene kadar beklemesi xyz.doThis(x). Bunun, özellikle çok çekirdekli sistemlerde oyun mantığını daha hızlı hale getirmeye yardımcı olabileceğini düşünüyorum.
Mart'ta Lanbo

Varlık işlemeyi birden fazla çekirdeğe dağıtmayı kolaylaştırır, doğru. Ancak bunun maliyeti, ek mesajlar veya mesajlarda fazladan veri gönderilmeden bir aktörden diğerine kolayca başvuramamanızdır. Böylece buradaki saf yaklaşımın size yardımcı olmadığını hemen anlarsınız - güncellemeleri yapmanın aktör tabanlı bir yolunu formüle edebilir misiniz?
Kylotan

Şu anda, bir çeşit dağıtılmış güncellemeyi deniyorum: Aktörlerim, bir ağaç yapısındaki düğümler gibidir ve mesaj dağıtımıyla çocukların kök güncellemelerini günceller. Ayrıca, gerçek avantaj ağ oluşturma olacaktır: Scala'da bir Aktör ve bir RemoteActor (Başka bir sistemdeki Aktör) aynı mesajlarla aynı şekilde ele alınabilir.
Lanbo

Evet, ama sorun güncellemenin tetiklenmesi değil, mesajın alıcısının üzerinde işlem yapmak için ihtiyaç duyduğu tüm bilgilere sahip olmasını sağlıyor.
Kylotan

0

Bu, oyun nesnelerinizi güncellemeyi düşünmek için harika bir yaklaşım. Scala'yı tanımıyorum, ama deniyorum ve nasıl sonuçlandığını görüyorum ve sonuçlarınızı daha iyi yayınlayın!

Aklıma gelen başlıca sorular şunlardır: Bazı oyun nesnelerinin diğerlerine göre ne sıklıkla güncelleme yaptığını nasıl yönetiyorsunuz? Oluşturma sisteminin saniyenin 1/60. | 30. | 24.

Dikkate alınması gereken başka bir şey, bunun çok hızlı olayların sırasına dayanan oyuncuya karşı AI etkileşimlerinin çözümünü nasıl etkileyeceğidir. Oyunun türüne bağlı olarak, bu muhtemelen çok önemli olmayabilir .


Scala Aktörleri ile ilgili en güzel şey mesaj güdümlü olmaları. Her birinin kendi mesaj / olay kuyruğu vardır. 'Beraberlik' mesaj veya çağrı yöntemi olup olmadığından emin değilim. Sanırım ikincisi olacak, böylece bir Sprite olay sırasının durumu ne olursa olsun her zaman çizilebilir. Ve işlerin belirli bir sırada yapılmasını sağlamak için birbirlerine mesaj gönderebilirler.
Mart'ta Lanbo

Orada dikkatli olun, her bir hareketli grafiğin bir Draw yöntemine veya etkinliğine sahip olmasının, görünürlüğü değiştirmek için bir bayrak dışında yararlı olacağını düşünmüyorum. Bir oyun döngüsünün oluşturma aşamasında, spriteların ekrana oluşturulma sırasının sonuç üzerinde büyük etkisi vardır. Bir diğerinin önüne yerleştirilmiş bir hareketli grafiğiniz varsa (boyut monitöre doğrudur), ikincisinin çizilmesini istersiniz. Scala'nın Aktörlerinin oyun döngüsünün güncelleme / mantık kısmı için yararlı olduğunu görüyorum.
michael.bartnett

Genellikle, orada sadece bir çizim yönteminiz vardır, bu yüzden bu şekilde uygulayarak, spritelarla normal şekilde baş etme konusunda çok fazla fark olmamalıdır.
Mart'ta Lanbo

Ah tamam, ne anlattığını yanlış anladım. Bir şekilde spriteların kendilerini ne zaman ve ne zaman isterse hayal ettiklerini hayal ediyordum. Bunun nasıl ortaya çıktığını bize bildirin!
michael.bartnett

0

Ben de bir programcı değilim, ama teklifinizde herhangi bir sorun görmüyorum. Oyuncuları geliştirmek için böyle bir yol bile düşünmedim.

IA'nın beklenmedik davranışlardan kaçınmak için çok doğru olması gerektiğinden oldukça zor olabilir, ancak bunun yanında oldukça iyi bir teklif olduğunu görüyorum


0

Eğer sprite ile oyun varlık demek istiyorsanız o zaman emin.

Oyun varlıkları asla kendilerini çizmemelidir. Nerede ve nasıl çizilmeleri gerektiğini açıklayan bir grafik tanıtıcıyı güncelleştirmelidirler. Oluşturma sistemi veya sahne grafiği veya gerçek çizim ne yaparsa yapın. Bir grafik kartı vardır, ayrıca grafik kartının her 16ms'de bir senkronize edilmesi gerekir. Böyle bir kurulum dağıtılmış asenkron işleme için iyi çalışmaz.

Oluşturma sistemi bir aktör olmalıdır (ya da zor biriyseniz muhtemelen bir çift olmalıdır). Oyun varlıkları grafik tanıtıcısını güncellediğinde oluşturma sistemine mesaj gönderir. Oluşturma sistemi, toplu işleme, tıkanma, fizik titreşim yumuşatma vb. Gibi her türlü kararı ve / veya optimizasyonu yapabilir.

Scala geliştiricisi değilim, ama Erlang ile biraz yaptım. Scala terminolojimden bazıları yanlışsa, lütfen beni affet.

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.