2009-06-30 42 views
6

Khi cố gắng tạo hiệu ứng thời gian/khung hình dựa trên Silverlight (trái ngược với việc sử dụng thứ gì đó như DoubleAnimation hoặc Storyboard, không phù hợp với trò chơi tốc độ nhanh), ví dụ như di chuyển tàu vũ trụ theo một hướng cụ thể khung hình, sự chuyển động rất nhanh và không thực sự mượt mà. Màn hình thậm chí có vẻ rách.Hoạt ảnh Silverlight không trơn tru

Dường như không có sự khác biệt giữa CompositionTarget và DistpatcherTimer. Tôi sử dụng phương pháp sau (trong mã giả):

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 

Điều này sẽ dẫn đến chuyển động trơn tru, phải không? Nhưng nó không. Đây là một ví dụ (Điều khiển: WASD và Chuột): Silverlight Game. Mặc dù hiệu ứng tôi mô tả không quá phổ biến trong mẫu này, tôi có thể đảm bảo với bạn rằng thậm chí di chuyển một hình chữ nhật đơn trên một khung hình sẽ tạo ra một hình ảnh động chuyển động.

Có ai đó có ý tưởng cách giảm thiểu điều này không. Có cách tiếp cận khác để khung hình hoạt hình dựa trên exept bằng cách sử dụng Storyboards/DoubleAnimations mà có thể giải quyết này?

Edit: Đây là một cách tiếp cận nhanh chóng và dơ bẩn, tạo hiệu ứng động một hình chữ nhật với mã tối thiểu (Controls: A và 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; 
    } 

Cảm ơn ! Andrej

+1

+1 Tôi đặt bất kỳ nỗ lực nào trong việc tạo trò chơi trong Silverlight 3 để nghỉ ngơi vì nói lắp, rách và nhấp nháy ... tự hỏi liệu họ có giải quyết vấn đề này trong 4 hoặc nếu nó vẫn vô dụng như Powerpoint cho hoạt ảnh mượt mà không? Amiga trên 20 tuổi của tôi với AMOS là một người biểu diễn tốt hơn và nền tảng phát triển dễ dàng hơn trong bộ phận này;) –

+0

Tôi đã hỏi một câu hỏi tương tự gần đây. Tôi nghĩ rằng nó có một cái gì đó để làm với phần cứng của tôi: MacBook Dual-Boot (Boot Camp), mặc dù tôi đã có cùng một vấn đề trong tất cả các máy tính Windows khác mà tôi có. Lưu ý rằng câu trả lời tôi đánh dấu đúng không thực sự giải quyết vấn đề ... Tôi quan sát vấn đề ngay cả đối với một bảng phân cảnh di chuyển một hình chữ nhật đơn giản. Tôi hy vọng điều này sẽ sớm được khắc phục. http://stackoverflow.com/questions/5319562/silverlight-fast-moving-bitmap-does-not-update-smoothly –

Trả lời

3

Cập nhật vị trí mỗi 1 mili giây là quá mức cần thiết vì Silverlight sẽ không cập nhật nhanh màn hình. Khi bạn sửa đổi vị trí của một đối tượng như vậy (hoặc bất kỳ cập nhật ui nào khác), silverlight đánh dấu bộ đệm khung là bẩn và sau đó nó sẽ vẽ lại màn hình, tuy nhiên nó sẽ không vẽ lại màn hình thường xuyên hơn MaxFrameRate.

Để đặt MaxFrameRate chỉ:

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

này sẽ hạn chế ứng dụng của bạn đến 60 khung hình mỗi giây mà nên là quá đủ.

Các vấn đề liên quan