ความเป็นเจ้าของร่วมกันไม่ค่อยมีเหตุผล
คำตอบนี้อาจไม่ได้สัมผัสกันเล็กน้อย แต่ฉันต้องถามว่ามันมีเหตุผลมากมายที่ผู้ใช้มีจุดยืนร่วมกันในการแบ่งปันความเป็นเจ้าของ ? อย่างน้อยในโดเมนที่ฉันได้ทำงานไม่มีจริงๆ แล้วเพราะไม่เช่นนั้นจะหมายความว่าผู้ใช้ไม่จำเป็นต้องลบสิ่งหนึ่งครั้งจากที่เดียว แต่ลบออกอย่างชัดเจนจากเจ้าของที่เกี่ยวข้องทั้งหมดก่อนที่ทรัพยากรจะเป็นจริง ลบออกจากระบบ
มักจะเป็นแนวคิดทางวิศวกรรมระดับต่ำกว่าเพื่อป้องกันไม่ให้ทรัพยากรถูกทำลายในขณะที่บางสิ่งยังคงเข้าถึงอยู่เช่นเดียวกับเธรดอื่น บ่อยครั้งที่ผู้ใช้ร้องขอให้ปิด / ลบ / ลบบางสิ่งออกจากซอฟต์แวร์ควรทำการลบออกโดยเร็วที่สุดเท่าที่จะทำได้ (เมื่อใดก็ตามที่มีความปลอดภัยที่จะลบ) และแน่นอนไม่ควรจะวนเวียนอยู่และทำให้ทรัพยากรรั่วไหลตราบใดที่ แอปพลิเคชันทำงานอยู่
ตัวอย่างเช่นเนื้อหาเกมในวิดีโอเกมอาจอ้างอิงเนื้อหาจากคลังวัสดุ แน่นอนว่าเราไม่ต้องการตัวชี้ค้างหากวัสดุนั้นถูกลบออกจากห้องสมุดวัสดุในหนึ่งเธรดในขณะที่อีกเธรดหนึ่งยังคงเข้าถึงเนื้อหาที่อ้างอิงโดยเนื้อหาเกม แต่นั่นไม่ได้หมายความว่าสินทรัพย์ในเกมจะมีสิทธิ์ในการแบ่งปันความเป็นเจ้าของเนื้อหาที่อ้างอิงกับไลบรารีเนื้อหา เราไม่ต้องการบังคับให้ผู้ใช้ลบเนื้อหาออกอย่างชัดเจนจากทั้งเนื้อหาและห้องสมุดวัสดุ เราเพียงต้องการให้แน่ใจว่าวัสดุจะไม่ถูกลบออกจากห้องสมุดวัสดุที่เป็นเจ้าของที่มีเหตุผล แต่เพียงผู้เดียวของวัสดุจนกว่าหัวข้ออื่น ๆ จะเข้าถึงวัสดุเสร็จแล้ว
การรั่วไหลของทรัพยากร
แต่ฉันได้ทำงานกับทีมเก่าที่ยอมรับ GC สำหรับส่วนประกอบทั้งหมดในซอฟต์แวร์ และในขณะที่ช่วยในการทำให้แน่ใจว่าเราไม่เคยถูกทำลายทรัพยากรในขณะที่หัวข้ออื่นยังคงเข้าถึงพวกเขา แต่เรากลับได้รับส่วนแบ่งการรั่วไหลของทรัพยากรของเรา
และสิ่งเหล่านี้ไม่ใช่การรั่วไหลของทรัพยากรเล็กน้อยที่ทำให้นักพัฒนารู้สึกหงุดหงิดเช่นเดียวกับหน่วยความจำหนึ่งกิโลไบต์ที่รั่วไหลออกมาหลังจากผ่านไปหนึ่งชั่วโมง นี่คือการรั่วไหลครั้งยิ่งใหญ่ซึ่งมักจะมีหน่วยความจำกิกะไบต์ในเซสชันที่ใช้งานอยู่ซึ่งนำไปสู่การรายงานบั๊ก เพราะตอนนี้เมื่อมีการอ้างอิงความเป็นเจ้าของทรัพยากร (และแบ่งปันในกรรมสิทธิ์) ดังนั้นพูดว่า 8 ส่วนต่าง ๆ ของระบบจากนั้นจะใช้เวลาเพียงหนึ่งล้มเหลวในการลบทรัพยากรในการตอบสนองต่อผู้ใช้ที่ร้องขอให้ลบมันสำหรับมัน ที่จะรั่วไหลออกไปและอาจเป็นไปอย่างไม่มีกำหนด
ดังนั้นฉันจึงไม่เคยเป็นแฟนตัวยงของ GC หรือการนับการอ้างอิงที่นำไปใช้ในวงกว้างเนื่องจากความง่ายในการสร้างซอฟต์แวร์ที่รั่วไหล สิ่งที่เคยเป็นความผิดพลาดของตัวชี้ห้อยซึ่งง่ายต่อการตรวจจับกลายเป็นการรั่วไหลของทรัพยากรที่ยากต่อการตรวจจับซึ่งสามารถบินได้อย่างง่ายดายภายใต้เรดาร์ของการทดสอบ
การอ้างอิงที่อ่อนแอสามารถลดปัญหานี้ได้หากภาษา / ห้องสมุดให้สิ่งเหล่านี้ แต่ฉันพบว่ามันยากที่จะทำให้ทีมนักพัฒนาของชุดทักษะแบบผสมสามารถใช้การอ้างอิงที่อ่อนแอได้อย่างต่อเนื่องตามความเหมาะสม และความยากลำบากนี้ไม่ได้เกี่ยวข้องกับทีมภายในเท่านั้น แต่ยังรวมถึงนักพัฒนาปลั๊กอินทุกตัวสำหรับซอฟต์แวร์ของเรา พวกเขาสามารถทำให้ระบบรั่วไหลของทรัพยากรได้อย่างง่ายดายโดยเพียงแค่เก็บการอ้างอิงถาวรไปยังวัตถุด้วยวิธีที่ยากต่อการติดตามกลับไปที่ปลั๊กอินในฐานะผู้กระทำผิดดังนั้นเราจึงได้รับรายงานข้อผิดพลาดที่เกิดจากทรัพยากรซอฟต์แวร์ของเรา การรั่วไหลเพียงเพราะปลั๊กอินที่มีซอร์สโค้ดอยู่นอกการควบคุมของเราไม่สามารถเผยแพร่การอ้างอิงไปยังแหล่งข้อมูลราคาแพงเหล่านั้น
วิธีแก้ไข: เลื่อนออกเป็นระยะ ๆ
ดังนั้นวิธีการแก้ปัญหาของฉันในภายหลังซึ่งผมนำไปใช้กับโครงการส่วนบุคคลของฉันที่ให้ฉันชนิดของดีที่สุดที่ฉันพบจากโลกทั้งสองคือการขจัดแนวคิดว่าreferencing=ownership
แต่ยังคงมีการทำลายรอการตัดบัญชีของทรัพยากร
ดังนั้นเมื่อใดก็ตามที่ผู้ใช้ทำบางสิ่งที่ทำให้ทรัพยากรต้องการการลบ API จะแสดงในแง่ของการลบทรัพยากรออก:
ecs->remove(component);
... ซึ่งแบบจำลองตรรกะของผู้ใช้ในทางที่ตรงไปตรงมามาก อย่างไรก็ตามทรัพยากร (คอมโพเนนต์) อาจไม่ถูกลบออกทันทีหากมีเธรดระบบอื่น ๆ ในขั้นตอนการประมวลผลซึ่งสามารถเข้าถึงคอมโพเนนต์เดียวกันพร้อมกันได้
ดังนั้นเธรดการประมวลผลเหล่านี้จึงให้เวลาที่นี่และทำให้เธรดที่คล้ายกับตัวรวบรวมขยะสามารถตื่นขึ้นมาและ " หยุดโลก " และทำลายทรัพยากรทั้งหมดที่ถูกร้องขอให้ถูกลบออกในขณะที่ล็อกเธรดจากการประมวลผลคอมโพเนนต์เหล่านั้นจนกว่าจะเสร็จสิ้น . ฉันได้ติดตามสิ่งนี้เพื่อให้ปริมาณงานที่ต้องทำที่นี่นั้นน้อยมากและไม่ลดอัตราเฟรมอย่างเห็นได้ชัด
ตอนนี้ฉันไม่สามารถพูดได้ว่านี่เป็นวิธีการทดลองและทดสอบและได้รับการบันทึกไว้เป็นอย่างดี แต่มันเป็นสิ่งที่ฉันใช้มาสองสามปีแล้วโดยไม่ต้องปวดหัวใด ๆ และไม่มีการรั่วไหลของทรัพยากร ฉันขอแนะนำให้สำรวจวิธีการเช่นนี้เมื่อเป็นไปได้สำหรับสถาปัตยกรรมของคุณเพื่อให้พอดีกับรูปแบบการทำงานพร้อมกันแบบนี้เพราะมันเป็นงานหนักน้อยกว่า GC หรือการนับซ้ำและไม่เสี่ยงต่อการรั่วไหลของทรัพยากรประเภทนี้ภายใต้เรดาร์ของการทดสอบ
ที่เดียวที่ฉันพบการนับการอ้างอิงหรือ GC เพื่อเป็นประโยชน์สำหรับโครงสร้างข้อมูลถาวร ในกรณีดังกล่าวเป็นอาณาเขตของโครงสร้างข้อมูลซึ่งห่างไกลจากความกังวลของผู้ใช้และที่จริงแล้วมันสมเหตุสมผลสำหรับสำเนาที่ไม่เปลี่ยนรูปแต่ละอันเพื่อให้สามารถแบ่งปันความเป็นเจ้าของข้อมูลที่ไม่ได้แก้ไขได้