Nesneleri Silverlight'taki zamana/çerçeveye göre canlandırmaya çalışırken (örneğin, hızlı tempolu oyunlar için uygun olmayan DoubleAnimation veya Storyboard gibi öğelerin kullanılmasının aksine), örneğin belirli bir yönde bir uzay gemisinin taşınması çerçeve, hareket ürkütücü ve gerçekten pürüzsüz değil. Ekran bile gözyaşı gibi görünüyor.Silverlight animasyonu düzgün değil
CompositionTarget ve DistpatcherTimer arasında fark yok gibi görünüyor.
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
Bu hak, pürüzsüz bir hareketin neden olmalıdır: I (pseudocode) aşağıdaki yaklaşımı kullanılır? Ama öyle değil. İşte bir örnek (Denetimler: WASD ve Fare): Silverlight Game. Açıkladığım efekt bu örnekte çok yaygın olmamasına rağmen, bir tuval üzerinde tek bir dikdörtgeni hareket ettirmenin bile ürpertici bir animasyon oluşturduğundan emin olabilirsiniz.
Birisi bunu nasıl en aza indireceğine dair bir fikri var mı. Bunu çözebilecek Storyboards/DoubleAnimations kullanarak çerçeve tabanlı animasyona yönelik başka yaklaşımlar var mı?
Düzenleme: Burada hızlı ve kirli yaklaşım, asgari koduyla bir dikdörtgen animasyon (Kontroller: A ve D) 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>
C#:
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;
}
Teşekkür ! Andrej
+1 Silverlight 3'te oyun yaratma, kekemelik, yırtılma ve titreme nedeniyle herhangi bir girişimde bulunmaya çalışıyorum ... bunu 4'te çözüp çözmediklerini merak ediyorsanız veya pürüzsüz animasyon için Powerpoint kadar işe yaramazsa merak ediyorum. AMOS'lu 20 yılı aşkın Amiga'm bu bölümde daha iyi bir performans ve daha kolay geliştirme platformu;) –
Yakın bir zamanda da benzer bir soru sordum. Donanımımla bir ilgisi olduğunu düşündüm: MacBook Çift Önyükleme (Önyükleme Kampı), her ne kadar diğer Windows PC'lerimde de aynı problemi yaşadım. Doğru olarak işaretlediğim cevabın sorunu çözmediğini unutmayın ... Basit bir dikdörtgeni hareket ettiren bir storyboard için bile problemi gözlemledim. Umarım bu yakında çözülür. http://stackoverflow.com/questions/5319562/silverlight-fast-moving-bitmap-does-not-update-smoothly –