मैं एक अंतरिक्ष अन्वेषण खेल बना रहा हूं और मैंने वर्तमान में गुरुत्वाकर्षण पर काम करना शुरू कर दिया है (XNA के साथ C # में)।
गुरुत्वाकर्षण को अभी भी ट्विकिंग की आवश्यकता है, लेकिन इससे पहले कि मैं ऐसा कर सकता हूं, मुझे अपनी भौतिकी गणना के साथ कुछ प्रदर्शन मुद्दों को संबोधित करने की आवश्यकता है।
यह 100 वस्तुओं का उपयोग कर रहा है, आम तौर पर उनमें से 1000 का प्रतिपादन बिना किसी भौतिकी गणना के 300 एफपीएस (जो कि मेरी एफपीएस कैप है) से अधिक हो जाता है, लेकिन 10 या अधिक वस्तुओं में से कोई भी खेल लाता है (और जिस एकल धागे पर यह चलता है) भौतिकी की गणना करते समय घुटने।
मैंने अपने थ्रेड उपयोग की जाँच की और पहला थ्रेड सभी काम से खुद को मार रहा था, इसलिए मुझे लगा कि मुझे दूसरे थ्रेड पर भौतिकी गणना करने की आवश्यकता है। हालाँकि जब मैं Gravity.cs क्लास के अपडेट मेथड को दूसरे थ्रेड पर चलाने की कोशिश करता हूं, भले ही ग्रेविटी के अपडेट मेथड में कुछ भी न हो, फिर भी गेम 2 FPS तक डाउन रहता है।
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;
}
}
हाँ मुझे पता है। यह एक नेस्टेड फॉरेस्ट लूप है, लेकिन मुझे नहीं पता कि गुरुत्वाकर्षण गणना कैसे करनी है, और यह काम करने लगता है, यह सिर्फ इतना गहन है कि इसे अपने स्वयं के धागे की आवश्यकता है। (यहां तक कि अगर किसी को इन गणनाओं को करने के लिए एक सुपर कुशल तरीका पता है, तो मैं अभी भी जानना चाहूंगा कि मैं इसे बजाय कई सूत्र पर कैसे कर सकता हूं)
EntityEngine.cs (Gravity.cs का एक उदाहरण प्रबंधित करता है)
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();
}
}
EntityEngine Game1.cs में बनाया गया है, और इसकी अद्यतन () विधि Game1.cs के भीतर कहा जाता है।
मुझे हर बार गेम अपडेट को चलाने के लिए Gravity.cs में अपनी भौतिकी गणना की आवश्यकता होती है, एक अलग थ्रेड में, ताकि गणना गेम को बहुत कम (0-2) FPS तक धीमा न करे।
मैं इस थ्रेडिंग काम को बनाने के बारे में कैसे जाऊँगा? (यदि किसी के पास है तो बेहतर ग्रहों के गुरुत्वाकर्षण प्रणाली के लिए कोई सुझाव स्वागत योग्य है)
मैं एक पाठ की तलाश में नहीं हूं कि मुझे थ्रेडिंग का उपयोग क्यों नहीं करना चाहिए या इसे गलत तरीके से उपयोग करने के खतरों का सामना नहीं करना चाहिए, मैं इसे कैसे करना है पर सीधे उत्तर की तलाश कर रहा हूं। मैं पहले ही एक घंटा बिता चुका हूं, इस छोटे से प्रश्न को बहुत कम परिणामों के साथ समझ रहा हूं जो मुझे समझ में आया या मददगार थे। मुझे अशिष्टता से बाहर आने का मतलब नहीं है, लेकिन यह हमेशा एक प्रोग्रामिंग नॉब के रूप में कठिन लगता है एक सीधा सार्थक जवाब पाने के लिए, मुझे आमतौर पर एक जवाब मिलता है, इसलिए मैं आसानी से अपने मुद्दे को हल कर सकता हूं अगर मैं इसे समझ पाया, या कोई कह रहा है कि मुझे वह क्यों नहीं करना चाहिए जो मैं करना चाहता हूं और कोई विकल्प नहीं देना (जो सहायक है)।
सहायता के लिए धनयवाद!
संपादित करें : मैंने जो उत्तर प्राप्त किए हैं, उन्हें पढ़ने के बाद, मैं देखता हूं कि आप लोग वास्तव में परवाह करते हैं और केवल एक उत्तर को निकालने की कोशिश नहीं कर रहे हैं जो काम कर सकता है। मैं एक पत्थर से दो पक्षियों को मारना चाहता था (प्रदर्शन में सुधार करना और मल्टीथ्रेडिंग के कुछ मूल बातें सीखना), लेकिन यह प्रतीत होता है कि अधिकांश मुद्दा मेरी गणना में निहित है और प्रदर्शन बढ़ने के लिए यह थ्रेडिंग अधिक परेशानी है। आप सभी को धन्यवाद, मैं आपके उत्तरों के माध्यम से फिर से पढ़ूंगा और आपके समाधान की कोशिश करूंगा जब मैं स्कूल के साथ होऊंगा, फिर से धन्यवाद!
k
इस O(n^2)
समस्या को बहुत कम कर देगा ।
sin² + cos² ≡ 1
यह पहले से ही सामान्यीकृत है! आप बस मूल वेक्टर का उपयोग कर सकते थे जो उन दो वस्तुओं को जोड़ता है जिन्हें आप रुचि रखते हैं, और इसे एक सामान्यीकृत करें। कोई ट्रिगर कॉल जो भी आवश्यक हो।