ฉันมักจะอ่านในเอกสารประกอบเครื่องมือเกมของ ECS ซึ่งเป็นสถาปัตยกรรมที่ดีสำหรับการใช้แคช cpu อย่างชาญฉลาด
แต่ฉันไม่สามารถคิดได้ว่าเราจะได้ประโยชน์จาก cpu cache ได้อย่างไร
หากส่วนประกอบถูกบันทึกในอาร์เรย์ (หรือพูล) ในหน่วยความจำต่อเนื่องเป็นวิธีที่ดีในการใช้ cpu cache แต่ถ้าเราอ่านส่วนประกอบตามลำดับ
เมื่อเราใช้ระบบพวกเขาต้องการรายการเอนทิตีซึ่งเป็นรายการเอนทิตีที่มีส่วนประกอบที่มีประเภทเฉพาะ
แต่รายการเหล่านี้ให้ส่วนประกอบในวิธีการสุ่มไม่ใช่ตามลำดับ
ดังนั้นวิธีการออกแบบ ECS เพื่อเพิ่มการเข้าชมแคชสูงสุด?
แก้ไข:
ตัวอย่างเช่นระบบ Physic ต้องการรายการเอนทิตีสำหรับเอนทิตีที่มีส่วนประกอบ RigidBody และ Transform (มีพูลสำหรับ RigidBody และพูลสำหรับคอมโพเนนต์การแปลง)
ดังนั้นลูปสำหรับการอัพเดตเอนทิตีจะเป็นดังนี้:
for (Entity eid in entitiesList) {
// Get rigid body component
RigidBody *rigidBody = entityManager.getComponentFromEntity<RigidBody>(eid);
// Get transform component
Transform *transform = entityManager.getComponentFromEntity<Transform>(eid);
// Do something with rigid body and transform component
}
ปัญหาคือองค์ประกอบ RigidBody ของเอนทิตี 1 สามารถอยู่ที่ดัชนี 2 ของพูลและคอมโพเนนต์ Tranform ของเอนทิตี 1 ที่ดัชนี 0 ของพูลของมัน (เนื่องจากเอนทิตีบางอย่างสามารถมีคอมโพเนนต์บางตัวไม่ใช่คอมโพเนนต์อื่นและเนื่องจากการเพิ่ม / ลบเอนทิตี ส่วนประกอบแบบสุ่ม)
ดังนั้นแม้ว่าส่วนประกอบจะต่อเนื่องกันในหน่วยความจำ แต่ก็อ่านแบบสุ่มและมันจะมีแคชมากกว่านั้น
หากไม่มีวิธีในการดึงส่วนประกอบถัดไปในลูปมาก่อน