2009-06-30 15 views
6

चिकनी नहीं जब हर एक विशेष दिशा में एक अंतरिक्ष यान चलती, उदाहरण के लिए (DoubleAnimation या स्टोरीबोर्ड है, जो तेजी से paced खेल के लिए उपयुक्त उदाहरण नहीं है की तरह कुछ का उपयोग कर की तुलना में) वस्तुओं समय/सिल्वरलाइट में आधारित फ्रेम चेतन की कोशिश कर रहा फ्रेम, आंदोलन अजीब है और वास्तव में चिकनी नहीं है। स्क्रीन भी फाड़ने लगती है।सिल्वरलाइट एनीमेशन

वहाँ CompositionTarget और DistpatcherTimer बीच कोई अंतर नहीं हो रहा है।

Register Handler to Tick-Event of a DispatcherTimer 
In each Tick: 
Compute the elapsed time from the last frame in milliseconds 
Object.X += movementSpeed * ellapsedMilliseconds 

यह एक निर्बाध आवाजाही में, सही परिणाम चाहिए: मैं निम्नलिखित दृष्टिकोण (स्यूडोकोड में) का उपयोग करें? लेकिन ऐसा नहीं है। यहां एक उदाहरण है (नियंत्रण: WASD और माउस): Silverlight Game। हालांकि मेरे द्वारा वर्णित प्रभाव इस नमूने में बहुत प्रचलित नहीं है, मैं आपको आश्वस्त कर सकता हूं कि एक कैनवास पर एक आयत को भी ले जाने से एक अजीब एनीमेशन उत्पन्न होता है।

किसी एक विचार है कि यह कैसे कम करने के लिए है। क्या स्टोरीबोर्ड/डबलएनीमेशन का उपयोग करके फ्रेम आधारित एनीमेशन से बाहर निकलने के लिए अन्य दृष्टिकोण हैं जो इसे हल कर सकते हैं?

संपादित करें: यहाँ एक त्वरित और गंदी दृष्टिकोण, न्यूनतम कोड के साथ एक आयत एनिमेट (नियंत्रण: ए और डी) Animation Sample

Xaml:

<Grid x:Name="LayoutRoot" Background="Black"> 
    <Canvas Width="1000" Height="400" Background="Blue"> 
     <Rectangle x:Name="rect" Width="48" Height="48" 
        Fill="White" 
        Canvas.Top="200" 
        Canvas.Left="0"/> 
    </Canvas> 
</Grid> 

सी #:

private bool isLeft = false; 
    private bool isRight = false; 
    private DispatcherTimer timer = new DispatcherTimer(); 
    private double lastUpdate; 

    public Page() 
    { 
     InitializeComponent(); 

     timer.Interval = TimeSpan.FromMilliseconds(1); 
     timer.Tick += OnTick; 

     lastUpdate = Environment.TickCount; 
     timer.Start(); 
    } 

    private void OnTick(object sender, EventArgs e) 
    { 
     double diff = Environment.TickCount - lastUpdate; 

     double x = Canvas.GetLeft(rect); 

     if (isRight) 
      x += 1 * diff; 
     else if (isLeft) 
      x -= 1 * diff; 

     Canvas.SetLeft(rect, x); 

     lastUpdate = Environment.TickCount; 
    } 

    private void UserControl_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.D) 
      isRight = true; 

     if (e.Key == Key.A) 
      isLeft = true; 
    } 

    private void UserControl_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.Key == Key.D) 
      isRight = false; 

     if (e.Key == Key.A) 
      isLeft = false; 
    } 

धन्यवाद ! कपड़े

+1

+1 मैं हकलाना की वजह से आराम करने के लिए सिल्वरलाइट 3 में खेल बनाने, फाड़ और झिलमिलाते ... आश्चर्य है अगर वे 4 में इस हल या यदि यह अभी भी चिकनी एनीमेशन के लिए पावरपोइंट के रूप में के रूप में बेकार है पर किसी भी प्रयास डाल? एएमओएस के साथ मेरा 20 साल पुराना अमिगा इस विभाग में एक बेहतर कलाकार और आसान विकास मंच है;) –

+0

मैंने हाल ही में एक समान प्रश्न पूछा। मैंने सोचा कि मेरे हार्डवेयर के साथ कुछ करना है: मैकबुक ड्यूल-बूट (बूट कैंप), हालांकि मेरे पास हर दूसरे विंडोज पीसी में एक ही समस्या थी। ध्यान दें कि मैंने जिस जवाब को सही तरीके से चिह्नित किया है वह वास्तव में इस मुद्दे को हल नहीं करता है ... मैंने एक साधारण आयत को घुमाने वाले स्टोरीबोर्ड के लिए भी समस्या देखी। मुझे आशा है कि यह जल्द ही तय हो जाएगा। http://stackoverflow.com/questions/5319562/silverlight-fast-moving-bitmap-does-not-update-smoothly –

उत्तर

3

प्रत्येक 1 मिलीसेकंड की स्थिति को अद्यतन करना अधिक है क्योंकि चांदी की रोशनी स्क्रीन को तेज़ी से अपडेट नहीं करेगी। जब आप किसी ऐसे वस्तु (या किसी अन्य ui अद्यतन) Silverlight गंदा के रूप में फ्रेमबफर के निशान की स्थिति को संशोधित करें और यह अंततः स्क्रीन पुनः बनाने जाएगा, लेकिन यह स्क्रीन अधिक बार MaxFrameRate से पुनः बनाने नहीं होंगे।

MaxFrameRate सिर्फ सेट करने के लिए:

Application.Current.Host.Settings.MaxFrameRate = 60; 

यह जो पर्याप्त से अधिक होना चाहिए प्रति सेकंड 60 फ्रेम करने के लिए अपने आवेदन सीमित कर देगा।

0

एनीमेशन के लिए एक DispatchTimer प्रयोग न करें। Reasons for this। यदि आप कर सकते हैं, या CompositionTarget.Rendering ईवेंट स्टोरीबोर्ड का उपयोग करें।