2013-03-15 23 views
0

我創建一個基於砂的Windows Phone 8的比賽,我想辦法來提高性能。WP7砂物理性能改進

砂從頂部下降並且有填充碰撞,所以它必須被計算的每個幀。

當前的實現是這樣的:

  • 有一個短[,]數組與像素信息,這樣的像素被裝滿沙子/障礙/線
  • 沙算法是非常簡單的。我謹每一粒隨機左右,如果有空間存在,讓它掉下來,如果有以下
  • 對於我創建的水平不變的背景圖像的WriteableBitmap的性能的原因空間開始
  • 當我畫我複製領域預創建WriteableBitmap的,通過WriteableBitmap.Pixels []發生變化的部分添加到它並將其設置爲通過ImageBrush.ImageSource畫布背景
  • 我做的每個更新計算在後臺線程沙運動,讓UI線程進行繪製。 這意味着我會瀏覽整個short [,]數組,並查看像素[]是否是沙子,如果是計算粒子運動。之後,將其複製到背景圖像等

有了這個設置,我得到了在調試模式下的諾基亞Lumia 820,這似乎慢了15 fps。

我當然可以進行一些小的優化,比如使用隨機地圖而不是random.Next或使用一個大的short []而不是short [,],但我註釋了我的代碼的不同部分,我似乎在這個設置中某處丟失了一個主要的性能接收器。

+0

沒有任何沙灘運動,你會得到多少FPS?(註釋掉)?即問題真的是沙算法,或者只是繪圖部分? – rlb 2013-03-15 07:00:21

+0

這是很奇怪的,如果我讓後臺線程睡眠(20)每轉一圈,我得到18 fps的運動,如果我評論沙運動出它上升到每秒30幀。但是如果我把睡眠設置得像睡眠一樣(5),我得到的移動速度是25fps,如果我將它評論出來,它會分解爲0。沙運動和低睡眠值也會發生同樣的情況,這是我讓它睡覺的原因。嗯,現在我輸入這個,這可能是因爲UI線程獲取新的繪製調用,同時仍然處理舊的?我應該研究一下。 – Dreiven 2013-03-15 13:59:48

+0

未完成的UI線程確實使我的應用程序失效。現在,我可以達到21fps的沙運動和無睡眠(),最高可達33fps,無沙運動。我修復它像這樣http:// stackoverflow。com/questions/9453553/windows-phone-how-to-tell-when-deployment-current-dispatcher-begininvoke-has-co – Dreiven 2013-03-15 14:50:49

回答

1

一個想法是讓這個完全阻塞以下/在其兩側砂被設置爲「無效」。不活動的沙子不會在更新上被檢查,直到東西在它的側面/下面移動(這將設置現在釋放爲「活動」的所有像素)

+0

我想過,但是使用這樣的代碼,如果我有屏幕上顯示50格或500,因爲「我應該移動支票」失敗如此之快。 – Dreiven 2013-03-15 03:04:15

1

我開始創建類似這樣的東西我自己www.sandicle.com有一個老在那裏測試視頻,它現在有點更快,有更多的功能...(我一直喜歡丟棄一些熔岩:)...)希望儘快回到這個項目很快(有點忙的時刻:(

但基本上我通過使分辨率更小而獲得40-60fps

我還添加了一個編輯器,以便您可以製作自己的粒子,並且可以在人們創建它們時下載新的元素包:)

+0

啊我知道一個。 :)是的,我已經將分辨率設置爲屏幕尺寸的一半,這給了我很大的提升,但我無法讓它比具有挑戰性的關卡設計更小。 – Dreiven 2013-03-15 14:00:34