একই উপাদানটির গোষ্ঠীগত সত্তা রৈখিক মেমরিতে সেট করা


12

আমরা বেসিক সিস্টেম-উপাদান-সত্তা পদ্ধতির থেকে শুরু করি ।

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

তারপরে আমরা তাদের প্রত্যেকের জন্য অ্যাসেমব্লেজ উল্লেখ করে সত্ত্বা তৈরি করি। একবার যখন আমরা সত্তাটি তৈরি করি, এর সমাবেশটি স্থায়ী হয় যার অর্থ আমরা এটি সরাসরি জায়গায় পরিবর্তন করতে পারি না, তবুও আমরা বিদ্যমান সত্তার স্বাক্ষর একটি স্থানীয় অনুলিপিতে (সামগ্রী সহ) পেতে পারি, এতে যথাযথ পরিবর্তন করতে পারি এবং একটি নতুন সত্তা তৈরি করতে পারি means এটা।

এখন মূল ধারণার জন্য: যখনই কোনও সত্তা তৈরি করা হয়, তখন এটি এসেম্ব্লেজ বালতি নামে একটি বস্তুকে বরাদ্দ করা হয় , যার অর্থ একই স্বাক্ষরের সমস্ত সত্তা একই ধারক (যেমন স্টাড :: ভেক্টর) এ থাকবে।

এখন সিস্টেমগুলি কেবল তাদের আগ্রহের প্রতিটি বালতিতে পুনরাবৃত্তি করে এবং তাদের কাজ করে।

এই পদ্ধতির কিছু সুবিধা রয়েছে:

  • উপাদানগুলি কয়েকটিতে সংরক্ষণ করা হয় (অবিকল: বালতির সংখ্যা) সামঞ্জস্যপূর্ণ মেমরি খণ্ড - এটি মেমরি বন্ধুত্বের উন্নতি করে এবং পুরো গেমের স্থিতি ছড়িয়ে দেওয়া সহজ is
  • সিস্টেমগুলি রৈখিক উপায়ে উপাদানগুলি প্রক্রিয়া করে, যার অর্থ উন্নত ক্যাশে সংহতি - বিদায় বাই অভিধান এবং এলোমেলো মেমরি লাফ দেয়
  • একটি নতুন সত্তা তৈরি করা বালতিতে একটি অ্যাসেমব্লাজ ম্যাপিং এবং প্রয়োজনীয় উপাদানগুলি তার ভেক্টরে ফিরিয়ে দেওয়ার মতোই সহজ
  • কোনও সত্তা মুছে ফেলা স্টাডিতে একটি কল করার মতোই সহজ: মুছে যাওয়াটির সাথে শেষ উপাদানটি অদলবদল করতে সরানো, কারণ এই মুহুর্তে অর্ডার কোনও ব্যাপার নয়

এখানে চিত্র বর্ণনা লিখুন

যদি সম্পূর্ণ আলাদা স্বাক্ষর সহ আমাদের প্রচুর সত্তা থাকে তবে ক্যাশে সুসংহত ধরণের সুবিধা হ্রাস পায় তবে আমি মনে করি না এটি বেশিরভাগ অ্যাপ্লিকেশনগুলিতেই ঘটবে।

একবার ভেক্টরগুলি পুনরায় স্থানান্তরিত হওয়ার পরে পয়েন্টার অবৈধকরণেও সমস্যা রয়েছে - এটি কাঠামো প্রবর্তন করে সমাধান করা যেতে পারে:

struct assemblage_bucket {
    struct entity_watcher {
        assemblage_bucket* owner;
        entity_id real_index_in_vector;
    };

    std::unordered_map<entity_id, std::vector<entity_watcher*>> subscribers;

    //...
};

সুতরাং যখনই আমাদের গেম যুক্তিতে কোনও কারণে আমরা একটি নতুন তৈরি করা সত্তাকে ট্র্যাক করে রাখতে চাই, বালতির ভিতরে আমরা একটি সত্তা_ওয়্যাচারকে নিবন্ধভুক্ত করি এবং সত্তাটি অপসারণের সময় স্ট্যান্ড :: চালিয়ে যেতে হবে, আমরা তার পর্যবেক্ষকদের অনুসন্ধান করব এবং আপডেট করব তাদের real_index_in_vectorনতুন মান। বেশিরভাগ সময় প্রতিটি সত্তা মোছার জন্য এটি কেবল একটি একক অভিধানের জন্য অনুসন্ধান চাপায়।

এই পদ্ধতির আরও কোনও অসুবিধা আছে কি?

বেশ সুস্পষ্ট হওয়া সত্ত্বেও কেন সমাধান কোথাও উল্লেখ করা হয়নি?

সম্পাদনা : মন্তব্যগুলি অপর্যাপ্ত হওয়ায় আমি "উত্তরগুলির উত্তর দিতে" প্রশ্নটি সম্পাদনা করছি।

আপনি প্লাগযোগ্য উপাদানগুলির গতিশীল প্রকৃতি হারাবেন, যা স্থির শ্রেণি নির্মাণ থেকে দূরে সরে যাওয়ার জন্য বিশেষত তৈরি হয়েছিল।

আমি না। সম্ভবত আমি এটি যথেষ্ট পরিষ্কারভাবে ব্যাখ্যা না করলাম:

auto signature = world.get_signature(entity_id); // this would just return entity_id.bucket_owner->bucket_signature or so
signature.add(foo_component);
signature.remove(bar_component);
world.delete_entity(entity_id); // entity_id would hold information about its bucket owner
world.create_entity(signature); // automatically assigns new entity to an existing or a new bucket

এটি কেবল বিদ্যমান সত্তার স্বাক্ষর গ্রহণ, এটি পরিবর্তন করে নতুন সত্তা হিসাবে আবার আপলোড করার মতো সহজ। সাশ্রয়ী, গতিশীল প্রকৃতি ? অবশ্যই. এখানে আমি জোর দিয়ে বলতে চাই যে এখানে কেবল একটি "সমাবেশ" এবং একটি "বালতি" শ্রেণি রয়েছে " বালতিগুলি ডেটাচালিত হয় এবং রানটাইমের সময় একটি অনুকূল পরিমাণে তৈরি হয়।

আপনাকে এমন সমস্ত বালতিতে যেতে হবে যাতে একটি বৈধ লক্ষ্য থাকতে পারে। বাহ্যিক ডেটা কাঠামো না থাকলে সংঘর্ষ সনাক্তকরণও তত সমান কঠিন হতে পারে।

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


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

উত্তর:


7

আপনি মূলত একটি পুল বরাদ্দকারী এবং গতিশীল ক্লাস সহ একটি স্ট্যাটিক অবজেক্ট সিস্টেম ডিজাইন করেছেন।

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

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

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


আমি বলেছিলাম: আমরা সত্তার স্বাক্ষর পরিবর্তন করতে পারি না, এবং আমি বোঝাতে চাইছিলাম যে আমরা এটি সরাসরি জায়গায় স্থানান্তর করতে পারি না, তবে তবুও আমরা কেবলমাত্র স্থানীয় কপির সাথে বিদ্যমান সমাবেশগুলি পেতে পারি, এতে পরিবর্তন করতে পারি এবং নতুন সত্তা হিসাবে আবার আপলোড করতে পারি - এবং এগুলি অপারেশনগুলি বেশ সস্তা, যেমনটি আমি প্রশ্নে দেখিয়েছি। আবারও - এখানে কেবল "বালতি" ক্লাস রয়েছে। "সমাবেশগুলি" / "স্বাক্ষর" / "এর নামটি তবে আমরা চাই" একটি আদর্শ পদ্ধতির মতো রানটাইমে গতিশীলভাবে তৈরি করা যেতে পারে, এমনকি আমি "স্বাক্ষর" হিসাবে কোনও সত্তাকে ভাবতেও যেতে পারি।
প্যাট্রিক সিজাচুরস্কি

এবং আমি বলেছিলাম যে আপনি প্রয়োজনীয়ভাবে পুনঃসংশোধনটি মোকাবেলা করতে চান না। "একটি নতুন সত্তা তৈরি করা" এর অর্থ হ্যান্ডেল সিস্টেম কীভাবে কাজ করে তার উপর নির্ভর করে সত্তার কাছে বিদ্যমান বিদ্যমান হ্যান্ডলগুলি ভাঙার সম্ভাব্য অর্থ হতে পারে। আপনার কল যদি তারা যথেষ্ট সস্তা হয় বা না হয়। আমি এটি মোকাবেলা করতে বাট একটি ব্যথা হতে পারে।
শান মিডলডিচ

ঠিক আছে, এখন আমি এই সম্পর্কে আপনার পয়েন্ট পেয়েছি। যাইহোক আমি মনে করি যে যোগ করা / অপসারণ কিছুটা ব্যয়বহুল হলেও এটি এতটা দৃষ্টিনন্দন হয় যে উপাদানগুলি অ্যাক্সেস করার প্রক্রিয়াটি এখনও সহজসাধ্যভাবে মূল্যবান, যা রিয়েল-টাইমে ঘটে। সুতরাং, "চেঞ্জিং" এর ওভারহেড উপেক্ষিত is আপনার এআই উদাহরণস্বরূপ, এখনও কি এই কয়েকটি সিস্টেমের মূল্য নেই যে যাইহোক একাধিক উপাদানগুলির ডেটা প্রয়োজন?
প্যাট্রিক সিজাচুরস্কি

আমার বক্তব্যটি ছিল এআই এমন এক জায়গা যেখানে আপনার পদ্ধতির চেয়ে ভাল, তবে অন্যান্য উপাদানগুলির ক্ষেত্রে এটি অগত্যা নয়।
শান মিডলডিচ

4

আপনি যা করেছেন তা হ'ল পুনরায় ইঞ্জিনিয়ার করা সি ++ অবজেক্ট। এটি সুস্পষ্ট বোধ করার কারণটি হ'ল আপনি যদি "সত্তা" শব্দটি "শ্রেণি" এবং "উপাদান" এর সাথে "সদস্য" দিয়ে প্রতিস্থাপন করেন তবে এটি মিক্সিন্স ব্যবহার করে একটি আদর্শ ওওপি নকশা।

1) আপনি প্লাগযোগ্য উপাদানগুলির গতিশীল প্রকৃতি হারাবেন, যা স্থির শ্রেণি নির্মাণ থেকে দূরে সরে যাওয়ার জন্য বিশেষভাবে তৈরি করা হয়েছিল।

২) মেমোরি সুসংহততা একটি ডেটা টাইপের মধ্যে সবচেয়ে গুরুত্বপূর্ণ, কোনও বস্তুর মধ্যে একসাথে একাধিক ডেটা টাইপ করে না। ক্লাস + অবজেক্ট মেমরি ফ্র্যাগমেন্টিং থেকে দূরে সরে যাওয়ার জন্য এই উপাদানগুলির একটি কারণ হ'ল উপাদানগুলি তৈরি করা হয়েছিল।

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

4) প্রোগ্রামার হিসাবে ট্র্যাক রাখা যদি খুব সহজ না হয় তবে কোনও উপাদান একটি জটিল অবজেক্টের চেয়ে নিজেকে সিরিয়ালিয়াল করা ঠিক তত সহজ।

5) এই পাথের পরবর্তী যৌক্তিক পদক্ষেপটি হ'ল সিস্টেমগুলি সরানো এবং সেই কোডটি সরাসরি সত্তার মধ্যে রাখা, যেখানে এটির কাজ করার জন্য প্রয়োজনীয় সমস্ত ডেটা রয়েছে। আমরা সকলেই দেখতে পারি যা এর দ্বারা বোঝায় =)


2) হতে পারে আমি সম্পূর্ণরূপে ক্যাচিং বুঝতে পারি না, তবে এর একটি সিস্টেম রয়েছে যা 10 উপাদানগুলির সাথে কাজ করে। একটি স্ট্যান্ডার্ড পদ্ধতির মধ্যে, প্রতিটি সত্তা প্রক্রিয়াকরণের অর্থ 10 বার র‍্যাম অ্যাক্সেস করা উচিত, কারণ পুলগুলি ব্যবহার করা হলেও মেমরির এলোমেলো জায়গায় উপাদান ছড়িয়ে ছিটিয়ে থাকে - কারণ বিভিন্ন উপাদান বিভিন্ন পুলের অন্তর্ভুক্ত। অভিধান সন্ধান না করেও একবারে পুরো সত্তাকে ক্যাশে দেওয়া এবং একক ক্যাশে মিস না করে সমস্ত উপাদানগুলি প্রক্রিয়া করা "গুরুত্বপূর্ণ" হবে না? এছাড়াও, আমি 1) পয়েন্টটি কভার করার জন্য একটি সম্পাদনা করেছি
প্যাট্রিক সিজাচুরস্কি

@ শিয়ান মিডলডিচ তার উত্তরে এই ক্যাচিং ভাঙ্গনের একটি ভাল বর্ণনা দিয়েছেন।
প্যাট্রিক হিউজেস

3) এগুলি কোনও উপায়ে সুসংগত বস্তু নয়। উপাদান সম্পর্কে A মেমোনের অংশ বি এর ঠিক পাশেই থাকা, এটি কেবল "মেমরি কোথেরেন্সি", "যৌক্তিক একাত্মতা" নয়, যেমন জন নির্দেশ করেছেন। বালতিগুলি, তাদের তৈরিতে, এমনকি কোনও পছন্দসই শৃঙ্খলে এবং নীতিগুলি স্বাক্ষরে উপাদানগুলি স্থানান্তরিত করতে পারে still ৪) আমাদের পর্যাপ্ত বিমূর্ততা থাকলে "ট্র্যাক রাখা" সমান সহজ হতে পারে - আমরা যা বলছি তা কেবল একটি স্টোরেজ স্কিম যা পুনরাবৃত্তিকারীদের সরবরাহ করে এবং সম্ভবত একটি বাইট অফসেট মানচিত্র প্রমিতকরণকে স্ট্যান্ডার্ড পদ্ধতির মতো সহজ করে তুলতে পারে।
প্যাট্রিক সিজাচুরস্কি

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

@ প্যাট্রিককজাচুরস্কি তবে আপনার সিস্টেমগুলি 10 টি উপাদান দিয়ে কাজ করে না।
ব্যবহারকারী 253751

3

সত্তার সাথে একত্রে রাখা যেমন আপনার মনে হতে পারে তেমন গুরুত্বপূর্ণ নয়, এ কারণেই "কারণ এটি একটি ইউনিট" ব্যতীত অন্য কোনও বৈধ কারণ সম্পর্কে চিন্তা করা শক্ত। আপনি যেহেতু যুক্তিযুক্ত সংহতির বিপরীতে ক্যাশে সংহতি হিসাবে সত্যই এটি করছেন তাই এটি বোধগম্য হতে পারে।

আপনার এক সমস্যা হতে পারে বিভিন্ন বালতিতে উপাদানগুলির মধ্যে মিথস্ক্রিয়া inte উদাহরণস্বরূপ, আপনার এআই এড়াতে পারে এমন কোনও কিছু খুঁজে পাওয়ার জন্য এটি সোজা এগিয়ে নেই , আপনাকে এমন সমস্ত বালতি দিয়ে যেতে হবে যাতে একটি বৈধ লক্ষ্য থাকতে পারে। বাহ্যিক ডেটা কাঠামো না থাকলে সংঘর্ষ সনাক্তকরণও তত সমান কঠিন হতে পারে।

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


আমাকে স্বীকার করতে হবে আমি আপনার উত্তরটি বেশ বুঝতে পারি না। "যৌক্তিক একাত্মতা" বলতে কী বোঝ? মিথস্ক্রিয়ায় অসুবিধা সম্পর্কে, আমি একটি সম্পাদনা করেছি।
প্যাট্রিক সিজাচুরস্কি

"লজিকাল একাত্মতা", যেমন রয়েছে: এটি একটি ট্রি অস্তিত্ব তৈরির সমস্ত উপাদানকে একত্রে কাছে রাখতে "যৌক্তিক বোধ" তৈরি করে।
জন ম্যাকডোনাল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.