মাধ্যাকর্ষণ গণনা অপ্টিমাইজ করা


23

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

এটা তোলে মতানুযায়ী মত পারফরম্যান্সের উন্নতি করতে সক্ষম হওয়া উচিত। যে কোনও সময়, সম্ভবত সিস্টেমে 99% অবজেক্টের কেবল কোনও বস্তুর উপর একটি নগণ্য প্রভাব থাকবে। আমি অবশ্যই বস্তুটিকে ভর দিয়ে বাছাই করতে পারি না এবং কেবল শীর্ষ 10 টি বৃহত্তর অবজেক্ট বা কিছু বিবেচনা করতে পারি না, কারণ ভর ভরয়ের চেয়ে দূরত্বের চেয়ে বেশি পরিবর্তিত হয় (সমীকরণটি রেখার সাথে থাকে force = mass1 * mass2 / distance^2)) আমি মনে করি যে পৃথিবীর অন্যদিকে শৈলীর শত শত ছোট ছোট টুকরো যা সম্ভবত কোনও কিছুই প্রভাবিত করতে পারে না - এটিকে উপেক্ষা করে বৃহত্তম অবজেক্টস এবং নিকটস্থ বস্তুগুলি বিবেচনা করে একটি ভাল অনুমান করা হবে - তবে কোন বস্তুগুলি তা খুঁজে বের করার জন্য নিকটতম আমাকে সমস্ত বস্তুর উপরে পুনরাবৃত্তি করতে হবে এবং তাদের অবস্থান ক্রমাগত পরিবর্তিত হচ্ছে, সুতরাং আমি ঠিক একবারে এটি করতে পারি এমন নয়।

বর্তমানে আমি এই জাতীয় কিছু করছি:

private void UpdateBodies(List<GravitatingObject> bodies, GameTime gameTime)
{
    for (int i = 0; i < bodies.Count; i++)
    {
        bodies[i].Update(i);
    }
}

//...

public virtual void Update(int systemIndex)
{
    for (int i = systemIndex + 1; i < system.MassiveBodies.Count; i++)
    {
        GravitatingObject body = system.MassiveBodies[i];

        Vector2 force = Gravity.ForceUnderGravity(body, this);
        ForceOfGravity += force;
        body.ForceOfGravity += -force;
    }

    Vector2 acceleration = Motion.Acceleration(ForceOfGravity, Mass);
    ForceOfGravity = Vector2.Zero;

    Velocity += Motion.Velocity(acceleration, elapsedTime);
    Position += Motion.Position(Velocity, elapsedTime);
}

(মনে রাখবেন যে আমি প্রচুর কোড সরিয়ে ফেলেছি - উদাহরণস্বরূপ সংঘর্ষের পরীক্ষাগুলি, সংঘর্ষগুলি সনাক্ত করার জন্য আমি দ্বিতীয়বারের মতো বস্তুর উপরে পুনরাবৃত্তি করি না)।

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

Gravity.ForceUnderGravity(...)এবং Motion.Velocity(...), ইত্যাদি ফাংশন শুধু XNA'S ভেক্টর গণিত সালে নির্মিত একটি বিট ব্যবহার করুন।

দুটি বস্তু সংঘর্ষে এলে তারা ভরবিহীন ধ্বংসাবশেষ তৈরি করে। এটি একটি পৃথক তালিকায় রাখা হয়েছে এবং বিশাল গতিপথগুলি তার বেগ গণনার অংশ হিসাবে ধ্বংসাবশেষের উপরে পুনরাবৃত্তি করে না, তবে ধ্বংসাবশেষের প্রতিটি টুকরা অবশ্যই বিশাল কণার উপর দিয়ে পুনরাবৃত্তি করতে হবে।

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

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


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

আপনার কতটা সঠিক সিমুলেশন দরকার? আপনার কি একে অপরের দিকে ত্বরান্বিত করার সমস্ত কি সত্যই দরকার? এবং আপনার কি সত্যিকারের মাধ্যাকর্ষণ হিসাব ব্যবহার করা দরকার? বা আপনি যে সম্মেলনগুলি সম্পাদন করার চেষ্টা করছেন তার জন্য আপনি কি এই সম্মেলনগুলি থেকে বিদায় নিতে পারেন?
বিশৃঙ্খল প্রযুক্তিবিদ

@ ড্রাকির আমি মনে করি আপনি ঠিক বলেছেন তারা বিচ্ছিন্ন হওয়ার একটি কারণ হ'ল গণহীন বস্তুগুলির জন্য গণিতটি পৃথক, এবং অংশটি কারণ তারা মূলত মাধ্যাকর্ষণকে মোটেই মানেনি, সুতরাং এগুলি অন্তর্ভুক্ত না করা আরও দক্ষ more সুতরাং এটি অনুসন্ধানযোগ্য
কারসন ময়র্স

@ চাওসটেকনিশিয়ান এটি খুব নির্ভুল হতে হবে না - আসলে যদি এটি কেবল কয়েকটি সবচেয়ে প্রভাবশালী বাহিনীর জন্য অ্যাকাউন্টিং হয় তবে একটি সিস্টেম আরও স্থিতিশীল হবে, যা আদর্শ। তবে এটি কার্যকরভাবে কার্যকর হতে পারে যেগুলির মধ্যে আমি কোন বাহিনীগুলির মধ্যে সবচেয়ে প্রভাবশালী finding এছাড়াও মহাকর্ষ গণনা ইতিমধ্যে আনুমানিক, এটি ঠিক G * m1 * m2 / r^2যেখানে জি কেবল আচরণটি সামলানোর জন্য। (যদিও আমি তাদের কেবল একটি পথ অনুসরণ করতে পারি না, কারণ ব্যবহারকারী সিস্টেমটি বিঘ্নিত করতে পারে)
কারসন মায়ার্স

ভর বিহীন যদি প্রতিটি ধ্বংসাবশেষ বৃহত কণা পুনরুক্তি করতে হবে? দুর্ঘটনায়?
সাম होচেভার

উত্তর:


26

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

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

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

খেলা বিশ্বের খুব বড় হয়, তাহলে আপনি এমনকি একটি ব্যবহার করতে পারে হায়ারারকিকাল গ্রিড, একটি quadtree (2D) অথবা octree (3D) -এর মত, এবং similiar নীতির প্রয়োগ করুন। দীর্ঘ-দূরত্বের মিথস্ক্রিয়া হায়ারার্কির উচ্চ স্তরের সাথে সামঞ্জস্য করবে।


1
গ্রিড আইডিয়া জন্য +1। আমি গ্রিডের জন্য ভর কেন্দ্রে ট্র্যাক করার পাশাপাশি গণনাগুলিকে আরও কিছুটা খাঁটি রাখার পরামর্শ দিচ্ছি (যদি প্রয়োজন হয়)।
বিশৃঙ্খলাবিদ

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

8
এই মূলত বার্নস-হাট আলগোরিদিম en.wikipedia.org/wiki/Barnes -Hut_simulation
রাসেল Borogove

এমনকি মহাকর্ষ কীভাবে পদার্থবিজ্ঞানে কাজ করার কথা বলে তারও অনুরূপ মনে হয় - স্থান-সময়ের মোড়।
Zan Lynx

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

16

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

পরিদর্শন http://mathandcode.com/programs/javagrav/ এবং প্রেস "শুরু" এবং "প্রদর্শনী quadtree"।

বিকল্প ট্যাবে আপনি দেখতে পারেন যে কণার সংখ্যা 200,000 পর্যন্ত যেতে পারে। আমার কম্পিউটারে, গণনাটি প্রায় 2 সেকেন্ডের মধ্যে শেষ হয় (200,000 বিন্দুর অঙ্কনটি প্রায় 1 সেকেন্ড সময় নেয় তবে গণনাটি একটি পৃথক থ্রেডে চালিত হয়)।

আমার অ্যাপলেট কীভাবে কাজ করে তা এখানে:

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

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

এটি আরও দেখুন: http://www.youtube.com/watch?v=XAlzniN6L94 এর বৃহত রেন্ডারিংয়ের জন্য


প্রথম লিঙ্কটি মারা গেছে। অ্যাপলেটটি অন্য কোথাও হোস্ট করা আছে?
আনকো

1
সংশোধন করা হয়েছে! দুঃখিত, সেই ডোমেইনে ভাড়া দিতে ভুলে গিয়েছিলেন এবং কেউ এটি স্বয়ংক্রিয়ভাবে কিনেছেন

এবং আমার যুক্ত করা উচিত: আমার কাছে সোর্স কোড নেই। আপনি যদি কোনও উত্স কোড সন্ধান করছেন তবে পার্ট-এনডি পরীক্ষা করুন (সি-তে লিখিত)। আমি নিশ্চিত যে সেখানে অন্যরাও আছেন।

3

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

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

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


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

1
শেষ আপডেটের পরে কত সময়-স্লাইস বাদ দেওয়া হয়েছে তাতে প্রয়োগকৃত বাহিনীকে গুণতে ভুলবেন না।
Zan Lynx

@ সানমিডমিটেক: আপনি কি আরও কিছুটা মাধ্যাকর্ষণ ক্ষেত্রের টেক্সচারটি ব্যাখ্যা করতে পারবেন? আমি দুঃখিত, আমি কোনও গ্রাফিক্স প্রোগ্রামার নই, তবে এটি সত্যিই আকর্ষণীয় বলে মনে হচ্ছে; এটি ঠিক কীভাবে কাজ করার কথা তা আমি বুঝতে পারি না। এবং / অথবা সম্ভবত আপনার কৌশলটির বর্ণনার কোনও লিঙ্ক আছে?
ফেলিক্স ডমব্যাক

@ ফেলিক্সডোমবাক: প্রভাবের ক্ষেত্রের প্রতিনিধিত্বকারী বৃত্ত হিসাবে আপনার অবজেক্টগুলিকে রেন্ডার করুন। ফ্রেগমেন্ট শেডার বস্তুর কেন্দ্রস্থলে এবং যথাযথ প্রস্থের সাথে (কেন্দ্রের ও বস্তুর ভর দিয়ে দূরত্বের ভিত্তিতে) একটি ভেক্টর লেখেন। হার্ডওয়্যার মিশ্রণ অ্যাডিটিভ মোডে এই ভেক্টরগুলির যোগফল পরিচালনা করতে পারে। ফলাফলটি সঠিক মাধ্যাকর্ষণ ক্ষেত্রগুলি হবে না, তবে একটি গেমের প্রয়োজনের জন্য প্রায় অবশ্যই যথেষ্ট ভাল হবে। জিপিইউ ব্যবহারের মতো আরও একটি পদ্ধতি হিসাবে, এই সিইডিডিএ-ভিত্তিক এন-বডি গ্রাভিটি সিমুলেশন কৌশলটি দেখুন: http.developer.nvidia.com/GPUGems3/gpugems3_ch31.html
শন

3

আমি একটি কোয়াড ট্রি ব্যবহার করার পরামর্শ দেব। তারা আপনাকে দ্রুত এবং দক্ষতার সাথে একটি স্বেচ্ছাসেবী আয়তক্ষেত্রাকার অঞ্চলে সমস্ত বিষয় সন্ধান করার অনুমতি দেয়। তাদের সম্পর্কে উইকি নিবন্ধটি এখানে: http://en.wikedia.org/wiki/Quadtree

এবং সোর্সফোর্সে আমার নিজস্ব এক্সএনএ কোয়াড ট্রি প্রকল্পের একটি নির্লজ্জ লিঙ্ক: http://sourceforge.net/projects/quadtree/

আমি সমস্ত বৃহত অবজেক্টের একটি তালিকা বজায় রাখব যাতে তারা দূরত্ব নির্বিশেষে সমস্ত কিছুতে ইন্টারঅ্যাক্ট করতে পারে।


0

মাত্র একটি সামান্য বিট (সম্ভবত নিষ্পাপ) ইনপুট। আমি গেম প্রোগ্রামিং করি না, তবে আমি যা অনুভব করছি তা হ'ল আপনার মৌলিক বাধা হ'ল মাধ্যাকর্ষণ-কারণে-মহাকর্ষ গণনা। প্রতিটি বস্তু এক্স এর উপর পুনরাবৃত্তি এবং তারপরে প্রতিটি বস্তু Y এর মধ্য দিয়ে মহাকর্ষীয় প্রভাব সন্ধান করে এটি যুক্ত করার পরিবর্তে আপনি প্রতিটি জোড়া এক্স, ওয়াই করে নিতে পারেন এবং এর মধ্যে বলটি খুঁজে পেতে পারেন। এটি হে (এন ^ 2) থেকে মাধ্যাকর্ষণ গণনার সংখ্যাটি কাটা উচিত। তারপরে আপনি প্রচুর সংযোজন করবেন (O (n ^ 2)), তবে এটি সাধারণত কম ব্যয়বহুল।

এছাড়াও এই মুহুর্তে আপনি "যদি মাধ্যাকর্ষণ শক্তি \ এপসিলনের চেয়ে কম হবে কারণ এই দেহগুলি খুব ছোট, বলটিকে শূন্যে সেট করুন" এর মতো নিয়মগুলি প্রয়োগ করতে পারেন। অন্যান্য কাঠামোর জন্যও এই কাঠামোটি পাওয়া সুবিধাজনক হতে পারে (সংঘর্ষ সনাক্তকরণ সহ)।


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

0

সানমিডলিডচের উত্তর প্রসারিত করার সময়, আমি ভেবেছিলাম মহাকর্ষ ক্ষেত্রের ধারণার উপর আমি কিছুটা হালকা (বিড়ম্বনা?) ফেলতে পারি।

প্রথমত, এটিকে টেক্সচার হিসাবে ভাবেন না, তবে মানগুলির একটি পৃথক ক্ষেত্র যা পরিবর্তিত হতে পারে (দ্বিমাত্রিক অ্যারে, যেমনটি ছিল); এবং সিমুলেশনের পরবর্তী যথার্থতা সেই ক্ষেত্রটির সমাধান হতে পারে।

আপনি যখন ক্ষেত্রের মধ্যে কোনও বস্তু প্রবর্তন করেন, তখন এর মাধ্যাকর্ষণ সম্ভাবনাটি পার্শ্ববর্তী সমস্ত মানের জন্য গণনা করা যেতে পারে; এর ফলে ক্ষেতে একটি মহাকর্ষ ডুবে যায়।

তবে এইগুলির তুলনায় আপনি কতটি গণনা করা উচিত এটি আগেরটির চেয়ে বেশি বা অকার্যকর হওয়ার আগে? সম্ভবত অনেকগুলি নয়, এমনকি 32x32 হ'ল প্রতিটি বস্তুর পুনরাবৃত্তি করার জন্য যথেষ্ট ক্ষেত্র। সুতরাং সম্পূর্ণ প্রক্রিয়াটিকে একাধিক পাসে বিভক্ত করুন; বিবিধ রেজোলিউশন (বা নির্ভুলতা) সহ প্রতিটি।

অর্থাৎ, প্রথম পাসটি 4x4 গ্রিডে উপস্থাপিত অভিকর্ষের গণনা করতে পারে, প্রতিটি ঘরের মান স্থানটিতে 2D স্থানাঙ্কের প্রতিনিধিত্ব করে। একটি হে (এন * 4 * 4) উপ-মোট জটিলতা দেওয়া।

দ্বিতীয় পাসটি আরও সঠিক হতে পারে, একটি 64x64 রেজোলিউশন মাধ্যাকর্ষণ ক্ষেত্র সহ, প্রতিটি ঘরের মান স্থানটিতে 2D স্থানাঙ্কের প্রতিনিধিত্ব করে। তবে জটিলতা খুব বেশি হওয়ায় আপনি আশেপাশের কোষের ব্যাসার্ধকে সীমাবদ্ধ করতে পারেন (সম্ভবত, কেবল আশেপাশের 5x5 কোষ আপডেট করা হয়েছে)।

উচ্চতর নির্ভুলতার গণনার জন্য একটি অতিরিক্ত তৃতীয় পাস ব্যবহার করা যেতে পারে, যার সমাধান হতে পারে 1024x1024। কোনও সময়ে মনে নেই আপনি আসলে 1024x1024 পৃথক গণনা করছেন, তবে কেবলমাত্র এই ক্ষেত্রের অংশে (সম্ভবত 6x6 উপ-বিভাগ) অপারেটিং করছেন।

এইভাবে, আপডেটের জন্য আপনার সামগ্রিক জটিলতা হ'ল (এন * (4 * 4 + 5 * 5 + 6 * 6))।

তারপরে আপনার প্রতিটি বস্তুর গতিবেগের পরিবর্তনগুলি গণনা করতে, প্রতিটি মাধ্যাকর্ষণ ক্ষেত্রের জন্য (4x4, 64x64, 1024x1024) আপনি কেবল গ্রিড কোষে পয়েন্ট জনসাধারণের অবস্থানের মানচিত্র তৈরি করুন, গ্রিড কোষগুলি সামগ্রিক মাধ্যাকর্ষণ সম্ভাব্য ভেক্টরটিকে একটি নতুন ভেক্টরে প্রয়োগ করুন; প্রতিটি "স্তর" বা "পাস" এর জন্য পুনরাবৃত্তি করুন; তারপরে এগুলি যুক্ত করুন। এটি আপনাকে একটি ভাল ফলাফল মাধ্যাকর্ষণ শক্তি ভেক্টর দেয়।

সুতরাং সামগ্রিক জটিলতা হ'ল: ও (এন * (4 * 4 + 5 * 5 + 6 * 6) + এন)। গুরুতর ক্ষেত্রগুলির সামগ্রিক রেজোলিউশন নয়, পাসগুলিতে মহাকর্ষীয় সম্ভাবনার গণনা করার সময় আপনি কতগুলি আশেপাশের সেল আপডেট করেন তা জটিলতার জন্য (জটিলতার জন্য) গণনা করা হয়।

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

আমি আশা করি এই বোধগম্যতা।


0

অন্য পদ্ধতি সম্পর্কে কীভাবে:

তাদের ভরগুলির উপর ভিত্তি করে অবজেক্টগুলিকে প্রভাবের ক্ষেত্র বরাদ্দ করুন - তারা এই পরিসীমা ছাড়িয়ে পরিমাপযোগ্য প্রভাব ফেলতে খুব ছোট।

এখন আপনার বিশ্বকে একটি গ্রিডে বিভক্ত করুন এবং প্রতিটি বস্তুকে যে সমস্ত কক্ষের প্রভাব রয়েছে তার একটি তালিকায় রাখুন।

কেবলমাত্র কোনও বস্তু যে ঘরে রয়েছে তার সাথে সংযুক্ত তালিকার কেবলমাত্র বস্তুগুলিতে আপনার মাধ্যাকর্ষণ গণনাগুলি করুন।

আপনাকে কেবল তখনই আপডেটগুলি আপডেট করতে হবে যখন কোনও বস্তু একটি নতুন গ্রিড কক্ষে চলে আসে।

গ্রিডের কক্ষগুলি যত ছোট হবে আপনি আপডেটের জন্য কম গণনা করলেও আপনি আপডেটের তালিকাগুলি আরও বেশি কাজ করবেন।

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