পরিচালিত ভাষায় কণা পুল ব্যবহার করা কি সার্থক?


10

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

তবে যেমনটি আমরা সবাই জানি, প্রতিটি নির্দেশ গেমের পারফরম্যান্সকে আঘাত করতে পারে। উদাহরণস্বরূপ, একটি এমএমওতে ক্লায়েন্টের একটি পুল: ক্লায়েন্টরা খুব দ্রুত পুলটি প্রবেশ করবে না এবং প্রস্থান করবে না। তবে কণাগুলি এক সেকেন্ডে দশগুণ পুনর্নবীকরণ করতে পারে।

প্রশ্নটি হ'ল: পরিচালিত ভাষায় কণাগুলির জন্য বিশেষভাবে (বিশেষত, যাঁরা মরে এবং দ্রুত পুনরায় বিনোদন পান) একটি অবজেক্ট পুল ব্যবহার করা কি উপযুক্ত?

উত্তর:


14

হ্যাঁ, তাই

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

পুলিং সাধারণত পুলের অবজেক্টগুলির জন্য রেফারেন্সের স্থানীয়তার উন্নতি করে, উদাহরণস্বরূপ এগুলি সমস্ত সংলগ্ন অ্যারেতে রেখে। এটি পুলের বিষয়বস্তুগুলি পুনরাবৃত্তি করার সময় (বা তার কমপক্ষে সরাসরি অংশ) কর্মক্ষমতা উন্নত করতে পারে কারণ পুনরাবৃত্তির পরবর্তী বস্তুটি ইতিমধ্যে ডেটা ক্যাশে থাকবে।

আপনার অন্তর্নিহিত গেম লুপগুলিতে যে কোনও বরাদ্দ এড়ানোর চেষ্টা করার প্রচলিত জ্ঞান এখনও পরিচালনা করা ভাষাগুলিতে প্রয়োগ হয় (বিশেষত, উদাহরণস্বরূপ, এক্সএনএ ব্যবহার করার সময় 360)। এর কারণগুলি কেবল কিছুটা আলাদা fer


+1 তবে, স্ট্রাক্টগুলি ব্যবহার করার সময় এটি সার্থক কিনা তা আপনি স্পর্শ করেননি: মূলত এটি হয় না (পুলিং মান ধরণের কোনও কিছুই অর্জন করে না) - পরিবর্তে আপনার সেগুলি পরিচালনা করার জন্য আপনার একক (বা সম্ভাব্য কোনও সেট) অ্যারে থাকা উচিত।
জোনাথন ডিকিনসন

2
ওপি জাভা ব্যবহার করে উল্লিখিত হওয়ার পরে আমি কাঠামোগত জিনিসটিতে স্পর্শ করিনি এবং আমি কীভাবে ভাষাতে মানের ধরণ / কাঠামো পরিচালনা করে তার সাথে তেমন পরিচিত নই।

জাভাতে কোনও স্ট্রাইক নেই, কেবল ক্লাস (সর্বদা গাদা)।
ব্রেন্ডন লং

1

জাভাতে এটি পল অবজেক্টগুলিতে এতটা সহায়ক নয় * যেহেতু আশেপাশের অবজেক্টগুলির জন্য প্রথম জিসি চক্র এগুলিকে স্মৃতিতে রদবদল করবে, এটিকে "ইডেন" স্থানের বাইরে নিয়ে যাবে এবং প্রক্রিয়াটিতে সম্ভাব্য স্থানীয় অবস্থান হারাবে।

  • জটিল সম্পদগুলিকে পুল করার জন্য এটি যে কোনও ভাষাতেই সর্বদা কার্যকর which এগুলি পুলিংয়ের পক্ষে মূল্যবান হতে পারে কারণ তাদের তৈরি এবং ধ্বংস করার ব্যয়টির উত্সটির সাথে থাকা হ্যান্ডেলের সাথে সম্পর্কিত স্মৃতির সাথে প্রায় কোনও সম্পর্ক নেই। তবে কণাগুলি এই বিভাগে ফিট করে না।

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

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

যেহেতু প্রথম জিসি চক্রের পরে অবজেক্টগুলি টুকরো টুকরো হয়ে যেতে পারে, তাই মূলত মেমরি অ্যাক্সেস প্যাটার্নগুলি (রেফারেন্সের স্থানীয়তা) উন্নত করার জন্য এবং বরাদ্দ / ডিএলোকেশন ওভারহেড হ্রাস করার সুবিধার জন্য যখন অবজেক্ট পুলিংয়ের উপকারগুলি মূলত হারিয়ে যায় ... এত বেশি যে আপনি সাধারণত নতুন সময় কণা সমস্ত সময় বরাদ্দ করে রেফারেন্সের আরও ভাল এলাকা পাবেন এবং এডেন স্পেসে এখনও তারা সতেজ থাকাকালীন এবং তারা "পুরানো" হওয়ার আগে এবং সম্ভাব্য স্মৃতিতে ছড়িয়ে ছিটিয়ে থাকার আগে তাদের ব্যবহার করবেন। যাইহোক, যা জাভাতে সি প্রতিদ্বন্দ্বী পারফরম্যান্স পাওয়ার পক্ষে চূড়ান্ত সহায়ক হতে পারে তা হ'ল আপনার কণাগুলির জন্য অবজেক্টগুলি ব্যবহার করা এবং সমতল পুরাতন আদিম ডেটা পুল করা। এর পরিবর্তে একটি সাধারণ উদাহরণের জন্য:

class Particle
{
    public float x;
    public float y;
    public boolean alive;
}

এর মতো কিছু করুন:

class Particles
{
    // X positions of all particles. Resize on demand using
    // 'java.util.Arrays.copyOf'. We do not use an ArrayList
    // since we want to work directly with contiguously arranged
    // primitive types for optimal memory access patterns instead 
    // of objects managed by GC.
    public float x[];

    // Y positions of all particles.
    public float y[];

    // Alive/dead status of all particles.
    public bool alive[];
}

এখন বিদ্যমান কণাগুলির জন্য স্মৃতি পুনরায় ব্যবহার করতে, আপনি এটি করতে পারেন:

class Particles
{
    // X positions of all particles.
    public float x[];

    // Y positions of all particles.
    public float y[];

    // Alive/dead status of all particles.
    public bool alive[];

    // Next free position of all particles.
    public int next_free[];

    // Index to first free particle available to reclaim
    // for insertion. A value of -1 means the list is empty.
    public int first_free;
}

এখন যখন nthকণা মরে যায়, তবে পুনঃব্যবহৃত করার অনুমতি, তাই মত মুক্ত লিস্টে ধাক্কা:

alive[n] = false;
next_free[n] = first_free;
first_free = n;

নতুন কণা যুক্ত করার সময়, বিনামূল্যে তালিকা থেকে আপনি কোনও সূচক পপ করতে পারেন কিনা তা দেখুন:

if (first_free != -1)
{
     int index = first_free;

     // Pop the particle from the free list.
     first_free = next_free[first_free];

     // Overwrite the particle data:
     x[index] = px;
     y[index] = py;
     alive[index] = true;
     next_free[index] = -1;
}
else
{
     // If there are no particles in the free list
     // to overwrite, add new particle data to the arrays,
     // resizing them if needed.
}

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

কোডটির সাথে কাজ করা আরও সহজ করার জন্য, এটি আপনার নিজের বেসিক রিজেজেবল পাত্রে লেখার মতো হতে পারে যা ফ্লোটের অ্যারে, পূর্ণসংখ্যার অ্যারে এবং বুলিয়ানগুলির অ্যারে সঞ্চয় করে store আবার আপনি জেনেরিকগুলি এবং ArrayListএখানে ব্যবহার করতে পারবেন না (অন্তত শেষ বার যাচাই করার সময় থেকে) যেহেতু এর জন্য GC- পরিচালিত অবজেক্টগুলির প্রয়োজন, আদিম ডেটা নয়। আমরা সামঞ্জস্যপূর্ণ অ্যারে ব্যবহার করতে চাই int, যেমন, জিসি-পরিচালিত অ্যারেগুলি Integerনয় যা ইডেন স্পেস ছেড়ে যাওয়ার পরে অগত্যা সংগত হবে না।

আদিম ধরণের অ্যারেগুলির সাথে, এগুলি সর্বদা সংলগ্ন হওয়ার গ্যারান্টিযুক্ত এবং তাই আপনি উল্লেখের অত্যন্ত আকাঙ্ক্ষিত লোকাল পান (ক্রমিক কণা প্রক্রিয়াজাতকরণের জন্য এটি একটি পার্থক্যের সৃষ্টি করে) এবং অবজেক্ট পুলিংয়ের যে সমস্ত সুযোগসুবিধাগুলি সরবরাহ করার উদ্দেশ্যে করা হয় সেগুলি পাওয়া যায়। অবজেক্টগুলির একটি অ্যারে সহ এটি কিছুটা পয়েন্টারের অ্যারের সাথে সামঞ্জস্যপূর্ণ যা আপনি ইডেন স্পেসে একবারে সমস্ত বরাদ্দ করে ধরে নিলেন, তবে একটি জিসি চক্রের পরে, সমস্ত দিকে ইশারা দেওয়া যেতে পারে এমন এক ধরণের ফ্যাশনে বস্তুগুলিকে নির্দেশ করা শুরু করে start স্মৃতিতে রাখুন।


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