MMO sunucusu için oyun mantığını tanımlamak için Lua komut dosyalarını kullanmak C ++ 'da derlenenden çok daha yavaş olur mu?


10

MMO sunucum için bir varlık sistemi kullanıyorum ve Lua betikleri kullanarak "eylemlerin" davranışını tanımlamayı düşünüyordum. Sunucu C ++ ile yazılmıştır. C ++ Lua hız / bellek kullanımı ile çok aşina değilim ama istemcinin GUI komut dosyası için kullandım. Sunucu tarafında oyun mantığını tanımlamak için Lua kullanmak performansı çok düşürür mü?


Yanıtlar:


20

TL; DR: Lua'nın ek yükü vardır, ancak düzgün kullanılırsa ihmal edilebilir ve kolayca hafifletilebilir. Ağır matematik işlemleri veya dönüşüm geometrisi için kullanmayın. Muhtemelen bir GUI komut dosyası yazmak için herhangi bir performans problemi görmeyeceksiniz.

Lua'nın bir oyun senaryosu dili olarak performansı ile ilgili bazı temel kriterler yaptım ve oldukça hızlı. LuaJIT'i oyun motoruma bağlamak için tolua ++ kullanarak, her oyuncu her oyun döngüsü (zaman-delta argümanı ile) denilen bir Lua betiği tarafından kontrol edilen 2.000 aktör ortaya çıkardı. Aktörlerin yarısının akın senaryosu vardı ve diğer yarısı bir çeşit rastgele yürüyüş yapıyorlardı (ve sürülerden kaçınılmıştı).

Görüntü oluşturma bileşenini kapatmak Opteron 170 (2x2.0GHz'de saniyede 400'den fazla keneler verdi), ancak motorum o sırada tek iş parçacıklıydı. Ben kazdık ve optimize eğer belki biraz ağır sıkılmış olabilir hayal olabilir, belki de bazı ağır iş C ++ içine geri taşımak. Saniyede 400 kez 2000 oyuncunun güncellenmesi hala oldukça etkileyiciydi ve o zamanki beklentilerimin çok üzerinde.

Artık tüm projelerimde Lua kullanıyorum ve aslında gerçek oyun kodunun (AI, GUI düzeni / mantığı, Olaylar / Mesajlar) oldukça büyük bir bölümünü oluşturuyor. Çıkmak, yeniden derlemek ve yeniden başlatmak zorunda kalmadan bir şeyi hızlı bir şekilde değiştirip test edebildiğinizde oyun yapmak ÇOK daha eğlencelidir. Zaman zaman bazı performans sorunları ile karşılaştım, ama bu kolayca C + + (ve sonra Lua çağıran) rahatsız edici kodu yeniden uygulayarak çözüldü.

Biraz konu dışı olsa da, EVE Online'ın sunucuları neredeyse tamamen Stackless Python'da yazılmaktadır (matematik işlemlerinin çoğunu Lua'dan oldukça ağır olan ve kendi kişisel araştırmalarıma ve mevcut birkaç araştırmaya dayalı olarak C ++ lib'e ertelediklerine inanıyorum) karşılaştırmalar, LuaJIT'den çok daha az performans. 30k + eşzamanlı oyuncuyu çok fazla sorun olmadan ele almayı başarıyorlar. Verilmiş, tüm bunlar çalışan bir ton pahalı donanım var, ama maliyet çoğunluğu kendi veritabanı kümesinde olduğuna inanıyorum ...

Metin duvarı için özür dilerim.


1
Mükemmel cevap! Bu kadar ayrıntılı bir cevap için özür dilemeye gerek yok. Lua'da tanımlanan bileşen "eylemlerini" geliştirmek ve biraz kıyaslama yapmak için zaman ayıracağımı düşünüyorum. Teşekkürler!
BarakatX2

2
Bu tür sistemlerde en büyük hit genellikle komut dosyalarını ayrıştırmaktır, bu yüzden başlangıçta bunu ön yüklediğinizden emin olun.
coderanger

Bu iyi bir nokta. Aslında Lua'mı serbest bırakmak için paketlemeden önce bayt koduna derliyorum, bu da herhangi bir ölçüm yapmadım, ancak yükleme süresini daha da azaltabilir.
Codewaffle

Katılıyorum. Normal bir oyun oyun mantığında yürütme süresinin küçük bir kısmı (render bir canavar), bir MMO sunucusunda bu çok daha büyük bir parçadır, bu nedenle etki çok daha önemli olacaktır. LUAJit ve C ++ ile deneyimim var ve LUAJit LUA önemli ölçüde daha hızlı olsa da hala C ++ (C ++ kodu düzgün varsayalım) hala çok daha yavaş. Ben LUAJit ile iş akışının harika olduğunu itiraf ediyorum ama hızlı bir şekilde bir hit alır. Nasıl döndürürseniz döndürün, string aramalı tablolardaki değişkenler, dinamik türler ve çöp toplama bir ücrete tabidir. Nuff, LUAJit'in .NET'ten daha yavaş olduğunu söyledi
Kaj

2

Kısa cevap: Evet, evet olur.

Uzun cevap: Ne kadar oyun mantığı, ne kadar çalıştırıldığı ve ne kadar karmaşık olduğuna ve her oyuncu için çalıştırmanız gerekip gerekmediğine bağlıdır. Çok basitse ve çok fazla tekrarlanmıyorsa, iyi olabilirsiniz. Ancak C ++ yerine LUA kullanan çoğu durumda, kodun iyi tasarlanmış ve optimize edilmiş olduğunu varsayarak size çok daha düşük performans verir ve kötü ölçeklenir.

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.