जब मैं एक्सएनए फ्रेमवर्क (विंडोज फोन के लिए) का उपयोग करता हूं तो मेरा गेम पूरी तरह से काम करता है, लेकिन जब मैं सिल्वरलाइट/एक्सएनए फ्रेमवर्क पर माइग्रेट करता हूं तो मुझे एनीमेशन लैगिंग के साथ समस्या होती है। समस्या निम्न है: जब मैं GameTimer (timer.UpdateInterval = TimeSpan.FromTicks (333333) पर निश्चित समय चरण निर्धारित करता हूं), वास्तविक समय चरण फिक्स्ड और टाइमर ईवेंट (ऑनअपडेट, ऑनड्रा) अलग अंतराल के साथ आग नहीं करता है। इस कोड को अपनी समस्या अधिक स्पष्ट रूप से पता चलता है:सिल्वरलाइट/एक्सएनए एनीमेशन लैगिंग
सिल्वरलाइट/XNA फ्रेमवर्क (एनिमेशन ठंड):
TimeSpan curNow;
TimeSpan lastUpdate;
TimeSpan lastDraw;
public GamePage()
{
timer = new GameTimer();
timer.UpdateInterval = TimeSpan.FromTicks(333333);
timer.Update += OnUpdate;
timer.Draw += OnDraw;
}
private void OnUpdate(object sender, GameTimerEventArgs e)
{
curNow = new TimeSpan(DateTime.Now.Ticks);
TimeSpan elapsed=e.ElapsedTime;//Always constant and has value: 33ms
TimeSpan realElapsed = curNow - lastUpdate;//Real elapsed time always changing and has a value between: 17-39ms (sometimes more then 39ms)
lastUpdate = curNow;
}
private void OnDraw(object sender, GameTimerEventArgs e)
{
curNow = new TimeSpan(DateTime.Now.Ticks);
TimeSpan elapsed=e.ElapsedTime;//Always changing and has a value between: 17-39ms (sometimes more then 39ms)
TimeSpan realElapsed = curNow -lastDraw;//Always changing and has a value between: 17-39ms (sometimes more then 39ms)
lastDraw= curNow;
}
XNA फ्रेमवर्क (सभी ठीक काम करता है):
TimeSpan curNow;
TimeSpan lastUpdate;
TimeSpan lastDraw;
public Game()
{
// Frame rate is 30 fps by default for Windows Phone.
TargetElapsedTime = TimeSpan.FromTicks(333333);
}
protected override void Update(GameTime gameTime)
{
curNow = new TimeSpan(DateTime.Now.Ticks);
TimeSpan elapsed=gameTime.ElapsedGameTime;//Always constant and has value: 33ms
TimeSpan realElapsed = curNow - lastUpdate;//Real elapsed time has a value between: 34-35ms (sometimes more then 35ms)
lastUpdate = curNow;
}
protected override void Draw(GameTime gameTime)
{
curNow = new TimeSpan(DateTime.Now.Ticks);
TimeSpan elapsed=gameTime.ElapsedGameTime ;//Value between: 33-34ms (sometimes more then 34ms)
TimeSpan realElapsed = curNow - lastDraw;//Value between: 34-35ms (sometimes more then 35ms)
lastDraw = curNow;
}
Thx। मैंने अपनी गलती की: मैंने निश्चित फ्रेम दर के आधार पर एनीमेशन का उपयोग किया और फ्रेम इंडेक्स द्वारा अद्यतन विधि में एनीमेशन की गणना की। अब ड्रा ड्रा में वास्तविक समय बीतने के बाद मैं एनीमेशन की गणना करूंगा। Thx बहुत कुछ। – Ivan