मैं अक्सर ईसीएस गेम इंजन डॉक्यूमेंटेशन में पढ़ता हूं जो कि सीपीयू कैश का बुद्धिमानी से उपयोग करने के लिए एक अच्छा आर्किटेक्चर है।
लेकिन मैं यह नहीं समझ सकता कि हम सीपीयू कैश से कैसे लाभ उठा सकते हैं।
यदि घटकों को किसी सरणी (या पूल) में सहेजा जाता है, तो सन्निहित स्मृति में, यह CPU कैश BUT का उपयोग करने का एक अच्छा तरीका है, यदि हम घटकों को क्रमिक रूप से पढ़ते हैं।
जब हम सिस्टम का उपयोग करते हैं, तो उन्हें संस्थाओं की सूची की आवश्यकता होती है जो उन संस्थाओं की सूची होती है जिनके पास विशिष्ट प्रकार के घटक होते हैं।
लेकिन ये सूचियाँ घटकों को क्रमबद्ध तरीके से देती हैं, क्रमिक रूप से नहीं।
तो कैश हिट को अधिकतम करने के लिए ईसीएस कैसे डिज़ाइन करें?
संपादित करें:
उदाहरण के लिए, एक भौतिक प्रणाली को उस इकाई के लिए एक संस्थाओं की सूची की आवश्यकता होती है जिसमें रिगिबॉडी और ट्रांसफ़ॉर्म घटक होते हैं (रिगिडबॉडी के लिए एक पूल और ट्रांसफ़ॉर्म घटकों के लिए एक पूल होता है)।
तो अपडेट संस्थाओं के लिए इसका लूप इस तरह होगा:
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
}
समस्या यह है कि Unit1 का RigidBody घटक इसके पूल के सूचकांक 2 पर और उसके पूल के सूचकांक 0 पर Unit1 के Tranform घटक हो सकता है (क्योंकि कुछ संस्थाओं के कुछ घटक हो सकते हैं और दूसरे नहीं और संस्थाओं को जोड़ने या हटाने के कारण हो सकते हैं) / घटक बेतरतीब ढंग से)।
इसलिए, भले ही घटक स्मृति में सन्निहित हों, उन्हें बेतरतीब ढंग से पढ़ा जाता है और इसलिए इसमें अधिक कैश मिस होगा, नहीं?
जब तक लूप में अगले घटकों को प्रीफ़ैच करने का कोई तरीका नहीं है?