2012-04-20 8 views
6

जब मैं एक्सएनए फ्रेमवर्क (विंडोज फोन के लिए) का उपयोग करता हूं तो मेरा गेम पूरी तरह से काम करता है, लेकिन जब मैं सिल्वरलाइट/एक्सएनए फ्रेमवर्क पर माइग्रेट करता हूं तो मुझे एनीमेशन लैगिंग के साथ समस्या होती है। समस्या निम्न है: जब मैं 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; 
} 

उत्तर

3

वीडियो गेम उद्योग के कई वर्षों (और बाहर) के आधार पर: आपको सिल्वरलाइट/एक्सएनए/मोबाइल में एक निश्चित फ्रेम दर के खिलाफ एनिमेट नहीं करना चाहिए।

संभव हो तो, खेल समय पूरी तरह से चलाने के लिए अपने ऐप्लिकेशन बदलने, बल्कि (एक ग्रहण तय फ्रेम दर के खिलाफ काम जो आप एक मोबाइल डिवाइस पर मिलता है कभी नहीं होगा - कम से कम जब तक वे एक बहुत अधिक शक्तिशाली हैं)।

कारण XNA गेम विधियों को GameTime लेना है क्योंकि आप कभी भी फ्रेम दर पर भरोसा नहीं कर सकते हैं।

सिटी हॉल से लड़ें मत ... मानकों के साथ जाओ। जितनी जल्दी हो सके अपने ऐप को बनाएं (उदा। यदि आपके एनीमेशन फ्रेम में बहुत दूर छोड़ते हैं), या मंच के अनुरूप अपनी एनीमेशन दर धीमा करें (यानी अपना गेम/ऐप धीमा करें)।

नोट: कारण सिल्वरलाइट एनीमेशन आमतौर पर फ्लैश एनीमेशन की तुलना में चिकना दिखता है क्योंकि सब कुछ समय आधारित और इंटरपोलेटेड है, निश्चित फ्रेम नहीं है।

+1

Thx। मैंने अपनी गलती की: मैंने निश्चित फ्रेम दर के आधार पर एनीमेशन का उपयोग किया और फ्रेम इंडेक्स द्वारा अद्यतन विधि में एनीमेशन की गणना की। अब ड्रा ड्रा में वास्तविक समय बीतने के बाद मैं एनीमेशन की गणना करूंगा। Thx बहुत कुछ। – Ivan

4

को बदलें

TimeSpan.Zero; 

हाँ मुझे पता है कि यह अजीब लगता है और यह बहुत अधिक है। इसे कुछ आधिकारिक गेम गाइड से मिला। जब तक मैं इसका उपयोग नहीं करता, मेरा खेल पागल की तरह लग रहा है।

+0

Thx। XN फ्रेमवर्क में TargetElapsedTime उपयोग जहां गेम पूरी तरह से काम करता है। सिल्वरलाइट/एक्सएनए फ्रेमवर्क में मेरी समस्या (timer.UpdateInterval = TimeSpan.FromTicks (333333))। यदि मैं टाइमर सेट करता हूं। TimeSpan.Zero पर अद्यतन इंटरवल, ऑनअपडेट विधि को एक परिवर्तनीय समय चरण पर लागू किया जाता है, लेकिन मुझे वास्तविक निश्चित समय चरण की आवश्यकता है। उत्तर के लिए – Ivan