वस्तुओं को रखने के लिए पूल कक्षा की आवश्यकता कब और क्यों है?


12

मैं opengl es का अध्ययन कर रहा हूं और मैंने देखा कि एक स्पर्श और कीबोर्ड घटनाओं पर नज़र रखने के लिए "पूल" वर्ग का उपयोग कर रहा था।

क्या कोई यह बता सकता है कि पूल क्लास की आवश्यकता कैसे और क्यों है। जो कुछ मैं पढ़ रहा था, उसमें कचरा संग्रह करने और इनपुट कक्षाओं की संख्या को सीमित करने के लिए कुछ था।

यह सब मुझे थोड़ा सार लगता है, इसलिए अगर कोई यह समझा सकता है कि क्या चल रहा है, तो मैं इसकी सराहना करूँगा, मैंने कुछ कोड यहाँ चिपकाए हैं:

    public Pool(PoolObjectFactory <> factory, int maxSize) {            
        this.factory = factory;         
        this.maxSize = maxSize;         
        this.freeObjects = new ArrayList < T > (maxSize);     
    }  
         
    public T newObject() {        
        T object = null ;        
        if (freeObjects.isEmpty())            
            object = factory.createObject();        
        else             
            object = freeObjects.remove(freeObjects.size() - 1);        
            return object;     
    } 

    public void free(T object) {         
        if (freeObjects.size() < maxSize)             
            freeObjects.add(object);     
    }

    PoolObjectFactory <TouchEvent> factory = new PoolObjectFactory <TouchEvent> () {
     
    @Override     
    public TouchEvent createObject() {         
         return new TouchEvent();     
    } 

    Pool <TouchEvent> touchEventPool = new Pool <TouchEvent> (factory, 50); 
    TouchEvent touchEvent = touchEventPool.newObject(); 
    . . . do something here . . . 
    touchEventPool.free(touchEvent);

धन्यवाद!

जवाबों:


17

तालिकाओं का उपयोग तब किया जाता है जब वस्तुओं की संख्या में नाटकीय रूप से उतार-चढ़ाव होगा और स्मृति आवंटन और कचरा संग्रहण की मात्रा को कम करने के लिए उपयोग किया जाता है।

पूल का उपयोग करते हुए मानक नई ऑब्जेक्ट () जो नई मेमोरी आवंटित करती है, को पूल से पहले से आवंटित ऑब्जेक्ट को खींचने के साथ बदल दिया जाता है। यह बहुत तेज़ है भले ही आप चलते हैं और पुरानी चर में हर चर को डिफ़ॉल्ट पर रीसेट करते हैं।

यदि आप हर बार एक नया आइटम बनाते हैं तो आपके पास एक बहुत बड़ा सिर होता है क्योंकि प्रत्येक ऑब्जेक्ट के लिए मेमोरी आवंटित की जानी चाहिए। इसके अलावा, क्योंकि आप बहुत सारी वस्तुओं का निर्माण कर रहे हैं, इसलिए आपको उन्हें अक्सर साफ करना चाहिए, जिसके कारण कचरा कलेक्टर को बहुत अधिक चलने वाले प्रदर्शन को नुकसान पहुंचा सकता है।

एक सामान्य उदाहरण गोलियों है।

FPS के लिए स्क्रीन पर 0 गोलियां हो सकती हैं, फिर अगले सेकंड 1000 और उसके बाद फिर से 0। यदि आप हर एक के लिए एक नई बुलेट बनाने के लिए थे, तो निरंतर मेमोरी आबंटन अत्यधिक प्रदर्शन गहन होगा। इसके अलावा कचरा संग्रहकर्ता को इन सभी उदाहरणों को ट्रैक करना होगा और समय-समय पर सफाई करनी होगी जिसमें और भी अधिक समय लगता है।

यदि आपके पास 5000 गोलियों का एक पूल है और केवल अपडेट करें और उन लोगों के साथ बातचीत करें, जो मुक्त सूची में नहीं हैं, तो आपके पास केवल 5000 कुल आवंटन हैं, चाहे प्रति गोली 1 आवंटन के बजाय अग्निशमन कितनी देर तक चले। इसके अलावा कूड़ा उठाने वाले को केवल एक बार फायरफाइट समाप्त होने की कोई संभावना नहीं है। मेमोरी के साथ बातचीत बहुत धीमी है, इसलिए यह प्रदर्शन पर बहुत बड़ा प्रभाव डालता है और यह सुनिश्चित करता है कि वर्कलोड को समान रूप से फ्रेम दर स्टेटर को रोकने के लिए वितरित किया जाता है।


इसलिए मैं सोच रहा हूं कि कण प्रभावों के लिए एक पूल क्लास बेहद आवश्यक होगा, क्या मैं सही हूं?
माथेका

हां, ठीक उसी तरह की स्थिति पूल के लिए डिजाइन की गई थी।
क्लासिकटहैंड

क्या यह बेहतर है कि एक क्लास पूल हो, जो खुद की वस्तु हो या कारखाने का उपयोग करे। Ie Object.getObject () बनाम ObjectFactory.getObject ()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.