เจาะลึกบั๊กแคช Godot 4 ที่รอดตา CI แต่พังตอนรันเครื่องนักพัฒนา
นักพัฒนาแชร์ประสบการณ์แก้ปัญหา Stale Class Cache ในเกม Godot 4 ที่ทำให้ระบบ CI ผ่านฉลุยแต่เครื่องโลคอลพาร์สโค้ดพังยับ

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- เกมพิกเซลอาร์ต Nocturne Vania บน Godot 4 เจอPบับบั๊กแคชคลาสสิก
- CI รอดเพราะรีเฟรชแคชก่อนรัน แต่เครื่องนักพัฒนาพังถ้าใช้แคชเก่า
- แก้ไขด้วยการเปลี่ยนมาใช้ path ของสคริปต์และ preload แทน global type
- เพิ่มสคริปต์ตรวจสอบ static check ใน PR #95 ป้องกันปัญหานี้ซ้ำ
การพัฒนาเกมด้วยเอนจิ้นสมัยใหม่อย่าง Godot 4 มักพึ่งพาคีย์เวิร์ด class_name เพื่ออ้างอิงประเภทข้อมูลแบบโกลบอลได้อย่างสะดวกรวดเร็ว แต่นักพัฒนาเกมพิกเซลอาร์ตแนว Metroidvania ที่มีชื่อว่า Nocturne Vania กลับต้องเผชิญกับปัญหาชวนปวดหัว หลังจากเพิ่มพื้นที่หอระฆังเข้าไปในโปรเจกต์ ซึ่งประกอบด้วยห้องใหม่ ศัตรู เอฟเฟกต์ และตัวช่วยแผนที่ที่ใช้งาน class_name ทั้งหมด
ปัญหาประหลาดนี้เกิดขึ้นเพราะตัวเกมสามารถรันได้อย่างไม่มีปัญหาบนโปรเจกต์ที่นำเข้าใหม่ และผ่านการทดสอบจากระบบ Continuous Integration (CI) ทุกครั้ง แต่กลับเกิดข้อผิดพลาด parse error เมื่อรันบนเครื่องโลคอลที่มีการดึงโค้ดเดิมอยู่ก่อนแล้ว เนื่องจาก Godot จะเก็บข้อมูลการนำเข้าโปรเจกต์ไว้ในโฟลเดอร์ .godot ซึ่งเซสชันเอดิเตอร์เดิมอาจยังมีไฟล์ global_script_class_cache.cfg ที่ล้าสมัยหลงเหลืออยู่ ทำให้สคริปต์หลักพยายามอ้างอิงคลาสโกลบอลที่ยังไม่ถูกรีเฟรชในแคช
ในระบบพัฒนาเกม การพึ่งพาไฟล์แคชที่สร้างขึ้นโดยเอนจิ้นอัตโนมัติมักสร้างความปวดหัวให้กับทีม เพราะสภาพแวดล้อมระหว่างเครื่องนักพัฒนา (Local) กับระบบทดสอบอัตโนมัติ (CI) มักมีความแตกต่างกันในแง่ของลำดับการทำงานและการมีอยู่ของไฟล์ชั่วคราว การแก้ปัญหาที่ต้นเหตุด้วยการเลิกพึ่งพา global name ในจุดเสี่ยง จึงเป็นแนวทางปฏิบัติที่ช่วยลดช่องโหว่ระหว่างสภาพแวดล้อมเหล่านี้ได้อย่างยั่งยืน
เพื่อแก้ไขปัญหานี้ นักพัฒนาได้ทำการปรับปรุงโค้ดรวมทั้งหมด 19 ไฟล์ โดยมีการเพิ่มโค้ด 81 บรรทัด และลบออก 33 บรรทัดในพูลรีเควสต์ PR #95 โดยปรับเปลี่ยนวิธีการอ้างอิงคลาส เช่น การสืบทอดห้องในเกมเปลี่ยนมาใช้ path ตรงอย่าง extends "res://src/rooms/tower_room.gd" แทนการเรียกชื่อคลาสตรงๆ รวมถึงการใช้ฟังก์ชัน preload สำหรับโหลดสคริปต์ทรัพยากรล่วงหน้าเพื่อความปลอดภัยในการตรวจสอบประเภทข้อมูลขณะรันไทม์

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
นอกจากนี้ยังมีการเพิ่มชุดตรวจสอบแบบ static check ด้วยคำสั่งเช็คแคช เพื่อป้องกันไม่ให้ชื่อคลาสที่มีความอ่อนไหวต่อแคชถูกเรียกใช้งานนอกเหนือจากการประกาศ class_name ของตัวเอง ซึ่งช่วยให้ระบบ CI สามารถตรวจจับการอ้างอิงคลาสโกลบอลใหม่ๆ ที่อาจหลุดรอดไปได้ตั้งแต่เนิ่นๆ
ผลลัพธ์จากการแก้ไขทำให้การรันชุดทดสอบทั้งหมดผ่านฉลุย รวมถึงการตรวจสอบสื่อมีเดียจำนวน 911 ไฟล์ก็ผ่านอย่างไร้ที่ติ ปิดฉากปัญหาแคชหลอนที่เคยกวนใจในขั้นตอนการเริ่มต้นโปรเจกต์ลงได้อย่างเด็ดขาด
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น