আমি একটি স্পেস এক্সপ্লোরেশন গেম তৈরি করছি এবং আমি বর্তমানে মাধ্যাকর্ষণ নিয়ে কাজ শুরু করেছি (এক্সএনএর সাথে সি # তে)।
মাধ্যাকর্ষণটির এখনও টুইঙ্ক দরকার, তবে আমি এটি করতে পারার আগে, আমার পদার্থবিজ্ঞানের গণনার সাথে কিছু পারফরম্যান্স সম্পর্কিত সমস্যাগুলি সমাধান করা দরকার।
এটি 100 টি অবজেক্ট ব্যবহার করছে, সাধারণত কোনও পদার্থবিজ্ঞানের গণনা ছাড়াই তাদের 1000 রেন্ডারিং 300 টি এফপিএসের (যা আমার এফপিএস ক্যাপ) এর চেয়ে ভাল হয়ে যায় তবে 10 বা এর বেশি কোনও বস্তু গেমটি (এবং এটিতে যে একক থ্রেডটি চালিত হয়) এনে দেয় হাঁটু যখন পদার্থবিজ্ঞানের গণনা করা।
আমি আমার থ্রেডের ব্যবহার পরীক্ষা করেছিলাম এবং প্রথম থ্রেডটি সমস্ত কাজ থেকে নিজেকে মেরে ফেলছে, তাই আমি বুঝতে পেরেছিলাম যে অন্য থ্রেডে আমার পদার্থবিজ্ঞানের গণনা করা দরকার। তবে আমি যখন গ্রাভিটি.সি. ক্লাসের আপডেট পদ্ধতিটি অন্য থ্রেডে চালানোর চেষ্টা করি, যদিও গ্র্যাভিটির আপডেট পদ্ধতিতে এর কিছু না থাকলেও গেমটি এখনও 2 এফপিএসের নিচে রয়েছে।
Gravity.cs
public void Update()
{
foreach (KeyValuePair<string, Entity> e in entityEngine.Entities)
{
Vector2 Force = new Vector2();
foreach (KeyValuePair<string, Entity> e2 in entityEngine.Entities)
{
if (e2.Key != e.Key)
{
float distance = Vector2.Distance(entityEngine.Entities[e.Key].Position, entityEngine.Entities[e2.Key].Position);
if (distance > (entityEngine.Entities[e.Key].Texture.Width / 2 + entityEngine.Entities[e2.Key].Texture.Width / 2))
{
double angle = Math.Atan2(entityEngine.Entities[e2.Key].Position.Y - entityEngine.Entities[e.Key].Position.Y, entityEngine.Entities[e2.Key].Position.X - entityEngine.Entities[e.Key].Position.X);
float mult = 0.1f *
(entityEngine.Entities[e.Key].Mass * entityEngine.Entities[e2.Key].Mass) / distance * distance;
Vector2 VecForce = new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle));
VecForce.Normalize();
Force = Vector2.Add(Force, VecForce * mult);
}
}
}
entityEngine.Entities[e.Key].Position += Force;
}
}
হ্যাঁ আমি জানি. এটি নেস্টেড ফোরচ লুপ, তবে মহাকর্ষ গণনা আর কীভাবে করা যায় আমি জানি না, এবং এটি কাজ করে বলে মনে হচ্ছে, এটি এতটা নিবিড় যে এটির নিজের থ্রেডের প্রয়োজন। (এমনকি যদি কেউ এই গণনাগুলি করার জন্য একটি দুর্দান্ত দক্ষ উপায় জানেন তবে আমি কীভাবে এটির পরিবর্তে একাধিক থ্রেডে এটি করতে পারি তা জানতে চাই)
অ্যান্টিইঙ্গাইন.সি (গ্রাভিটি.সি এর একটি উদাহরণ পরিচালনা করে)
public class EntityEngine
{
public Dictionary<string, Entity> Entities = new Dictionary<string, Entity>();
public Gravity gravity;
private Thread T;
public EntityEngine()
{
gravity = new Gravity(this);
}
public void Update()
{
foreach (KeyValuePair<string, Entity> e in Entities)
{
Entities[e.Key].Update();
}
T = new Thread(new ThreadStart(gravity.Update));
T.IsBackground = true;
T.Start();
}
}
এন্টিইঙ্গাইন গেম 1 সিএস-এ তৈরি করা হয়েছে এবং এর আপডেট () পদ্ধতিটি গেম 1 সিএসের মধ্যে ডাকা হয়।
প্রতিবার গেম আপডেট হওয়ার সাথে সাথে পৃথক থ্রেডে চালানোর জন্য আমার গ্রাভিটি.সি.তে আমার পদার্থবিজ্ঞানের গণনা প্রয়োজন, যাতে গণনাটি গেমটি ভয়াবহভাবে কম (0-2) এফপিএসে নামিয়ে না দেয়।
আমি এই থ্রেডিংয়ের কাজটি করা সম্পর্কে কীভাবে যাব? (উন্নত প্ল্যানেটরি গ্র্যাভিটি সিস্টেমের জন্য যে কোনও পরামর্শই যদি কারও কাছে থাকে তবে তা স্বাগত জানানো হবে)
আমি থ্রেডিং কেন ব্যবহার করব না বা এটি ভুলভাবে ব্যবহারের বিপদগুলি নিয়েও আমি কোনও পাঠ খুঁজছি না, আমি কীভাবে এটি করব তার একটি সরল উত্তর খুঁজছি। আমি ইতিমধ্যে এই প্রশ্নটি গুগল করতে এক ঘন্টা ব্যয় করেছি খুব কম ফলাফলের সাথে যা আমি বুঝতে পেরেছি বা সহায়ক হয়েছিল। আমি অভদ্রতা থেকে আসা বোঝাতে চাইছি না, তবে একটি প্রোগ্রামিং নুব হিসাবে একটি সরল অর্থপূর্ণ উত্তর পেতে সর্বদা শক্ত বলে মনে হয়, আমি সাধারণত এর চেয়ে জটিল উত্তর পাই তবে আমি আমার সমস্যাটি বুঝতে পারলে খুব সহজেই সমাধান করতে পারতাম, বা কেউ বলছেন যে আমি যা করতে চাইছি তা করা উচিত নয় এবং কোনও বিকল্প প্রস্তাব না দেওয়া (যা সহায়ক)।
সাহায্যের জন্য আপনাকে ধন্যবাদ!
সম্পাদনা : আমি যে উত্তরগুলি পেয়েছি তা পড়ার পরে, আমি দেখতে পাচ্ছি যে আপনি ছেলেরা আসলে যত্নবান এবং কেবল কোনও উত্তর কার্যকর করতে পারে যা কার্যকর হতে পারে না। আমি একটি পাথর দিয়ে দুটি পাখি মেরে ফেলতে চেয়েছিলাম (পারফরম্যান্সে উন্নতি এবং মাল্টথ্রেডিংয়ের কিছু বেসিক শিখতে), তবে এটি বেশিরভাগ ইস্যুটি আমার গণনাতে নিহিত এবং থ্রেডিং পারফরম্যান্স বৃদ্ধির তুলনায় বেশি ঝামেলা। আপনাকে সকলকে ধন্যবাদ, আমি আপনার উত্তরগুলি আবার পড়ব এবং স্কুলটি শেষ করার পরে আপনার সমাধানগুলি চেষ্টা করব, আবারও ধন্যবাদ!
k
পান তবে এই O(n^2)
সমস্যার সমাধান অনেকটা কমে যাবে ।
sin² + cos² ≡ 1
এটি ইতিমধ্যে স্বাভাবিক হয়ে গেছে! আপনি কেবল আসল ভেক্টরটি ব্যবহার করতে পারতেন যা আপনার আগ্রহী দুটি বিষয়কে সংযুক্ত করে এবং এটিকে স্বাভাবিক করে তুলেছে। কোন ট্রিগ কল প্রয়োজন নেই।