2011-06-15 11 views
0

我目前正在使用支持自身和JavaScript之間雙向通信的Silverlight 5應用程序。 Silverlight應用程序負責渲染3D內容,JavaScript負責收集和準備渲染數據。使用異步AJAX時,Silverlight應用程序不會變爲空閒

我面臨的問題是,Silverlight 5 DrawingSurface只在DrawingSurface無效並且應用程序變爲空閒後重新繪製。不幸的是,當使用異步AJAX請求從服務器下載我需要的數據時,DrawingSurface不會重新繪製,直到所有數據都被下載(儘管每次下載數據後都無效DrawingSurface)。

我理解這一點,但讓我困惑的是,當我在Silverlight中使用WebClient完成同樣類型的異步下載請求時,DrawingSurface在大部分失效調用後成功重新繪製。

最初,我認爲這可能是由於一些線程問題,但所有的調用(和回調)在同一個線程上運行。我試過使用jQuery的AJAX API並在JavaScript中編寫我自己的XmlHttpRequest處理程序;但我從兩方面都得到了相同的結果。我最初注意到jQuery以我請求的順序返回數據(而Silverlight的WebClient不是),這導致我創建自己的XmlHttpRequest處理程序,因爲我認爲重新排序可能導致腳本在異步調用期間保持活動狀態。

有沒有人有過這個問題之前和/或沒有人有任何解決方法/修復建議?

回答

0

從你的解釋,不應該在每個繪製調用結束時使表面失效(我很少像遊戲的繪製循環)是一個簡單的解決方法?你的幀率會增加,但在大多數情況下,這不會是一個問題(並且它會使相機和資源管理變得更容易)。

不要忘記渲染邏輯是在自己的線程上執行的:您必須適當地鎖定您的共享實例。

public void Draw(object sender, System.Windows.Controls.DrawEventArgs e) 
{ 
    var device = e.GraphicsDevice; 


    device.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, new Color(0, 0, 0, 0f), 

    //Drawing logic. 
    [...] 

    e.InvalidateSurface(); 


} 
+0

我已經試過這樣做了。問題在於InvalidateSurface調用本質上通知DrawingSurface它需要重新繪製,這隻發生在應用程序變爲空閒時。因此,當應用程序變爲空閒時,Draw事件將再次僅在這種情況下被解僱。我目前面臨的是同樣的情況。 – 2011-06-16 09:30:53

+0

你是什麼意思「當應用程序空閒時」?如果我記得的話,silverlight插件會在組合線程上運行繪圖代碼。你的意思是你的UI線程被阻塞了嗎? – Eilistraee 2011-06-17 12:41:47

+0

據我所知,當DrawingSurface.Invalidate或DrawEventArgs.InvalidateSurface方法被調用時,它們會告訴DrawingSurface重新觸發Draw事件。但爲了使其更有效率,它將無效請求排隊,直到它將當前流程視爲已完成(或在我的問題/評論的上下文中空閒),並在此時觸發事件。 [...] – 2011-06-20 11:43:33

相關問題