Kapan dan mengapa kelas Pool diperlukan untuk menampung objek?

12

Saya telah mempelajari berbagai pilihan dan contoh yang saya lihat menggunakan kelas "Pool" untuk melacak acara sentuh dan keyboard.

Bisakah seseorang tolong jelaskan bagaimana dan mengapa kelas biliar dibutuhkan. Dari apa yang saya baca itu ada hubungannya dengan pengumpulan sampah dan membatasi jumlah kelas input yang dibuat.

Ini semua tampak agak abstrak bagi saya, jadi jika seseorang dapat menjelaskan apa yang sedang terjadi, saya akan menghargainya, saya akan menempelkan beberapa kode di sini:

    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);

Terima kasih!

mathacka
sumber

Jawaban:

17

Kolam digunakan ketika jumlah objek akan berfluktuasi secara dramatis dan digunakan untuk mengurangi jumlah alokasi memori dan pengumpulan sampah.

Menggunakan pool, Objek baru standar () yang mengalokasikan memori baru diganti dengan menarik objek yang sudah dialokasikan dari pool. Ini jauh lebih cepat bahkan jika Anda pergi dan mengatur ulang setiap variabel di objek lama ke default.

Jika Anda membuat item baru setiap kali Anda memiliki kepala besar karena memori harus dialokasikan untuk setiap objek. Juga karena Anda membuat begitu banyak objek, Anda harus sering membersihkannya yang menyebabkan pengumpul sampah berjalan sangat sering sehingga lebih merusak kinerja.

Contoh umum adalah peluru.

Untuk FPS mungkin ada 0 peluru di layar kemudian 1000 detik berikutnya dan kemudian 0 lagi yang kedua setelah itu. Jika Anda membuat peluru baru untuk setiap peluru, alokasi memori konstan akan sangat intensif kinerja. Selain itu, pemulung harus melacak semua contoh ini dan membersihkannya secara berkala yang bahkan lebih lama.

Jika Anda memiliki kumpulan 5.000 peluru dan hanya memperbarui dan berinteraksi dengan yang tidak ada dalam daftar freeObjects, Anda hanya memiliki 5.000 alokasi total tidak peduli berapa lama baku tembak berlangsung alih-alih 1 alokasi per peluru. Juga pengumpul sampah hanya perlu berjalan begitu kemungkinan kebakaran telah berakhir. Berinteraksi dengan memori sangat lambat sehingga ini membuat dampak besar pada kinerja dan memastikan beban kerja terdistribusi secara merata mencegah frame rate gagap.

Klasik
sumber
Jadi saya pikir kelas biliar untuk efek partikel akan sangat penting, apakah saya benar?
mathacka
Ya, itulah tepatnya jenis kolam situasi yang dirancang untuk itu.
ClassicThunder
Apakah praktik yang lebih baik untuk memiliki kumpulan kelas itu benda sendiri atau menggunakan pabrik? Yaitu Object.getObject () vs ObjectFactory.getObject ()