ข้ามไปเนื้อหาหลัก

เจาะลึกบั๊กแคช Godot 4 ที่รอดตา CI แต่พังตอนรันเครื่องนักพัฒนา

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

เรียบเรียงโดย AI
Inewgen
10 Aug 2026ที่มา: Dev.to2 นาทีอ่าน (0 ครั้ง)
แชร์
เจาะลึกบั๊กแคช 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 สำหรับโหลดสคริปต์ทรัพยากรล่วงหน้าเพื่อความปลอดภัยในการตรวจสอบประเภทข้อมูลขณะรันไทม์

game development pixel art code setup

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

ไม่อยากพลาดข่าวใหม่?

สมัครรับสรุปข่าวสารใหม่ทางอีเมล ไม่บ่อยจนรำคาญ

โฆษณา

นอกจากนี้ยังมีการเพิ่มชุดตรวจสอบแบบ static check ด้วยคำสั่งเช็คแคช เพื่อป้องกันไม่ให้ชื่อคลาสที่มีความอ่อนไหวต่อแคชถูกเรียกใช้งานนอกเหนือจากการประกาศ class_name ของตัวเอง ซึ่งช่วยให้ระบบ CI สามารถตรวจจับการอ้างอิงคลาสโกลบอลใหม่ๆ ที่อาจหลุดรอดไปได้ตั้งแต่เนิ่นๆ

ผลลัพธ์จากการแก้ไขทำให้การรันชุดทดสอบทั้งหมดผ่านฉลุย รวมถึงการตรวจสอบสื่อมีเดียจำนวน 911 ไฟล์ก็ผ่านอย่างไร้ที่ติ ปิดฉากปัญหาแคชหลอนที่เคยกวนใจในขั้นตอนการเริ่มต้นโปรเจกต์ลงได้อย่างเด็ดขาด

ที่มา: Dev.to

ความคิดเห็น

แสดงความคิดเห็น
0/2000

พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้