คลาส Pool จำเป็นต้องเก็บวัตถุเมื่อใดและเพราะเหตุใด


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

กลุ่มจะถูกใช้เมื่อจำนวนวัตถุจะผันผวนอย่างรวดเร็วและใช้เพื่อลดจำนวนการจัดสรรหน่วยความจำและการรวบรวมขยะ

การใช้พูล Object ใหม่มาตรฐาน () ซึ่งจัดสรรหน่วยความจำใหม่จะถูกแทนที่ด้วยการดึงวัตถุที่จัดสรรแล้วจากพูล สิ่งนี้จะเร็วกว่ามากแม้ว่าคุณจะไปและตั้งค่าตัวแปรทุกตัวในวัตถุเก่าเป็นค่าเริ่มต้น

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

ตัวอย่างทั่วไปคือกระสุน

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

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


ดังนั้นฉันคิดว่าคลาสพูลสำหรับเอฟเฟกต์ของอนุภาคจะมีความสำคัญอย่างยิ่งใช่มั้ย
mathacka

ใช่ว่าประเภทของสถานการณ์ได้รับการออกแบบมาอย่างแน่นอน
ClassicThunder

เป็นการปฏิบัติที่ดีกว่าถ้ามีคลาสพูลเป็นวัตถุของตัวเองหรือใช้โรงงานหรือไม่? Ie Object.getObject () vs ObjectFactory.getObject ()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.