ข้อดีและข้อเสียของการรวม Lua เข้ากับเกม C ++ คืออะไร


37

ฉันมีหนังสือการเขียนโปรแกรมเกม C ++ และมีส่วน Lua อยู่ในนั้น ฉันเริ่มอ่านหัวข้อ Lua แล้วและมันฟังดูน่าสนใจ แต่ฉันไม่สามารถระบุข้อดีข้อเสียของการใช้ Lua ในเกม C ++ ของฉัน ประโยชน์เดียวที่ฉันคิดได้ในตอนนี้คือคุณสามารถอัปเดตการเข้ารหัสผ่าน Lua ได้โดยไม่ต้องคอมไพล์ใหม่ นอกจากนั้นฉันไม่สามารถคิดอะไรได้เลย ดังนั้นข้อดีและข้อเสียของการเพิ่ม Lua ในเกม C ++ คืออะไร

ตัวอย่างจะได้รับการชื่นชม




ยอมรับว่ามันคล้ายกับคำถามเหล่านั้น แต่สิ่งที่สำคัญคือ 'ข้อเสีย'
Jonathan Dickinson

@JanathanDickinson คำตอบไม่ได้ชี้ไปในทิศทางนั้นแม้ว่า ... โดยพื้นฐานแล้วพวกเขาพูดเหมือนกันในคำถามที่เชื่อมโยง
bummzack

คำตอบ:


33

ประโยชน์เดียวที่ฉันคิดได้ในตอนนี้คือคุณสามารถอัปเดตการเข้ารหัสผ่าน Lua ได้โดยไม่ต้องคอมไพล์ใหม่

อย่าลดอรรถประโยชน์ของสิ่งนี้อย่างง่ายดาย คุณจะไม่เข้าใจว่าคุณจะทำงานได้อย่างไรจนกว่าคุณจะทำขั้นตอนการคอมไพล์ซ้ำ

"ไหล"เป็นแนวคิดทางด้านจิตใจค่อนข้างดีเข้าใจเมื่อมันมาถึงการทำงาน กระแสคือความรู้สึกที่คุณได้รับเมื่อคุณมุ่งเน้นไปที่กิจกรรมเมื่อคุณวิเคราะห์และแก้ปัญหาโดยไม่คิดถึง ฯลฯ คุณมีประสิทธิภาพมากที่สุดเมื่อคุณ "ไหล"

เวลาคอมไพล์สกรูทั้งหมดที่ขึ้น เป็นการยากที่จะอยู่ต่อไปหากคุณมีเวลารวบรวม 10 วินาทีระหว่างการทดสอบบางอย่าง

เมื่อคุณพัฒนาเกมเพลย์สิ่งที่คุณมักจะมีคือ "วงวนแคบ" คุณมีความคิดคุณเขียนรหัสการทดสอบเพื่อดูว่ามันใช้งานได้หรือไม่และลองใช้งานดู หากไม่ได้ผลคุณสามารถแก้ไขได้และลองอีกครั้ง เวลา "code-to-test" นั้นสำคัญมากสำหรับการดูแลโฟลว์ การทำให้มันเล็กที่สุดเป็นสิ่งสำคัญ

อะไร Lua (หรือภาษาสคริปต์ที่ฝังตัว) ช่วยให้คุณทำคือการทดสอบการเปลี่ยนแปลงไม่เพียงโดยไม่ต้อง "รวบรวม" แต่อาศัยอยู่ในเกม ขึ้นอยู่กับว่าคุณสร้างเกมอย่างไรคุณสามารถเรียกใช้คำสั่งที่จะรีสตาร์ทเกมด้วยสคริปต์ใหม่โดยไม่ต้องหยุดและโหลดซ้ำข้อมูลและอื่น ๆ ไม่เพียง แต่คุณไม่จำเป็นต้องคอมไพล์ซ้ำ แต่คุณไม่จำเป็นต้องรันซ้ำ

ความสามารถในการทำเช่นนี้ได้รับการสนับสนุนเครื่องยนต์ที่เหมาะสมสามารถเพิ่มผลผลิตอย่างมาก


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

ในภาษาสคริปต์แบบไดนามิกคุณไม่ต้องสนใจ การกำหนดขอบเขตทำได้ง่าย ฟังก์ชั่นเป็นวัตถุชั้นหนึ่ง คุณไม่จำเป็นต้องสร้างฟังก์ชั่นด้วยตนเอง มันง่ายมากที่จะทำบางสิ่ง

ทีนี้มันก็มีเชิงลบถ้าคุณไม่ใช่โปรแกรมเมอร์ที่มีระเบียบวินัย มันใช้งานง่ายมากใน Lua (แม้ว่าจะมีวิธีป้องกันก็ตาม) การดูแลไม่ได้หมายความว่าคุณจะเลอะเทอะมากเมื่อคุณเขียนโค้ด

แต่แล้วอีกครั้งเป็นเลอะเทอะมากสามารถมีข้อได้เปรียบ


ข้อดีอีกประการของลัวะคือการทำให้ภาษาคำอธิบายข้อมูลที่ดี เช่นเดียวกับ JSON เป็นเพียงไฟล์ JavaScript ที่สร้างและส่งกลับอาร์เรย์ / ตารางคุณสามารถสร้างสคริปต์ Lua ที่ส่งคืนตารางได้

สิ่งนี้มีประโยชน์สำหรับไฟล์กำหนดค่า รูปแบบตารางของ Lua นั้นดีกว่ารูปแบบ. ini มาก รูปแบบยังค่อนข้างสะอาดกะทัดรัดและขยายได้

โอ้และมันก็ยังเป็นสคริปต์ Lua ดังนั้นจึงสามารถใช้ตรรกะได้ตามจริง ข้อเสียของมันคือ ... ก็คือสคริปต์ Lua ดังนั้นจึงสามารถใช้ตรรกะที่แท้จริงได้ นั่นอาจเป็นหายนะในเกมเนื่องจากผู้ใช้อาจจะเริ่มทำสิ่งต่าง ๆ

แต่อันที่จริงเรื่องนี้จัดการได้ง่าย Lua ถูกออกแบบมาเพื่อการฝังซึ่งหมายความว่าการแยกนั้นค่อนข้างง่าย อันที่จริงรัฐลัวะใหม่ให้อะไรโดยปริยาย คุณต้องทำอะไรซักอย่างเพื่อเปิดเผยแม้แต่พื้นฐานที่สุดของห้องสมุด Lua มาตรฐาน การเข้าถึงไฟล์การเข้าถึงสถานะเกม ฯลฯ ทั้งหมดเป็นการเลือกไม่ใช้การยกเลิก และแต่ละรัฐลัวะนั้นแยกจากกัน สถานะ Lua ที่คุณใช้สำหรับสคริปต์ AI ไม่จำเป็นต้องเป็นสถานะ Lua ที่คุณใช้สำหรับไฟล์กำหนดค่า

จริง ๆ แล้วฉันมีรหัสบางอย่างที่อนุญาตให้คุณลงทะเบียน Lua มาตรฐานไลบรารี่หลายอัน แต่ต้องผ่านและลบไฟล์ทั้งหมดของ IO ท้ายที่สุดสิ่งที่เลวร้ายที่สุดที่ไฟล์กำหนดค่าแบบอิง Lua นั้นอาจทำให้เกมของคุณพังทันทีเมื่อรันโดยใช้หน่วยความจำไม่พอ และเนื่องจากคุณไม่ได้แชร์ไฟล์ปรับแต่งด้วยตนเองนั่นจะไม่สนุกสำหรับแฮกเกอร์


ฉันจะบอกว่าข้อเสียที่ใหญ่ที่สุดของภาษาสคริปต์ใด ๆ คือการแก้จุดบกพร่อง ภาษาสคริปต์ส่วนใหญ่ไม่มี debuggers และ Lua ก็ไม่ต่างกัน Lua มีเครื่องมือทั้งหมดที่จำเป็นในการสร้างเครื่องมือแก้ไขข้อบกพร่อง แต่มันไม่มีตัวดีบักในตัว คุณต้องรวมเข้าด้วยกัน และนั่นจะต้องมีระดับการทำงานที่สมเหตุสมผล

หรือคุณสามารถกำหนดได้ด้วย "printf debugging" มันขึ้นอยู่กับว่าคุณเขียนรหัส Lua มากแค่ไหน


1
การไหลไม่ใช่สิ่งที่ดีเสมอไป บางครั้งการทำสิ่งต่าง ๆ โดยอัตโนมัติหมายถึงการไม่สละเวลาเดินข้ามทางเลือกการออกแบบ
lurscher

10
@lurscher: การออกแบบเป็นสิ่งที่คุณทำก่อนที่คุณจะนั่งลงรหัส คุณควรใช้ทางเลือกการออกแบบทั้งหมดก่อนที่จะเริ่มเขียนทดสอบและแก้ไขข้อบกพร่องของรหัส
Nicol Bolas

23

ฉันทำงานที่ไหน:

ข้อดี:

  • การปรับปรุงเวลาการทำซ้ำ เกมของเราถูกตั้งค่าให้สำรวจความคิดเห็นระบบไฟล์โฮสต์สำหรับการเปลี่ยนแปลงและ "slurp" โดยอัตโนมัติในการเปลี่ยนแปลง (มันจะมีผลเมื่อเปิดไฟล์ถัดไปเท่านั้น แต่ในทางปฏิบัตินั่นคือการปรับปรุงที่สำคัญ: โหลดระดับใหม่และการเปลี่ยนแปลง lua ใหม่ของคุณจะเข้ามาทันที)
  • บูรณาการคอนโซล ฟังก์ชันการแก้ไขข้อบกพร่องใด ๆ สามารถเชื่อมต่อกับคอนโซลสไตล์ Quake แบบดั้งเดิมด้วย REPL สำหรับงานสร้างภายในเราสามารถเชื่อมต่อ lua REPL เข้ากับซ็อกเก็ตธรรมดาที่พูด telnet และเรามีเครือข่ายควบคุมเกมของเรา
  • API ที่ลดลงและการเรียนรู้ที่ต่ำกว่า ศิลปินและนักออกแบบที่ไม่ใช่ด้านเทคนิคสามารถเข้าร่วมในงานบางอย่างที่มักจะเป็นคอขวดโปรแกรมเมอร์
  • ผู้เชี่ยวชาญการวิเคราะห์รหัสคงที่ มันง่ายที่จะแยกวิเคราะห์ผลลัพธ์luac -lและมองที่ bytecode เพื่อทำการวิเคราะห์ นอกจากนี้ยังค่อนข้างง่ายในการแยกไฟล์ lua ส่วนใหญ่โดยเฉพาะถ้าคุณมีระเบียบการเข้ารหัส เราสามารถบังคับใช้การประชุมท้องถิ่น นอกจากนี้คุณยังสามารถดูmetaluaเพื่อเพิ่มพลังที่นี่
  • จัดการข้อผิดพลาด หาก API lua_pcallของเราคือความผิดพลาดของฟรีแม้ว่าหลัวทำอะไรโง่เราสามารถจับมันและกู้คืนโดยใช้
  • API ส่วนขยายง่าย การเขียนฟังก์ชันใหม่สำหรับ Lua <-> C ++ API นั้นไม่ยากเกินไป นอกจากนี้ยังมีแพ็คเกจที่จะช่วยให้สิ่งนี้เป็นไปโดยอัตโนมัติ
  • แหล่งที่มาง่าย การเปลี่ยนแปลงเช่นหลีกเลี่ยงการคำนวณเลขทศนิยมในล่าม lua (สำคัญบนแพลตฟอร์มแบบฝัง) หรือการปรับให้เหมาะสมสำหรับระบบเฉพาะนั้นไม่ยากเกินไป!
  • metatables สิ่งเหล่านี้ยอดเยี่ยม มีศักยภาพมากที่จะทำสิ่งที่น่าสนใจในขณะทำงาน เรามี "ตารางเสมือน" ที่ไม่มีเนื้อหาและทำการค้นหาในโครงสร้างข้อมูลที่ซับซ้อนใน C ++ - ด้านเกมของเรา
  • coroutines ความสามารถในการหยุดและดำเนินการต่อเช่นสคริปต์พฤติกรรม AI นั้นน่าทึ่ง ถึงแม้ว่ามันจะเข้าใจได้ดีขึ้นในส่วนของ lua scripter แต่เรายังคงทำงานเพื่อทำให้เครื่องมือนี้ "ปลอดภัย" มากขึ้นด้วย

จุดด้อย:

  • GC คาดเดาไม่ได้ ปรับแต่งสิ่งที่เราstepควรเปลี่ยนแปลงอย่างมากต่อเกม ทำงานได้ดีขึ้นเมื่อใช้ GC แบบเต็มทุกเฟรม (ชุดการทำงานขนาดเล็ก) บางคนทำงานได้ดีขึ้นเมื่อใช้บัตรขนาดเล็กกว่ามาก โปรดทราบว่ามีการทำงานมากมายในการปรับปรุง GC ในเวอร์ชัน lua รุ่นใหม่และในแพตช์ (ซึ่งคุณไม่ควรกลัวที่จะใช้!)
  • ค่าใช้จ่ายที่สูงขึ้น เราเก็บโครงสร้างข้อมูลขนาดใหญ่จำนวนมากของเราไว้ด้าน C เพื่อหลีกเลี่ยงค่าใช้จ่ายหน่วยความจำต่อตารางรายการ C ++, C และแอสเซมบลีโดยทั่วไปสร้างรหัสที่เร็วขึ้น ดังนั้นมันจึงถูกเก็บไว้ใน 90% ของเกมเอ็นจิ้นที่ไม่ได้มีประสิทธิภาพที่สำคัญและบางครั้งเราย้ายข้อมูลจาก lua ไปยัง C (หรือกลับกัน)
  • การกระจายตัวของ บางทีปัญหาที่ใหญ่ที่สุดในระบบหน่วยความจำขนาดเล็ก เรามักจะใช้ออบเจ็กต์ขนาดเล็กและฮีปออบเจ็กต์ขนาดใหญ่ที่แยกต่างหากสำหรับ lua เราใส่คะแนนเต็ม GC ในจุดยุทธศาสตร์ในเกม เรายกเลิกการโหลดสคริปต์หรือทิ้งเนื้อหาlua_Stateทั้งหมดในบางกรณี และบางครั้งเราก็ยังมีปัญหา การปรับขนาดของกลุ่มวัตถุขนาดเล็ก (คงที่เพื่อความเรียบง่ายและค่าใช้จ่ายต่ำ) และขนาดของกองวัตถุขนาดใหญ่เฉพาะ lua อาจเป็นเรื่องเจ็บปวด แต่สำหรับระบบที่มีขนาดใหญ่กว่าประมาณ 4MB เรายังไม่ได้ใส่ใจกับฮีปและพูลแบบพิเศษ
  • ขาดความปลอดภัยประเภท หากคุณไม่มีชุดเครื่องมือวิเคราะห์รหัสแบบคงที่ที่ดีคุณจะต้องย้อนกลับไปตรวจสอบข้อผิดพลาดรันไทม์จำนวนมาก (อาจใช้__indexและ__newindex) จะดีกว่าถ้าคุณสามารถตรวจจับข้อผิดพลาดในเวลารวบรวม มีหลายสิ่งที่คุณสามารถทำได้เพื่อบรรเทาสิ่งนี้

แนะนำอย่างมากของ Lua เพียงแค่ยินดีที่จะทำงานกับมันสักหน่อย! คุณอาจต้องการตรวจสอบSquirrelแม้ว่าฉันเชื่อว่ามีฐานผู้ใช้ที่เล็กกว่า


ฉันหวังว่าฉันจะลงคะแนนได้หลายครั้ง ครอบคลุมมากมีไหวพริบมากมีโครงสร้างที่ชัดเจน +1
Koarl

5

จริงๆแล้วมีข้อดี 3 ข้อคือ:

ปัจจัยเหล่านี้ช่วยให้คุณเป็นผู้พัฒนาเกมเพื่อเปิดใช้งานคุณสมบัติที่จะเร่งการพัฒนาและเพิ่มคุณภาพของเกม

ตัวอย่างเช่น:

  • คุณจะสามารถเปลี่ยน logics เกมของคุณได้ง่ายๆเพียงแค่อัปเดตเกมของคุณจากไฟล์หรือซ็อกเก็ตเครือข่าย
  • คุณสามารถอนุญาตให้ผู้ใช้สร้างสคริปต์ของตนเอง (สำหรับบอทหรือ mods)
  • นักออกแบบเกมและศิลปินของคุณจะสามารถอัปเดตและทดสอบชิ้นส่วนของเกมได้โดยไม่ต้องใช้ชุดเครื่องมือคอมไพล์
  • คุณจะไม่ต้องคอมไพล์ซ้ำทุกครั้งที่คุณเปลี่ยนสคริปต์ไม่กี่ครั้ง
  • คุณไม่จำเป็นต้องเขียนเกมใหม่ทั้งหมดหากคุณเปลี่ยนแพลตฟอร์ม / เครื่องมือ / ภาษา

1
"คุณไม่ต้องเขียนเกมใหม่ทั้งหมดหากคุณเปลี่ยนแพลตฟอร์ม / เครื่องมือ / ภาษา" เว้นแต่คุณจะเปลี่ยนจาก Lua เป็นภาษาอื่น และถ้าคุณเขียน "เกมทั้งหมด" ใน Lua ถ้าคุณเปลี่ยนเอ็นจิ้นการเปลี่ยนแปลงนั้นจะต้องสัมผัสกับ Lua (หรือคุณต้องการสิ่งที่เป็นนามธรรมระหว่าง Lua และเอ็นจิ้นเพื่อซ่อนรายละเอียด) ดังนั้นฉันไม่เห็นว่า Lua ช่วยได้อย่างไรในกรณีเหล่านี้
Nicol Bolas

3

จากประสบการณ์ของฉันต้มลงเล็กน้อย

ข้อดี

  • การรวมครั้งแรกนั้นง่ายมาก มีเครื่องมือเพื่อช่วยสร้างการเชื่อมโยง แต่กลไกการเชื่อมโยงนั้นง่ายมากที่คุณสามารถเขียนเวอร์ชันของคุณเองพร้อมคุณสมบัติที่กำหนดเองของคุณในเวลาไม่นาน
  • คุณจะได้รับการวนซ้ำเร็วขึ้นในตรรกะของเกม (สมมติว่าคุณใช้การโหลดรันไทม์)
  • คุณจะได้รับสภาพแวดล้อมที่มีอิสระในการทดลอง: คุณจะลองทำสิ่งต่าง ๆ ได้มากขึ้นเพราะค่าใช้จ่ายที่ลดลงอย่างมาก
  • ไวยากรณ์ที่คุ้นเคย: สำหรับความแตกต่างทั้งหมดคุณจะถูกกดอย่างหนักในฐานะโปรแกรมเมอร์ C เพื่อไม่ให้รู้สึกอึดอัดภายในเวลาไม่กี่ชั่วโมง
  • การแยกลอจิกเกมที่ดีขึ้นกับ "เอ็นจิ้น": เอ็นจิ้นของคุณกลายเป็นผู้ให้บริการที่ต้องเปิดเผย API ที่ดีให้กับลูกค้า Lua อุปสรรคทางภาษาทำให้คุณคิดมากขึ้นแทนที่จะไปถึงที่นั่นและเล่นซอลตัวแปรของสมาชิก

จุดด้อย

  • การจัดการหน่วยความจำ Lua ไม่เหมาะสำหรับเกม คุณรับมือกับมันคุณไม่ชอบมัน
  • การแก้ไขข้อผิดพลาด Lua แย่มากจากกล่อง คุณจะต้องทำงานเพื่อปรับปรุงประสบการณ์
  • การเก็บข้อมูลใน Lua หมายความว่าคุณจะต้องทำการดีบักใน Lua: การตรวจสอบข้อมูลจาก C ในตอนแรกจะยุ่งยาก
  • Lua มีจำนวนของการยิงที่ดีในไวยากรณ์ foot เช่นเดียวกับตัวแปรทั้งหมดที่เป็นค่าเริ่มต้น
  • Lua เป็นภาษาโปรแกรมเหมือนกับที่อื่น ๆ อย่าคาดหวังว่าผู้ที่ไม่ใช่โปรแกรมเมอร์จะกลายเป็นโปรแกรมเมอร์อย่างน่าอัศจรรย์เพียงเพราะคุณลบคอมไพเลอร์
  • การเก่งในการบูรณาการและสนับสนุน Lua เป็นงานชิ้นใหญ่ อย่าคาดหวังว่ามันจะพุ่งออกมาทันที มันยุติธรรมที่จะสมมติว่าคุณจะต้องตัดค่าใช้จ่ายนี้จริง ๆ ในบางเกม

ขั้นสุดท้ายความเป็นส่วนตัวคำตัดสิน: หากคุณกำลังสร้างเกมที่มีขนาดพอเหมาะและไม่มีภาษาสคริปต์อยู่ให้ลอง Lua มันจะคุ้มค่า


1

Garry's Mod เป็นตัวอย่างหนึ่งของเกมที่ใช้ Lua และ C ++ พวกเขาใช้ Lua สำหรับ mods ทั้งหมดซึ่งทำให้พวกเขาง่ายขึ้นสำหรับคนที่จะทำ C ++ ใช้สำหรับการทำ internals ทั้งหมด สิ่งเดียวที่ฉันคิดได้ก็คือ Lua นั้นไม่เร็วเท่ากับ C ++

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