আমি বিভিন্ন আকারের এবং গতিবেগের একগুচ্ছ বস্তু পেয়েছি যা একে অপরের দিকে আকৃষ্ট হয়। প্রতিটি আপডেটে, আমাকে প্রতিটি বস্তুর উপর দিয়ে যেতে হবে এবং প্রতিটি অন্যান্য বস্তুর মাধ্যাকর্ষণজনিত কারণে শক্তি যোগ করতে হবে। এটি খুব ভাল স্কেল করে না, আমি আমার খেলায় যে দুটি বড় বাধা পেয়েছি তার মধ্যে একটি, এবং আমি পারফরম্যান্সের উন্নতি করতে কী করব তা নিশ্চিত নই।
এটা তোলে মতানুযায়ী মত পারফরম্যান্সের উন্নতি করতে সক্ষম হওয়া উচিত। যে কোনও সময়, সম্ভবত সিস্টেমে 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 এর কাছাকাছি শ্বাসরোধ করতে শুরু করে।
আমি কীভাবে এটি উন্নতি করতে পারি সে সম্পর্কে কোনও চিন্তাভাবনা? কিছু তাত্ত্বিক আমি লুপ দৈর্ঘ্য কয়েকশ থেকে নিচে শেভ করতে ব্যবহার করতে পারি? কিছু কোড আমি প্রতিটি আপডেটের চেয়ে কম প্রায়ই সম্পাদন করতে পারি? শালীন আকারের বিশ্বের জন্য এটি পর্যাপ্ত দ্রুত না হওয়া পর্যন্ত আমার কেবল এটি মাল্টিথ্রেড করা উচিত? আমার কি জিপিইউতে গতিবেগের গণনাগুলি অফলোড করার চেষ্টা করা উচিত? যদি তাই হয়, আমি কিভাবে এটি স্থপতি হবে? আমি কি জিপিইউতে স্থির, ভাগ করা ডেটা রাখতে পারি? আমি কি জিপিইউতে এইচএলএসএল ফাংশন তৈরি করতে পারি এবং তাদেরকে নির্বিচারে (এক্সএনএ ব্যবহার করে) কল করতে পারি বা তাদের কি ড্র প্রক্রিয়ার অংশ হতে হবে?
G * m1 * m2 / r^2
যেখানে জি কেবল আচরণটি সামলানোর জন্য। (যদিও আমি তাদের কেবল একটি পথ অনুসরণ করতে পারি না, কারণ ব্যবহারকারী সিস্টেমটি বিঘ্নিত করতে পারে)