การเพิ่มประสิทธิภาพการทำงาน: Global Invalidation ของ VALORANT

นี่จะเป็นเรื่องราวการดำเนินงานของทีมพัฒนาประสิทธิภาพของ VALORANT ในการเพิ่มประสิทธิภาพการทำงานของไคลเอนต์ของคุณ

สวัสดี! ผม Aaron Cheney วิศวกรซอฟต์แวร์จากทีมพัฒนาประสิทธิภาพของ VALORANT ประสิทธิภาพการทำงานนั้นเป็นองค์ประกอบหลักในการรักษาความสมบูรณ์ของการแข่งขันใน VALORANT และทีมของเราก็มีหน้าที่ในการคอยควบคุม รักษา และพัฒนาประสิทธิภาพของทั้งเซิร์ฟเวอร์และไคลเอนต์นั้น

เรารู้สึกตื่นเต้นอย่างมากที่จะได้ปล่อยการอัปเดตฟีเจอร์ที่ได้อยู่ในช่วงพัฒนามานานหลายเดือนนี้: Global Invalidation เราจะมาเข้าสู่รายละเอียดในส่วนของฟีเจอร์นี้ในอีกไม่ช้า แต่ก่อนอื่นมาดูกันก่อนดีกว่าว่าฟีเจอร์นี้มันได้ส่งผลกับประสิทธิภาพการทำงานของไคลเอนต์อย่างไรตั้งแต่แพตช์ 4.03

มีการสปอยล์: มันเจ๋งสุด ๆ เลย

global-invalidation-live-data_TH.jpg

Global Invalidation นั้นจะเป็นสิ่งที่ทำให้เกิดการพัฒนาขึ้นอย่างมากสำหรับฐานผู้เล่นส่วนใหญ่ของเรา อันที่จริงแล้ว มันเป็นการเพิ่มประสิทธิภาพการทำงานสำหรับไคลเอนต์ที่ยิ่งใหญ่ที่สุดตัวเดียวที่มีมาตั้งแต่เปิดตัวเกมมาเลยด้วยซ้ำ

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

  • กราฟจะแสดงถึง “แพตช์” และ “ค่า FPS โดยเฉลี่ย” โดยที่ยิ่งตัวเลขเยอะก็ยิ่งดี
  • แต่ละเส้นจะแสดงถึงการตั้งค่าฮาร์ดแวร์โดยทั่วไป (การจับคู่สเปคของ CPU กับ GPU) จากฐานผู้เล่นของเรา เมื่อวิเคราะห์ในส่วนของข้อมูลประสิทธิภาพนี้ เราได้พิจารณาให้การจับคู่นี้เป็นตัวกำหนดที่สำคัญที่สุดสำหรับประสิทธิภาพที่คาดหวังไว้ อุปกรณ์ต่าง ๆ ที่มีการจับคู่สเปคของ CPU กับ GPU ในแบบเดียวกันนั้นได้ถูกวิเคราะห์รวมกันในกราฟเหล่านี้
  • ตัวอย่างของมูลนั้นถูกดึงมาจากการเข้าคิวทั้ง 2 รูปแบบ: เกมโหมด Unrated และโหมด Competitive เนื่องจากโหมดเหล่านี้เป็นโหมดยอดนิยมในเกม VALORANT เราจึงได้ลงแรงอย่างมากไปกับการทำความเข้าใจและเพิ่มประสิทธิภาพในส่วนนี้
  • เราได้คัดเกมต่าง ๆ ที่มีผู้เล่นไม่ครบทั้ง 10 คนออกไป เพื่อให้มั่นใจว่าสิ่งที่เปลี่ยนแปลงไปจะไม่ทำให้ข้อมูลมีความคลาดเคลื่อนไป (เกมที่มีผู้เล่นน้อยกว่าจะมีประสิทธิภาพการทำงานที่มากกว่า)

สรุปในส่วนของ GLOBAL INVALIDATION

global-invalidation-summary-flow_TH.jpg

Global Invalidation นั้นจะเพิ่มประสิทธิภาพสำหรับไคลเอนต์ที่ใช้ทรัพยากร CPU (โดยทั่วไปจะเป็นอุปกรณ์ในระดับกลางถึงสูง) ได้มากถึง 15% โดยการเพิ่มประสิทธิภาพเหล่านี้เป็นความพยายามที่ต้องใช้ความช่วยเหลือจากหลาย ๆ ทีมและใช้เวลาอยู่หลายเดือนเพื่อที่จะทำให้ออกมาเสร็จสมบูรณ์ได้ กระบวนการในการตรวจสอบส่วนต่าง ๆ ในตัวเกมของเรานั้นได้นำไปสู่ผลลัพธ์ของการเพิ่มประสิทธิภาพให้สูงขึ้น และการจัดการความเสี่ยงไปพร้อม ๆ กันนั้นช่วยทำให้มั่นใจว่าผู้เล่นจะได้รับประสบการณ์การเล่นที่เสถียรอีกด้วย

ใครจะได้รับผลประโยชน์และเปรียบเทียบกับสิ่งที่คาดหวังไว้

จากตัวชี้วัดที่ดำเนินอยู่ของเรา Global Invalidation นั้นจะเพิ่มประสิทธิภาพการทำงานของไคลเอนต์ที่ใช้ทรัพยากร CPU (โดยทั่วไปจะเป็นอุปกรณ์ในระดับกลางถึงสูง) ได้มากถึง 15%

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

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

ทำความเข้าใจในส่วนของ GLOBAL INVALIDATION

ก่อนที่เราจะมาดูภาพรวมของ Global Invalidation นั้น เราจะต้องมาพูดเกี่ยวกับองค์ประกอบ UI ใน Unreal Engine กันสักเล็กน้อยก่อน

Widget และโครงสร้างต้นไม้

องค์ประกอบ UI (หรือที่รู้จักกันในชื่อ Widget) นั้นถูกสร้างขึ้นมาจากองค์ประกอบเล็ก ๆ โดยใช้โครงสร้างต้นไม้ โครงสร้างต้นไม้นั้นจะเปรียบเสมือนกับระบบข้อมูลบนคอมพิวเตอร์ของคุณ โดย Widget นั้นจะสามารถมีส่วนของ Children ที่อยู่ใน Widget นี้มากเพียงใดก็ได้ (เหมือนกับโฟลเดอร์ที่ใส่ไฟล์ลงไปเท่าใดก็ได้)

องค์ประกอบเหล่านี้จะสามารถรวมตัวกันเพื่อสร้าง Widget ที่ซับซ้อนขึ้นมา อย่างเช่นตัวนับกระสุนของเราจะประกอบด้วยส่วนต่าง ๆ และโครงสร้างต้นไม้จะออกมาเหมือนกับด้านล่างนี้:

valorant-ui-example_TH.jpg

เมื่อรวมทั้งหมดเข้าด้วยกันองค์ประกอบของตัวนับกระสุนจะออกมาดังนี้:

valorant-ui-elements_TH.jpg

(ขอบสีสีแดงด้านบนถูกปรับให้คมขึ้นเพื่อความชัดเจน อันที่จริง เส้นขอบเหล่านี้ทับซ้อนกันทั้งหมด)

เมื่อใดก็ตามที่ Widget หนึ่งหรือมากกว่านั้นมีการเปลี่ยนแปลงในโครงสร้างต้นไม้นี้ มันสามารถที่จะส่งผลต่อ Widget อื่น ๆ อีกหลาย ๆ ตัวได้ อย่างเช่นถ้า Widget เลื่อนไปในตำแหน่งอื่นบนหน้าจอ Widget ทั้งหมดที่อยู่ด้านล่างก็จะต้องมีการปรับเปลี่ยนตำแหน่งด้วยเช่นกัน การเปลี่ยนแปลงนี้จะถูกจัดการด้วยระบบที่เรียกว่า “Invalidation” ที่เราจะพูดถึงในส่วนถัดไป

Invalidation

การประเมินปัญหา (Invalidation) นั้นเป็นกลไกที่ Unreal Engine ใช้ในการระบุว่าเมื่อ Widget หนึ่งมีการเปลี่ยนแปลงและต้องได้รับการอัปเดต

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

Widget นั้นจะสามารถมีการประเมินปัญหาได้หลากหลายรูปแบบ ทำให้กระบวนการนี้ซับซ้อนขึ้นไปอีกเล็กน้อย รูปแบบต่าง ๆ ได้แก่:

  • Layout - เมื่อขนาดของ Widget เปลี่ยนแปลง (ต้องลงแรงกันอย่างหนักมาก)
  • Paint - เมื่อรูปแบบของ Widget มีการเปลี่ยนแปลง แต่ไม่มีการเปลี่ยนขนาด
  • Child Order - เมื่อลำดับของ Widget มีการเปลี่ยนแปลงภายในโครงสร้างต้นไม้ (ซึ่งจะเป็นการเปลี่ยนโครงสร้างด้วยเช่นกัน และใช่มันต้องลงแรงเอาเรื่อง)
  • Visibility - เมื่อการมองเห็นของ Widget มีการเปลี่ยนแปลง ไม่ว่าจะกลายมาเป็นไม่อาจมองเห็นได้หรือมองเห็นได้ก็ตาม (ซึ่งจะเป็นการเปลี่ยนโครงสร้างด้วยเช่นกัน และใช่มันต้องลงแรงเอาเรื่อง)

รูปแบบของการทำลายค่าเหล่านี้นั้นถูกใช้ในการเป็นตัวบ่งบอกว่าควรจะต้องมีการจัดการในรูปแบบใดเพื่อให้มันทำงานได้ตามปกติ

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

โดยจะมีเป้าหมายในส่วนของระบบนี้อยู่ได้แก่:

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

นั่นน่าจะเพียงพอแล้วสำหรับการลงรายละเอียดเพื่อที่จะเข้าใจการทำงานของการอัปเดต Widget ต่าง ๆ และสิ่งที่ทำให้เกิดการประเมินปัญหา ถัดมา เราจะมาดูกันว่าเหล่านักพัฒนานั้นใช้งานในส่วนนี้กันอย่างไร

Invalidation Boxes

Unreal Engine นั้นจะมีส่วนประกอบที่เรียกว่า Invalidation Box เพื่อใช้ในการจัดกลุ่ม Widget หลาย ๆ ตัวเข้าด้วยกัน Widget ทั้งหมดที่ถูกบรรจุอยู่ใน Invalidation Box หนึ่งนั้นจะถูกป้องกันจากการส่งต่อ ยืนยัน หรือแทนที่ โดยที่ผลลัพธ์จะถูกจัดเก็บไว้ในเวอร์เทกซ์บัฟเฟอร์แทน

เมื่อใดก็ตามที่หนึ่งใน Widget ต่าง ๆ ใน Invalidation Box เกิดถูกประเมินปัญหาขึ้น ข้อมูลที่จัดเก็บไว้จะถูกทิ้งไปและ Widget นั้นจะได้รับการอัปเดตและแทนที่อีกครั้ง ในขณะที่ทำการรีเฟรชไฟล์แคชนั้นอาจจะเกินความจำเป็นไปสำหรับเพียงเฟรมเดียว ผลลัพธ์จากการตัดแบ่งบางส่วนนั้นจะส่งผลดีกว่าในระยะยาว

Invalidation Boxes นั้นเป็นส่วนสำคัญสำหรับการพัฒนาประสิทธิภาพ UI ของ VALORANT โดยเฉพาะอย่างยิ่งเมื่อเราดำเนินการเปิดตัวมา อย่างไรก็ตาม มันก็ไม่ได้ทำได้อย่างอิสระทั้งหมด:

  • เหล่านักพัฒนาต้องทำความเข้าใจว่า Widget ตัวใดที่จะเหมาะสมสำหรับการจับกลุ่มกันด้วย Invalidation Box โดย Widget ที่มีการอัปเดตอยู่ตลอดนั้นก็จะไม่เหมาะกับในส่วนนี้
  • การใส่ Widget เข้าไปใน Invalidation Box นั้นต้องอาศัยการดำเนินงานด้วยตัวผู้พัฒนาเอง มันเป็นไปไม่ได้เลยที่จะมานั่งดำเนินการกับทุก ๆ Widget ในเกม ดังนั้นเหล่าผู้พัฒนาก็ต้องทำความเข้าใจว่า Widget ตัวใดที่มีค่าพอที่จะใส่ลงไปใน Invalidation Box

คุณสามารถอ่านรายละเอียดเพิ่มเติมเกี่ยวกับ Invalidation Boxes ได้ด้วยการเข้าไปที่เอกสารอ้างอิงของทาง Epic

ตอนนี้เราก็มีบริบทในหัวพอที่จะมาพูดถึง Global Invalidation กันแล้ว!

เข้าสู่ Global Invalidation

ในจุดนี้คุณอาจจะคิดในใจว่า "ทำไมถึงไม่เอาองค์ประกอบ UI ทั้งหมดใส่ลงไปใน Global Invalidation Box ซะเลยล่ะ?" ก็นะ นั่นล่ะคือการทำงานของ Global Invalidation (ประมาณนั้น)

Global Invalidation นั้นมีเป้าหมายในการเพิ่มประสิทธิภาพการทำงานของ UI ในทั้งเกม ในขณะที่จะช่วยลดภาระของเหล่าผู้พัฒนาในการที่จะต้องใส่ Widget ต่าง ๆ ลงใน Invalidation Boxes แต่ละอัน มันเป็นสิ่งที่ปรารถนาไว้เลยทีเดียว

แต่อย่างไรก็ตาม จากส่วนของ UE4.25 (เวอร์ชันของ Unreal Engine ที่ทาง VALORANT ใช้งานอยู่) Global Invalidation นั้นจะไม่ได้ซัพพอร์ต Widget ในทุกรูปแบบ เวอร์ชันถัดมาของ Unreal Engine นั้นได้มีการพัฒนาขึ้นมา แต่ทาง VALORANT จะไม่สามารถใช้ประโยชน์ในส่วนนั้นได้ในทันที ยิ่งไปกว่านั้น เรายังไม่ได้เข้าใจดีในส่วนที่ว่า Global Invalidation จะทำให้การทำงานของ VALORANT นั้นรวดเร็วมากขึ้นเพียงใด

ซึ่งนี่คือจุดเริ่มต้นของสิ่งที่เราต้องทำ

ทำไมเราจึงตัดสินใจในการดำเนินงานในส่วนนี้?

ในช่วงท้ายเดือนกรกฎาคมเมื่อปี 2021 ทีมผู้พัฒนานั้นได้ตัดสินใจทดสอบ Global Invalidation ในการทดสอบภายใน โดยมีการเปลี่ยนแปลงเล็ก ๆ น้อย ๆ ในการแก้ไขบั๊กบางส่วนเพื่อที่จะทำให้การทดสอบเป็นไปได้อย่างสำเร็จลุล่วง แต่เราก็รู้ว่าบั๊กต่าง ๆ จะปรากฏขึ้นมาในช่วงการทดสอบ...และเราก็เจอมันจริง ๆ

ในตอนที่การทดสอบจบลง เราได้พบบั๊กถึง 20 อย่าง และนั่นมันก็ยังเป็นแค่สิ่งที่เห็นได้ชัด ๆ เท่านั้น มันยังมีบั๊กที่เป็นอันตรายแฝงและตรวจพบได้ยากกว่านี้รออยู่อีกมาก และยังไม่ต้องพูดถึงกรณีเล็ก ๆ น้อย ๆ อีกมากมายที่ยังไม่ได้รับการทดสอบแบบเฉพาะเจาะจงอีกด้วย

แต่...Global Invalidation ช่วยเพิ่มประสิทธิภาพการทำงานได้ไหมน่ะหรือ? ได้แน่นอน

จากการวิเคราะห์ข้อมูลที่ได้จากการทดสอบครั้งหนึ่ง มันบอกได้ว่า UI นั้นเร็วขึ้นประมาณ 35% เลยทีเดียว (หมายเหตุ: UI นั้นเป็นเพียงแค่ส่วนหนึ่งสำหรับเฟรมหนึ่งเท่านั้น)

อย่างไรก็ตาม เราก็ยังคงมีคำถามอยู่อีกหลายข้อเลยทีเดียว:

  • เราต้องใช้เวลาเท่าไหร่ในการแก้ไขบั๊กทั้งหมด?
  • ทีมใดที่ควรจะต้องรับผิดชอบงานในส่วนนี้?
  • มันจะได้รับความสำคัญเหนือการพัฒนาอื่น ๆ ที่วางแผนไว้ไหม? เพื่อให้เข้ากับการปล่อยคอนเทนต์ตามปกติ ตารางของเรามักจะมีการกำหนดล่วงหน้าไว้หลายเดือน และการพัฒนาแบบเร่งด่วนแม้ว่าจะเป็นสิ่งที่น่าตื่นตาตื่นใจขนาดนี้ก็ยังยากในการจัดลงในกำหนดการได้
  • การแก้ไขบั๊กมันจะส่งผลต่อการเพิ่มประสิทธิภาพการทำงานไหม? การแก้ไขบั๊กทั้งหมดนั้นจำเป็นที่จะต้องมีการปรับเปลี่ยนโค้ดมากมาย ซึ่งอาจจะทำให้ต้องใช้ทรัพยากรมากขึ้นในการเพิ่มประสิทธิภาพ UI นี้
  • เราควรจะเริ่มดำเนินการเมื่อไหร่? การที่ Global Invalidation นั้นกำลังอยู่ในช่วงพัฒนาใน Unreal Engine เวอร์ชันถัดไปนั้นหมายความว่าเราต้องพิจารณาไทม์ไลน์ของเราสำหรับการผสมผสานเปลี่ยนแปลงจาก Epic อีกด้วย

ท้ายที่สุดแล้ว เราได้ตัดสินใจว่าการพัฒนานี้นั้นมันคุ้มค่าที่จะดำเนินการด้วยเหตุผลต่าง ๆ

การผสมผสาน Unreal Engine และการพิจารณาระยะเวลาที่ต้องใช้

แม้ว่า Unreal Engine ในเวอร์ชัน 4.26 และ 4.27 นั้นจะมีการพัฒนาอย่างมากในส่วนของ Global Invalidation แต่ทาง VALORANT จะยังคงต้องดำเนินการตามกำหนดการการผสมผสานแบบดีเลย์ไปก่อน เหตุผลที่เราไม่ดำเนินการในส่วนของ "การพัฒนาเทคโนโลยีที่รุดหน้าไปมาก" นั้นเพื่อที่จะควบคุมความเสี่ยงและสร้างความเสถียรให้กับเหล่าผู้เล่นของเรา

จากการที่กำหนดการของเรานั้นจะทำให้เราต้องยึดกับ Unreal Engine ในเวอร์ชัน 4.25 ในอีกหลายเดือนนั้นหมายความว่าผู้เล่นนั้นไม่ได้รับผลประโยชน์จากการเพิ่มประสิทธิภาพการทำงานเหล่านี้มามากกว่าหนึ่งปี นั้นไม่ใช่สิ่งที่เราพอใจสักเท่าไหร่

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับความคิดเห็นของ VALORANT ต่อการอัปเกรด Unreal Engine สามารถดูได้ที่โพสต์ Twitter จาก Marcus Reid หัวหน้าฝ่ายเทคโนโลยีของ VALORANT นี้ได้เลย

การเพิ่มประสิทธิภาพการทำงานที่ได้รับรู้

Global Invalidation นั้นจะมีสิ่งที่พิเศษกว่าในส่วนของการพัฒนาประสิทธิภาพ: ค่าที่วัดออกมา เราได้วัดศักยภาพที่เพิ่มขึ้นมาในช่วงการทดสอบภายใน และการส่งค่าเหล่านั้นก็มีความชัดเจน (ในส่วนใหญ่)

การพัฒนาประสิทธิภาพนั้นเป็นสิ่งที่ยาก มันเป็นเรื่องของการเปลี่ยนแปลงทีละเล็กทีละน้อย การเปลี่ยนแปลงที่เพิ่มเติมขึ้นเรื่อย ๆ จะช่วยพัฒนาประสิทธิภาพขึ้นเรื่อย ๆ และการที่การเปลี่ยนแปลงเพียงครั้งเดียวจะสามารถสร้างการเปลี่ยนแปลงแบบก้าวกระโดดนั้นมันก็เป็นไปได้ยาก มันเป็นการเพิ่มประสิทธิภาพที่น่าสนใจเกินกว่าจะปล่อยโอกาสนี้ทิ้งไป

แม้ว่าหลังจากการคิดคำนวณในส่วนของการเพิ่มประสิทธิภาพที่ลดลงจากการแก้ไขบั๊ก Global Invalidation ก็ยังเป็นโอกาสที่ดีที่สุดสำหรับเราเพื่อที่จะสร้างการเพิ่มประสิทธิภาพอย่างมากให้กับผู้เล่นภายในเวลาที่เหมาะสมกัน

เราประสบผลสำเร็จในส่วนนี้ได้อย่างไร?

แม้การทดลองเริ่มต้นในส่วนของ Global Invalidation นั้นจะเริ่มขึ้นตั้งแต่ช่วงปลายเดือนกรกฎาคม 2021 ความพยายามในการรักษาความเสถียรของฟีเจอร์นี้ก็ไม่ได้แสดงผลออกมาจนกระทั่งในช่วงปลายเดือนกันยายน 2021

การผสมผสานกับการเปลี่ยนแปลงบางส่วนของทาง Epic

การผสมผสานกับ Unreal Engine ในเวอร์ชัน 4.26 และ 4.27 อย่างเต็มตัวนั้นคงจะเป็นไปไม่ได้ แต่เมื่อเราทราบว่าทาง Epic นั้นได้คอยดำเนินการในส่วนของ Global Invalidation อยู่นั้น เราจึงได้ตัดสินใจทำการเจาะลึกการเปลี่ยนแปลงต่าง ๆ และตรวจสอบว่าการเปลี่ยนแปลงใดบ้างที่จะนำพาเราเข้าใกล้สู่ Global Invalidation ที่มีความเสถียรและทำงานได้อย่างเต็มที่

ผสมผสานการเปลี่ยนแปลงต่าง ๆ ในบางส่วนนั้นเป็นงานที่ท้าทายเลยทีเดียว มันจำเป็นที่จะต้องปรับเปลี่ยนฟีเจอร์การทำงานหลักให้น้อยที่สุดเท่าที่เป็นไปได้เพื่อคงความเสถียรเอาไว้ในขณะที่นำการเปลี่ยนแปลงจาก Epic เข้ามาให้ถูกส่วน การพัฒนาในส่วนนี้ทั้งหมดนั้นจะถูกดำเนินการใน Branch ที่แยกจาก Branch หลักของ VALORANT เพื่อป้องกันการส่งผลกระทบต่อผู้พัฒนาคนอื่น ๆ

หลังจากการผสมผสานกับการเปลี่ยนแปลงบางส่วนของทาง Epic ลงในการทำงานของเราแล้ว เราได้ใช้เวลาหลายสัปดาห์ไปกับการแก้ไขบั๊กให้มากที่สุดเท่าที่เราจะทำได้ในขณะที่เตรียมเปิดตัว Global Invalidation สู่ Branch หลักของ VALORANT ในระหว่างทางของการดำเนินงาน การตั้งค่าแบบเปิด/ปิดได้ถูกสร้างขึ้นมาเพื่อทำให้เราสามารถเปิดและปิดการใช้งานฟีเจอร์นี้ได้ (หากมีอะไรร้ายแรงเกิดขึ้น)

หลังจากการแก้ไขบั๊กต่าง ๆ พร้อมทั้งการผสมผสานการเปลี่ยนแปลงของทาง Epic ในเวอร์ชัน 4.26 และ 4.27 เราได้ทำการรวม Branch ที่แยกออกไปของเรากลับเข้าสู่ Branch หลัก

การตรวจหาสิ่งที่มีร่วมกันของบั๊กต่าง ๆ

แม้ว่ามีบั๊กมากมายใน Global Invalidation ที่จะแสดงออกมาในรูปแบบที่แตกต่างกัน แต่ต้นเหตุของปัญหานั้นมักจะย้อนกลับไปหาต้นตอปัญหาเพียงตัวเดียว สิ่งเหล่านี้เป็นบั๊กที่ควรจะทำการแก้ไขที่สุด จากการทำเช่นนี้จะสามารถกำจัดปัญหาหลาย ๆ อย่างได้ด้วยการเปลี่ยนแปลงเพียงครั้งเดียว ตัวอย่างเช่น การเปลี่ยนแปลงรูปแบบหนึ่งจะแก้ไขบั๊กได้มากกว่า 10 อย่างที่กระจายอยู่ทั่วตัวเกม การวิเคราะห์อย่างระมัดระวังในส่วนของต้นตอของปัญหานั้นจะนำไปสู่การแก้ปัญหาที่จะเพิ่มประสิทธิภาพและความเสถียรของ Global Invalidation ให้มากขึ้น

ตรวจจับบั๊ก แก้ไขบั๊ก ทดสอบภายใน วนไปเรื่อย ๆ

ในหลาย ๆ สัปดาห์และหลาย ๆ เดือนถัดจากนี้จะเป็นวัฏจักรของการเปิดใช้งาน Global Invalidation ก่อนการทดสอบภายใน ตรวจจับบั๊กต่าง ๆ ปิดใช้งาน Global Invalidation หลังจากการทดสอบภายใน และแก้ไขบั๊กต่าง ๆ วนไปเรื่อย ๆ

developer-bug-fix-flow_TH.jpg

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

เมื่อสิ้นเดือนพฤศจิกายนเมื่อปี 2021 ปัญหาใหญ่ ๆ ทั้งหมดนั้นได้รับการแก้ไขเรียบร้อยและ Global Invalidation ก็ได้มีความเสถียรในส่วนใหญ่

บั๊กที่เด่น ๆ
  • Astra ทำเกมหยุดทำงาน - มีช่วงหนึ่งที่ผู้เล่น Astra ทุกคนจะต้องพบเจอกับการหยุดทำงานของตัวเกมเมื่อโหลดเข้าตัวเกม บั๊กนี้ได้รับการแก้ไขหลังจากที่ผสมผสานการเปลี่ยนแปลงจากทาง Epic
  • การหยุดทำงานในการสืบคุณสมบัติจากหลายแหล่ง - การสืบคุณสมบัติจากหลายแหล่งในภาษา C++ นั้นเป็นหัวข้อที่ยุ่งยากสักหน่อย หากให้อธิบายโดยที่ไม่ต้องเจาะลึกในรายละเอียดนั้น ลำดับของ Destructors ใน Class หนึ่ง ๆ นั้นไม่ได้ดำเนินการในลำดับที่ถูกต้องและทำให้เกิดการหยุดทำงานขึ้น แต่เพียงแค่การสับเปลี่ยนไลน์ของโค้ดทั้ง 2 เพื่อเปลี่ยนลำดับการสืบคุณสมบัตินั้นก็เป็นการแก้ไขปัญหาได้ คุณสามารถอ่านรายละเอียดเพิ่มเติมเกี่ยวกับการสืบคุณสมบัติจากหลายแหล่งได้ด้วยการเข้าไปที่เพจนี้
  • เสียงแชทแบบไม่หยุด - เมื่ออยู่ในหน้าเมนู แถบช่องแชทจะมีเสียงเมื่อคุณเอาเมาส์ไปชี้ โดยบั๊กจะทำให้เกิดเสียงขึ้นหลายครั้งในหนึ่งวินาที ที่จะคอยสร้างความรำคาญให้ทุกคน การแก้ไขบั๊กนี้จำเป็นต้องทำความเข้าใจว่าทำไม Widget ต่าง ๆ ถึงได้รับการตอบสนองจากเมาส์หลาย ๆ ครั้งในหนึ่งเฟรม

    แนวทางปฏิบัติของการทดสอบ

    องค์ประกอบหนึ่งของ Global Invalidation ที่ทำให้เราต้องคอยระมัดระวัง (และรอบคอบกับการทดสอบ) เป็นอย่างยิ่งนั้นคือการที่มันจะส่งผลต่อทุก ๆ ด้านในตัวเกม จริง ๆ นะ

    รายชื่อเพื่อนของคุณงั้นหรือ? แน่นอน ปุ่มที่คุณกดเพื่อเข้าคิวงั้นหรือ? นั่นก็ด้วย เมนูตั้งค่าล่ะ? ไม่เหลือแน่นอน แล้วเปอร์เซ็นต์การเฮดช็อตของฉันล่ะ? เอ่อ...

    ประเด็นคือองค์ประกอบ UI นั้นมีอยู่ทั่วทั้งเกม และพวกมันมักจะถ่ายทอดข้อมูลสำคัญ ๆ ให้แก่ผู้เล่น การทำให้หนึ่งในองค์ประกอบ UI เสียหายนั้นเป็นเรื่องที่ไม่อาจรับได้

    ท้ายที่สุดแล้ว แผนก QA ของเราก็ได้สร้างแผนการทดสอบพร้อมกับกลยุทธ์มากมายเพื่อสร้างความมั่นใจว่า Global Invalidation นั้นได้ทำงานได้ตรงกับที่ตั้งใจไว้

    การทดสอบ Vertical Slice

    “vertical Slice” ของ VALORANT นั้นจะแสดงถึงเส้นทางหลักที่ผู้เล่นจะเข้าถึงในตัวเกมโดยทั่ว ๆ ไป จากการเปิดตัวไคลเอนต์ เข้าคิวสำหรับการแข่งขัน เล่นเกมตลอดทั้งการแข่งขัน ไปจนถึงการโต้ตอบกับหน้าจบเกม ด้วยการมุ่งเน้นไปที่องค์ประกอบสำคัญ ๆ ในตัวเกม ทาง QA สามารถทดสอบเหล่าองค์ประกอบที่ใช้งานบ่อยที่สุดและสามารถตรวจจับปัญหาต่าง ๆ ได้อย่างรวดเร็ว

    การทดสอบ Destructive

    เมื่อการทดสอบ Vertical จบไป ก็จะมาต่อกันที่การทดสอบ Destructive การทดสอบในรูปแบบนี้นั้นมีไว้เพื่อตรวจจับปัญหาที่ไม่คาดถึง โดยมักจะเกิดจากการเปลี่ยนแปลงปัจจัยภายนอก (อย่างเช่นค่า Ping ของเครือข่าย เฟรมเรท การกด Alt-Tab และอื่น ๆ) ฝ่าย QA ที่เพรียบพร้อมด้วยซอฟต์แวร์ที่ใช้ในการดำเนินการได้ใช้เวลาไปหลายสัปดาห์กับการทดสอบ Destructive นี้

    การทดสอบ Edge Case

    ในหลาย ๆ ส่วนของตัวเกม VALORANT นั้นมีผู้เล่นเพียงส่วนน้อยเท่านั้นที่ได้พบเจอ และบางส่วนของเกมก็มีการพบเจอเพียงแค่ครั้งเดียวเท่านั้น (เช่นประสบการณ์ผู้เล่นในรูปแบบใหม่) เพียงแค่ส่วนต่าง ๆ ในเกมเหล่านั้นมันไม่ค่อยออกมาให้เห็นบ่อยนัก ไม่ได้หมายความว่าพวกมันจะไม่ได้มีความสำคัญ การตรวจจับและทดสอบ Edge Cases ทั้งหมดของเรานั้นช่วยในการตรวจจับข้อผิดพลาดต่าง ๆ ที่ซ่อนอยู่ได้

    การทดสอบ PBE (Public Beta Environment)

    PBE นั้นเป็นหมุดหมายสำคัญหลักสำหรับ Global Invalidation

    • มันเป็นครั้งแรกที่ผู้เล่นภายนอกได้เข้ามาทดสอบฟีเจอร์นี้ นั่นหมายความว่า Global Invalidation นั้นได้ถูกทดสอบภายใต้สภาวะของ "โลกภายนอก"
    • PBE จะแสดงถึงคุณสมบัติของฮาร์ดแวร์ที่หลากหลาย PBE นั้นตั้งใจครอบคลุมขอบเขตตั้งแต่สเปคต่ำไปจนถึงสูง และการทดสอบด้วยขอบเขตของอุปกรณ์ของผู้เล่นที่กว้างขวางนี้ได้ช่วยให้เราสร้างความมั่นใจในส่วนของการที่ Global Invalidation จะแสดงประสิทธิภาพได้มากน้อยเพียงใดสำหรับฐานผู้เล่นในวงกว้าง

    หลังจากการทดสอบในส่วนของ PBE ในช่วงสุดสัปดาห์ในวันที่ 22-23 มกราคม 2022 เราได้มั่นใจแล้วว่า Global Invalidation นั้นไม่ได้แทรกแทรงความสมบูรณ์ของตัวเกม และการเพิ่มประสิทธิภาพการทำงานนั้นก็เป็นไปตามที่เราคาดเดาไว้

    เปิดตัว Global Invalidation

    หลังจากที่ได้เปิดตัว Global Invalidation ในแพตช์ 4.03 เราได้คอยตรวจสอบการรายงานจากผู้เล่นในส่วนของบั๊กต่าง ๆ อย่างใกล้ชิด และเรายังคอยสอดส่องข้อมูลประสิทธิภาพการทำงานเพื่อให้มั่นใจว่าการประมาณค่าของเรานั้นตรงกับผลลัพธ์ที่ได้ ท้ายที่สุดนี้ Global Invalidation นั้นเป็นความสำเร็จครั้งยิ่งใหญ่สำหรับเหล่าผู้เล่น และเราหวังว่าคุณจะเพลิดเพลินไปกับ Frame Time ที่พัฒนาขึ้น

    ในตอนนี้ที่ Global Invalidation ได้ออกไปสู่โลกภายนอก ทางทีมพัฒนาประสิทธิภาพก็จะกลับมาทำการพัฒนาเพื่อเพิ่มศักยภาพขึ้นไปอีก จนกว่าจะถึงตอนนั้นก็สนุกกับการเก็บคิลได้เลย!