Lua'yı bir C ++ oyununa dahil etmenin avantajları ve dezavantajları nelerdir?


37

C ++ oyun programlama kitabım var ve içinde Lua bölümü var. Lua bölümünü okumaya başladım ve ilginç görünüyor, ama Lua'yı C ++ oyunumda kullanmanın artılarını ve eksilerini belirleyemiyorum. Şu anda aklıma gelen tek yarar, yeniden derlemek zorunda kalmadan Lua aracılığıyla bazı kodlama güncellemeleri yapabilmenizdir. Bunun dışında hiçbir şey düşünemiyorum. Peki, Lua'yı C ++ oyununa eklemenin avantajları ve dezavantajları nelerdir?

Örnekler takdir edilecektir.




Bu sorulara benzer olduğunu kabul ediyorum, ancak burada önemli olan 'eksileri'.
Jonathan Dickinson

@JonathanDickinson cevaplar o yöne işaret etmiyorlardı ... temelde bağlantıdaki soru ile aynıları ifade ediyorlar.
Bummzack

Yanıtlar:


33

Şu anda aklıma gelen tek yarar, yeniden derlemek zorunda kalmadan Lua aracılığıyla bazı kodlama güncellemeleri yapabilmenizdir.

Bunun faydasını bu kadar kolay indirmeyin. Yeniden derleme adımını atana kadar ne kadar üretken olacağınızı asla anlamayacaksınız.

"Akış" o işe gelince oldukça iyi anlaşılmış psikolojik bir kavramdır. Akış, bir faaliyete odaklandığınızda, problemleri neredeyse hiç düşünmeden analiz ederken ve çözerken vb. Hissettiğiniz hissidir.

Derleme zamanları hepsini mahveder. Bir şeyi test etmek arasında 10 saniyelik bir derlemeniz bile varsa akışta kalmak zor.

Oyun geliştirirken, genellikle sahip olduğunuz "sıkı bir döngü". Bir fikrin var, işe yarayıp yaramadığını görmek için bir test kodladınız ve sonra deniyorsunuz. Çalışmazsa, değiştirir ve tekrar deneyin. Akışı korumak için "test etme kodu" süresi çok önemlidir. Mümkün olduğunca küçük olması çok önemlidir.

Lua'nın (veya herhangi bir yerleşik komut dosyası dilinin) yapmanıza izin verdiği şey, yalnızca "derleme" olmadan değil oyunda yaşamak için değişiklikleri test etmektir . Oyununuzu nasıl oluşturduğunuza bağlı olarak, verileri durdurmak ve yeniden yüklemek zorunda kalmadan oyunu yeni komutlarla yeniden başlatan bir komut çalıştırabilirsiniz. Yeniden derlemek zorunda değilsiniz, yeniden çalıştırmak zorunda değilsiniz.

Bunu yapabilme yeteneği, uygun motor desteği verildiğinde, verimliliği önemli ölçüde artırabilir.


Script yazmanın bir diğer büyük yararı da sadece umursamamaktır. C ++ yazarak uzun zaman geçirdiyseniz, minuta harcadığınız zamana şaşıracaksınız. Hafızanın silindiği yer. Bunun serbest kaldığı yer. Her shared_ptryerde kullanıyor olsanız bile , yalnızca bu değişken türlerinin adlarını yazmaya çalışmak sizi yavaşlatır.

Dinamik olarak yazılmış bir betik dilinde, bakım yapmanıza gerek yoktur. Kapsam basit. İşlevler birinci sınıf nesnelerdir; manuel olarak işlev oluşturucu gerekmez. Bazı şeyleri yapmak çok kolaydır .

Disiplinli bir programcı değilseniz, şimdi bunun olumsuzlukları var. Lua'da glob kullanmak çok kolaydır (bunu önlemenin yolları vardır). Önemsememek, kod yazarken çok özensiz olabileceğiniz anlamına gelir.

Fakat yine de çok özensiz olmanın avantajları olabilir .


Lua'nın bir diğer yanı, iyi bir veri tanımlama dili yapmasıdır. JSON'a benzer şekilde, bir dizi / tablo oluşturan ve döndüren bir JavaScript dosyası gibi, Lua komut dosyalarını tablo döndüren hale getirebilirsiniz.

Bu yapılandırma dosyaları için kullanışlıdır; Lua'nın tablo formatı .ini formatlarından çok daha iyidir. Format hala oldukça temiz, küçük ve genişletilebilir.

Oh, ve hala bir Lua senaryosu, bu yüzden gerçek mantığı gerçekleştirebiliyor. Bunun dezavantajı ... şey, bu bir Lua senaryosu, bu yüzden gerçek mantığı gerçekleştirebiliyor . Bu, oyunda felaket olabilir, çünkü kullanıcı potansiyel olarak işleri berbat etmeye başlayabilir.

Ama aslında, bu kolayca ele alınır. Lua gömmek için tasarlanmıştır, bu izolasyonun aslında oldukça kolay olduğu anlamına gelir. Gerçekten de, taze bir Lua durumu varsayılan olarak hiçbir şey sağlamaz ; standart Lua kütüphanelerinin en temelini bile ortaya çıkarmak için bir şeyler yapmalısınız. Dosya erişimi, oyun durumu erişimi, vb. Tamamen devre dışı bırakılmadı. Ve her Lua eyaleti birbirinden ayrı. AI komut dosyaları için kullandığınız Lua durumunun config dosyaları için kullandığınız Lua durumu olması gerekmez.

Aslında, birçok Lua standart kütüphanesini kaydetmenize izin veren bazı kodlara sahibim, ancak tüm IO dosyalarından geçer ve bunları kaldırır. Sonuçta, bir Lua komut dosyası tabanlı bir yapılandırma dosyasının yapabileceği en kötü şey, oyunun çalıştırıldıktan hemen sonra, hafızası tükenerek çökmesine neden olmasıdır. Bu yapılandırma dosyalarını manuel olarak paylaşmadığınızdan, bu bir bilgisayar korsanı için eğlenceli olmaz.


Herhangi bir betik dilinin en büyük dezavantajının hata ayıklama olduğunu söyleyebilirim. Çoğu kodlama dili hata ayıklayıcıya sahip değildir ve Lua farklı değildir. Lua, bir hata ayıklama aracı oluşturmak için gerekli olan tüm araçlara sahiptir. Ancak aslında yerleşik bir hata ayıklayıcı yok. Bir tane koymak zorundasın. Ve bu makul bir çalışma gerektirir.

Veya "printf debugging" ile yapabilirsiniz. Bu gerçekten ne kadar Lua kodunu yazdığınıza bağlı.


1
akmak her zaman iyi bir şey değildir; işleri otomatik olarak yapmak bazen tasarım alternatiflerinin üzerinden geçerken zaman ayırmamak anlamına gelir.
lurscher

10
@lurscher: Tasarım, koda girmeden önce yaptığınız şeydir . Kodunuzu yazmaya, test etmeye ve hata ayıklamaya başlamadan önce bu tasarım alternatiflerinin hepsini çözmeliydiniz.
Nicol Bolas

23

Çalıştığım yer:

Artıları:

  • yineleme süresi iyileştirmeleri. Oyunumuz değişiklikler için bir ana bilgisayar dosya sistemini yoklamak ve değişikliklerde otomatik olarak "slurp" yapmak üzere ayarlandı. (Yalnızca bir sonraki dosyada etkin olurlar, ancak pratikte bu büyük bir gelişmedir: seviyeyi yeniden yükleyin ve yeni lua değişiklikleriniz derhal gelir.)
  • konsol entegrasyonu . Herhangi bir hata ayıklama işlevi, bir REPL ile geleneksel Quake tarzı konsola bağlanabilir. Dahili yapımlar için, telnet konuşan basit bir sokete bir lua REPL'i bağlayabiliriz ve oyunumuz üzerinde ağ kontrolümüz vardır.
  • azalmış api ve düşük öğrenme eğrisi . Teknik olmayan sanatçılar ve tasarımcılar, genellikle programcı tarafından engellenen bazı görevlere katılabilirler.
  • özel statik kod analizi . luac -lBazı analizler yapmak için çıktıların ayrıştırılması ve bytecode'a bakmak kolaydır ; Ayrıca, özellikle bir kodlama sözleşmeniz varsa, çoğu kaynak kod dosyasını ayrıştırmak oldukça kolaydır. Yerel sözleşmeyi uygulayabiliriz. Ayrıca burada daha fazla güç için metaloğa bakabilirsiniz .
  • hata işleme . Eğer API'mız kilitlenmezse, Lua aptalca bir şey yapsa bile, onu yakalayıp kullanarak kurtarabiliriz lua_pcall.
  • Kolay API uzantısı . Lua <-> C ++ API için yeni bir işlev yazmak çok zor değil. Bunu otomatikleştirmeye yardımcı olacak paketler de var.
  • basit bir kaynak . Değişkenler yapmak, örneğin, lua yorumlayıcısında kayan nokta matematiğinden kaçınmak (bazı gömülü platformlarda önemlidir) veya belirli sistemler için optimize etmek çok zor değil!
  • metatable . Bunlar harika. Çalışma zamanında ilginç şeyler yapmak için çok fazla potansiyel. Oyunumuzun C ++ tarafında aslında hiçbir içeriği olmayan ve karmaşık bir veri yapısını araştıran "sanal tablolara" sahibiz.
  • coroutines . AI davranış komut dosyalarını durdurmak ve devam ettirmek şaşırtıcı olmaktır. Bununla birlikte, Lua Scripter'ın parçası için biraz daha anlayışlı olur - yine de bunu motorumuzla nasıl daha "güvenli" hale getirebileceğimiz üzerinde çalışıyoruz.

Eksileri:

  • öngörülemeyen GC . Neyin olacağının ayarlanması, stepoyun başına ciddi bir şekilde değişmesi gerektiğidir. Bazıları her karede tam GC ile daha iyi çalışır (küçük çalışma seti). Bazıları çok daha küçük pasolar ile daha nadiren daha iyi çalışır. GC'yi daha yeni lua sürümlerinde ve bazı yamalarda (kullanmaktan korkmamanız gereken!) Geliştirmek için çok iş olduğunu unutmayın.
  • daha yüksek yükü . Tablo başına bellek başına ek yükü önlemek için birçok büyük veri yapımızı C tarafında tutuyoruz. C ++, C ve montaj genellikle daha hızlı kod üretir. Bu nedenle, performans açısından kritik olmayan oyun motorunun% 90'ında tutulur ve zaman zaman bazı şeyleri Lua'dan C'ye (ya da tam tersi) geçiririz.
  • parçalanma . Küçük bellek sistemlerinde belki de en büyük sorun. Genellikle küçük nesne havuzları ve lua için tamamen ayrı bir büyük nesne yığını kullanırız. Oyunda stratejik noktalara tam GC geçişleri koyduk. lua_StateBazı durumlarda komut dosyalarını kaldırır veya tamamen kaldırırız. Ve hala bazen sorunlarımız var. Küçük nesne havuzlarının boyutlarını ayarlamak (basitlik ve daha düşük ek yük için sabitler) ve lu-spesifik büyük nesne yığınının boyutu acı verici olabilir. Ancak yaklaşık 4 MB'den büyük sistemlerde, henüz özel yığınlar ve havuzlarla uğraşmadık.
  • tür güvenliği eksikliği . İyi bir statik kod analizi araç setine sahip değilseniz, birçok çalışma zamanı hata kontrolüne (belki de __indexve kullanarak __newindex) geri döneceksiniz . Derleme zamanında hataları yakalamak daha iyidir. Bunu hafifletmek için yapabileceğiniz çeşitli şeyler var.

Lua şiddetle tavsiye, sadece biraz onunla çalışmaya istekli olun! Ayrıca kontrol etmek isteyebilirsiniz Sincap Ben bir küçük userbase vardır inanıyorum rağmen,.


Keşke bunu birden çok kez oylayabilseydim. Çok kapsamlı, çok anlayışlı, açıkça yapılandırılmış. +1
Koarl

5

Aslında 3 büyük avantaj var:

Bu faktörler, bir oyun geliştiricisi olarak gelişimi hızlandıracak ve oyununuzun kalitesini artıracak özellikleri etkinleştirmenize olanak sağlar.

Örneğin:

  • Oyun mantığınızı, oyununuzu bir dosyadan veya bir ağ soketinden güncelleyerek kolayca değiştirebilirsiniz.
  • Kullanıcıların kendi komut dosyalarını oluşturmalarına izin verebilirsiniz (botlar veya modlar için)
  • Oyun tasarımcılarınız ve sanatçılar, derleme araç setinizi kullanmak zorunda kalmadan oyunun bölümlerini güncelleyebilecek ve test edebilecektir.
  • Birkaç komut dosyasını her değiştirdiğinizde yeniden derlemeniz gerekmez.
  • Platformları / motorları / dilleri değiştirirseniz tüm oyunu yeniden yazmak zorunda kalmazsınız.

1
"Platformları / motorları / dilleri değiştirirseniz, tüm oyunu yeniden yazmak zorunda kalmazsınız." Lua'dan başka bir dile geçmedikçe. Ve eğer "oyunun tamamını" Lua'da yazıyorsan, motorları değiştirirsen, o zaman bu değişikliğin Lua'ya maruz kalması gerekir (veya detayları gizlemek için Lua ile motor arasında bir soyutlamaya ihtiyacın var). Bu yüzden Lua'nın bu durumlarda nasıl yardımcı olduğunu anlamadım.
Nicol Bolas

3

Tecrübelerime göre biraz kaynamış.

Artıları

  • İlk entegrasyon gerçekten kolaydır. Ciltlemelerin oluşturulmasına yardımcı olan araçlar vardır, ancak ciltleme mekanizması o kadar basittir ki, kendi sürümünüzü kendi özel özelliklerinizle kısa sürede yazabilirsiniz.
  • Oyun mantığında çok daha hızlı yineleme elde edersiniz (çalışma zamanı yeniden yüklemesini uyguladığınızı varsayarsak)
  • Denemek için özgürleştirici bir ortam elde edersiniz: daha fazla şey denersiniz, çünkü bunu yapmak için ek yük önemli ölçüde düşer
  • Bilinen sözdizimi: tüm farklılıkları için, saatler içinde rahat etmemek için C programcısı olarak zorlanırsınız
  • Oyun mantığının "motor" ile daha iyi ayrılması: motorunuz, Lua istemcisine iyi bir API göstermesi gereken bir servis sağlayıcı haline gelir. Dil engeli, sadece oraya ulaşmak ve bir üye değişkenini kandırmak yerine sizi daha fazla düşündürür.

Eksileri

  • Lua hafıza yönetimi oyunlar için ideal değil. Bununla başa çıkıyorsun, hoşuna gitmiyor
  • Lua hata ayıklama kutunun dışında korkunç. Deneyimi geliştirmek için çalışmanız gerekecek
  • Verileri Lua'da tutmak, Lua'da hata ayıklamanız gerekeceği anlamına gelir: C'den incelemesi başlangıçta zor olur
  • Lua, tüm değişkenlerin varsayılan olarak global olması gibi, ayak sözdiziminde kendinizi iyi miktarda çeker.
  • Lua, diğerleri gibi bir programlama dilidir. Derleyiciyi kaldırdığınız için programlayıcı olmayanlardan programlayıcılara sihirli bir şekilde dönüşmelerini beklemeyin
  • Lua'yı entegre etmek ve desteklemek konusunda iyi olmak çok büyük bir iştir. Kutudan çıkarılmasını beklemeyin. Bu maliyeti birkaç oyunda düşürmek zorunda kalacağınızı varsaymak adil olur.

Son, kişisel, karar: Eğer iyi bir boyutta oyun inşa ediyorsanız ve zaten bir betik dili yoksa, o zaman Lua olsun. Buna değecek.


1

Garry's Mod, Lua ve C ++ kullanan oyunlara bir örnektir. Tüm modlar için Lua'yı kullanıyorlar, bu da insanların yapmasını çok kolaylaştırıyor. C ++ tüm iç kısımlar için kullanılır. Aklıma gelen tek şey Lua'nın C ++ kadar hızlı olmadığı gerçeği olurdu.

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.