কখন এবং কেন একটি পুল শ্রেণীর অবজেক্টগুলি ধরে রাখতে হবে?


12

আমি ওপেনগল এসটি অধ্যয়ন করছি এবং আমি দেখেছি যে উদাহরণটি স্পর্শ এবং কীবোর্ডের ইভেন্টগুলির উপর নজর রাখতে "পুল" শ্রেণিটি ব্যবহার করা হয়েছিল।

কেউ দয়া করে ব্যাখ্যা করতে পারেন যে কীভাবে এবং কেন একটি পুল শ্রেণীর প্রয়োজন। আমি যা পড়ছিলাম তা থেকে এটি আবর্জনা সংগ্রহ এবং তৈরি হওয়া ইনপুট শ্রেণীর সংখ্যা সীমিত করার সাথে কিছু করার ছিল।

এগুলি আমার কাছে কিছুটা বিমূর্ত বলে মনে হচ্ছে, তাই যদি কেউ দয়া করে যা চলছে তা ব্যাখ্যা করতে পারে, আমি এটির প্রশংসা করব, আমি এখানে কিছু কোড পেস্ট করেছি:

    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

পুলগুলি ব্যবহৃত হয় যখন বস্তুর সংখ্যা নাটকীয়ভাবে ওঠানামা করে এবং মেমরি বরাদ্দ এবং আবর্জনা সংগ্রহের পরিমাণ হ্রাস করতে ব্যবহৃত হয়।

একটি পুল ব্যবহার করে স্ট্যান্ডার্ড নতুন অবজেক্ট () যা নতুন মেমরি বরাদ্দ করে তা পুল থেকে ইতিমধ্যে বরাদ্দকৃত বস্তুটি টানিয়ে প্রতিস্থাপন করা হয়। আপনি যদিও যান এবং পুরানো অবজেক্টের প্রতিটি ভেরিয়েবল একটি ডিফল্টে পুনরায় সেট করুন এমনকি এটি আরও দ্রুত।

আপনি যদি প্রতিটি সময় নতুন আইটেম তৈরি করেন তবে প্রতিটি বস্তুর জন্য মেমরি বরাদ্দ করতে হবে। এছাড়াও আপনি এতগুলি অবজেক্ট তৈরি করছেন বলে আপনাকে অবশ্যই সেগুলি প্রায়শই পরিষ্কার করতে হবে যার কারণে আবর্জনা সংগ্রহকারী খুব বেশি সময় ক্ষতিগ্রস্থ হয়ে যায়।

একটি সাধারণ উদাহরণ গুলি।

কোনও এফপিএসের জন্য স্ক্রিনে 0 টি বুলেট থাকতে পারে তার পরের দ্বিতীয়টি 1000 এবং তারপরে 0 আবার দ্বিতীয়। আপনি যদি প্রত্যেকের জন্য একটি নতুন বুলেট তৈরি করেন তবে ধ্রুবক মেমরির বরাদ্দ চূড়ান্ত কার্যকারিতা হতে পারে। এছাড়াও আবর্জনা সংগ্রহকারীকে এই সমস্ত দৃষ্টান্ত ট্র্যাক করতে হবে এবং পর্যায়ক্রমে পরিষ্কার করতে হবে যা আরও বেশি সময় নেয়।

আপনার কাছে 5000 টি বুলেট রয়েছে এবং কেবলমাত্র ফ্রিঅবজেক্টের তালিকায় নেই এমনগুলির সাথে আপডেট এবং ইন্টারঅ্যাক্ট করুন আপনার কাছে কেবল বুলেট প্রতি 1 বরাদ্দের পরিবর্তে দমকলযন্ত্রটি কত দিন স্থায়ী হয় তা বিবেচনা করেই মোট 5000 বরাদ্দ রয়েছে। এছাড়াও আবর্জনা সংগ্রহকারীদের কেবল দমকলের কোনও সম্ভাবনা শেষ হওয়ার পরে চালানো দরকার। মেমরির সাথে যোগাযোগ করা খুব ধীর তাই এটি পারফরম্যান্সের উপর একটি বিরাট প্রভাব ফেলে এবং এটি নিশ্চিত করে যে কাজের চাপ সমানভাবে বিতরণ করা হয়েছে ফ্রেম রেট স্টুটারগুলি প্রতিরোধ করে।


সুতরাং আমি কণা প্রভাব জন্য একটি পুল বর্গ ভেবেছি অত্যন্ত প্রয়োজনীয় হবে, আমি ঠিক?
মাঠচাকা

হ্যাঁ ঠিক সেই ধরণের পরিস্থিতি পুলগুলির জন্য নকশা করা হয়েছিল।
ক্লাসিকথান্ডার

কোনও ক্লাস পুলের নিজস্ব জিনিস বা কারখানা ব্যবহার করা কি আরও ভাল অনুশীলন? Ob অবজেক্ট.জেটঅবজেক্ট () বনাম অবজেক্টফ্যাক্টরি.জেটবজেক্ট ()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.