การใช้สคริปต์ Lua เพื่อกำหนดตรรกะของเกมสำหรับเซิร์ฟเวอร์ MMO จะช้ากว่าการรวบรวมใน C ++ หรือไม่


10

ฉันกำลังใช้ระบบเอนทิตีสำหรับเซิร์ฟเวอร์ MMO ของฉันและฉันกำลังคิดเกี่ยวกับการกำหนดพฤติกรรมของ "การกระทำ" โดยใช้สคริปต์ Lua เซิร์ฟเวอร์ถูกเขียนใน C ++ ฉันไม่ค่อยคุ้นเคยกับการใช้ความเร็ว / หน่วยความจำของ Lua ใน C ++ แต่ฉันใช้มันเพื่อเขียนสคริปต์ GUI ของลูกค้า การใช้ Lua เพื่อกำหนดตรรกะของเกมทางฝั่งเซิร์ฟเวอร์จะลดประสิทธิภาพลงอย่างมากหรือไม่?


คำถามที่เกี่ยวข้อง: gamedev.stackexchange.com/questions/2913/…
Tetrad

คำตอบ:


20

TL; DR: Lua มีค่าใช้จ่าย แต่ถ้าใช้อย่างถูกต้องจะเล็กน้อยและบรรเทาได้ง่าย อย่าใช้มันสำหรับการดำเนินการทางคณิตศาสตร์อย่างหนักหรือเปลี่ยนรูปทรงเรขาคณิต คุณอาจจะไม่เห็นปัญหาประสิทธิภาพใด ๆ เลยเมื่อใช้สคริปต์ GUI

ฉันได้ทำเกณฑ์พื้นฐานบางอย่างเกี่ยวกับการทำงานของ Lua ในฐานะภาษาสคริปต์ของเกมและมันค่อนข้างเร็วมาก การใช้ tolua ++ เพื่อผูก LuaJIT กับเครื่องมือเกมของฉันฉันวางไข่นักแสดง 2,000 คนโดยนักแสดงแต่ละคนควบคุมโดยสคริปต์ Lua ที่เรียกว่าวนรอบเกมทุกครั้ง นักแสดงครึ่งหนึ่งมีสคริปต์ flocking และอีกครึ่งหนึ่งกำลังทำการเดินสุ่ม (และหลีกเลี่ยงฝูง)

การปิดองค์ประกอบการแสดงผลทำให้ฉันมีมากกว่า 400 ขีดต่อวินาทีใน Opteron 170 ของฉัน (2x2.0GHz แม้ว่าเครื่องยนต์ของฉันจะเป็นเธรดเดี่ยวในเวลานั้น) ฉันคิดว่าฉันสามารถบีบออกได้มากกว่านั้นถ้าฉันขุดและปรับให้เหมาะสมอาจจะย้ายงานหนักบางส่วนกลับไปที่ C ++ การอัปเดตนักแสดง 2000 คน 400 ครั้งต่อวินาทีก็ยังค่อนข้างน่าประทับใจและเกินความคาดหมายของฉันในเวลานั้น

ตอนนี้ฉันใช้ Lua ในทุกโครงการของฉันและจริง ๆ แล้วถือว่าเป็นส่วนใหญ่ของรหัสเกมจริง (AI, รูปแบบ GUI / ตรรกะ, เหตุการณ์ / ข้อความ) การสร้างเกมเป็นเรื่องสนุกมากขึ้นเมื่อคุณสามารถเปลี่ยนบางสิ่งได้อย่างรวดเร็วและทดสอบโดยไม่ต้องออกจากคอมไพล์ใหม่และเริ่มต้นใหม่ ฉันพบปัญหาเกี่ยวกับประสิทธิภาพเป็นครั้งคราว แต่สิ่งเหล่านี้สามารถแก้ไขได้อย่างง่ายดายโดยการปรับใช้รหัสผิดใน C ++ อีกครั้ง (แล้วเรียกมันจาก Lua)

ในขณะที่อยู่นอกหัวข้อเล็กน้อยเซิร์ฟเวอร์ของ EVE Online เขียนเกือบทั้งหมดใน Stackless Python (ฉันเชื่อว่าพวกเขาเลื่อนการดำเนินการทางคณิตศาสตร์ส่วนใหญ่ไปยัง C ++ lib) ซึ่งหนักกว่า Lua มากและขึ้นอยู่กับการวิจัยส่วนตัวของฉัน เกณฑ์มาตรฐานประสิทธิภาพต่ำกว่า LuaJIT พวกเขาจัดการกับผู้เล่นพร้อมกัน 30k + โดยไม่มีปัญหามากเกินไป จริงอยู่ที่พวกเขามีฮาร์ดแวร์ราคาแพงจำนวนมากที่ใช้งานได้ทั้งหมด แต่ฉันเชื่อว่าต้นทุนส่วนใหญ่อยู่ในกลุ่มฐานข้อมูล ...

ขอโทษสำหรับกำแพงของข้อความ


1
คำตอบที่ดี! ไม่จำเป็นต้องขอโทษสำหรับคำตอบที่ละเอียดมากนัก ฉันคิดว่าฉันจะใช้เวลาในการพัฒนาองค์ประกอบ "การกระทำ" ที่กำหนดไว้ใน Lua และทำการเปรียบเทียบ ขอบคุณ!
BarakatX2

2
ความนิยมสูงสุดในระบบประเภทนี้มักจะทำการแยกวิเคราะห์สคริปต์
coderanger

นี่เป็นจุดที่ดี ฉันรวบรวม Lua ของฉันเป็น bytecode ก่อนที่จะทำการบรรจุซึ่งอาจลดเวลาในการโหลดได้มากขึ้นถึงแม้ว่าฉันจะไม่ได้ทำการวัดใด ๆ ก็ตาม
Codewaffle

ฉันมักจะไม่เห็นด้วย ในขณะที่เกมตรรกะเกมปกติเป็นส่วนเล็ก ๆ ของเวลาดำเนินการ (การแสดงผลเป็นสัตว์ร้าย) ในเซิร์ฟเวอร์ MMO มันเป็นส่วนที่ใหญ่กว่ามากดังนั้นผลกระทบจะมีมากขึ้น ฉันมีประสบการณ์กับ LUAJit และ C ++ และในขณะที่ LUAJit นั้นเร็วกว่า LUA อย่างมาก แต่ก็ยังช้ากว่า C ++ อยู่มาก (สมมติว่าคุณใช้รหัส C ++ อย่างถูกต้อง) ฉันยอมรับว่าเวิร์กโฟลว์กับ LUAJit นั้นยอดเยี่ยม แต่ความเร็วจะใช้เวลาในการตี ไม่ว่าคุณจะบิดมันอย่างไรตัวแปรในตารางที่มีการค้นหาสตริงประเภทไดนามิกและการรวบรวมขยะมีราคา LUAJit ช้ากว่า. NET, nuff กล่าว
Kaj

2

คำตอบสั้น ๆ : ใช่ใช่มันจะ

คำตอบยาว: มันขึ้นอยู่กับตรรกะของเกมเท่าไหร่มันวิ่งไปมากแค่ไหนและมันซับซ้อนแค่ไหนและถ้าคุณจำเป็นต้องรันมันสำหรับผู้เล่นทุกคน ถ้ามันง่ายมากและไม่ซ้ำหลายครั้งคุณอาจจะสบายดี แต่สำหรับกรณีส่วนใหญ่ที่ใช้ LUA แทน C ++ จะทำให้ประสิทธิภาพการทำงานของคุณลดลงและจะปรับขนาดได้ไม่ดีสมมติว่ารหัสนั้นได้รับการออกแบบและปรับให้เหมาะสม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.