天天看點

多核時代的移動開發(一)-函數式程式設計思想到來

在這裡我們先初步分析一下目前移動遊戲開發的概念與以往發生了怎樣的改變。我們知道以前所謂的遊戲開發與移動開發基本沒有交集,移動遊戲開發往往專指j2me開發的一些小遊戲,入門不難但是普遍使用者體驗不佳。而且由于j2me标準不太統一是以造成移動遊戲開發沒有什麼通用性,更難以形成統一的标準。但是由于平闆及智能手機的普及,尤其是iphone的出現使移動遊戲的核心領域迅速由2d向3d轉換。

   一個新興市場往往是最需要創意的,而随着市場的逐漸成熟則逐漸穩定與成熟的技術會變得越來越重要。我想對于移動的開發也是如此。那麼目前移動開發最重要的,也是最本質的改觀就是手機迅速由單核或者說是雙核向着多核轉變,目前比較流行的機型例如三星的note2,s3等全部是4核,可以。可以預見很快就要完成到8核的進化

那麼我們來分析一下結合移動平台目前的情況分析一下多核的趨勢

1、  移動平台上的程序往往是使用者目前程序通吃絕大部分資源的情況:與伺服器或者桌面版系統不同,基本每個移動平台或者說是移動系統對于使用者的目前程序的資源配置設定都有相當大的傾斜。是以往往是使用者目前的使用程序可以占用全部cpu的資源,那麼可以想象如果使用者的程式擁有強大的cpu支援,但是隻能完整的利用其中一核的效率,那麼其實程式的效率也就無從談起。

推論:移動平台上的多核性能優化不能指望作業系統,必須由應用開發設計人員來完成。

2、程序的多核優化不是簡單的多起線程,有的朋友可能這樣認為,多核的優化就是多起線程。其實這絕對是一種誤區,絕大多數情況下還是主線程對于整個程式流暢性起到了絕對的作用,所謂的多程程往往是指使用者程序向伺服器或者作業系統請求資料的情況,其實使用者程序絕對部分時間是在主程序上運作的。是以最需要優化的往往是我們的主線程,如果沒有多線程運作就沒法優化的說法是不正确的。

推論:如果要優化性能資料請求程序不是重點,而使用者界面的主程序才是重頭戲。

好讓我們快速來舉幾個場景來分析一下情況,如果你是在做一個基于雲端的手機應用,那麼你的程序有一個很重要的任務是要解析xml封包,生成xml對象的數組,雖然程式設計架構如.net或者j2ee等可以完成這樣的工作,但是他的工作機制肯定是這樣的,那麼你需要周遊一下整個字元串,然後找到其中的标簽和值,然後生成相應的對象。那麼好問題來了,其實由于xml封包采用的是字典方式的資料組織形式,隻要你知道标簽的name就可以找到标簽的值,而同一級别下的資料組織順序沒有關系,或者換種說法,那就是前一項的解析結果對于後一項的解析沒有影響,那麼沒必要串行。ok透過簡單的分析這種情況可以并行處理。

那麼如果您做遊戲那麼其實情況就更多了,比如你在做矩陣變換,雖然不管xna還是dx都會有相應的函數處理,其實還是周遊矩陣中的所有元素然後将此元素帶入用某一方程式求值後放入新的位置。和上面的情況一樣,每一項的處理結果均以單獨立完成,互不影響,又沒必要串行。

其實直白的解釋并行的條件就是最終的計算結果的若幹元素互相之間不産生影響,每一進制素的生成均可以獨立進行。那麼總是回來了這種可以并行的情況java或者c的類庫有沒有能你做優化?ok簡單的看個例子,假如你有一個數組a[1,2,3,4]你需要把每個元素都加1形成這樣的資料b[2,3,4,5],那麼不管是c還是java寫法都類似。我以僞代碼舉例了

int b[4];

for (int i=0,i<a.length,i++)

{

b[i]=a[i]+1;

}

好結果代碼是這麼寫的還有可能并行嗎?

無論是哪個編譯器都都必須讓循環變量i執行i++的操作,才可以做b[i]=a[i]+1的動作。這個循環變量直接把一個可并行計算的機會葬送掉了。

其實這種循環變量的寫法之是以沒有被反強烈思過,是因為這種寫法是貼近單核cpu的,他一步步的告訴cpu該怎麼做。但是在多核時代這種表達方式不再适用。

再舉個簡單的例子:

比如銀行的營業大廳以前常常是隻有一個營業員那麼假如你是營業經理設計流程就隻能是一個人辦理完成業務再進入下一個人(這樣的方式類似于循環變量的方式)

但是目前銀行的營業大廳裡經常是四五營業員那麼新的流程不能是一個人辦理業務完成後再叫下一個人的方式不再适用。而是要讓每個營業員都可以叫号。而之前規定隻有一個客戶辦理完成業務的情況下才能讓下一個客戶進門辦理業務的規則必須廢止。

如果對于上面那個例子中所講的對于a[1,2,3,4]中每個元素都加1的需求,函數式也就是并行式的語言是怎麼做的呢?我以f#為例

let add  x = x +1

list.map add [1 .. 4] 

這樣就ok了。其實這咱寫法也很好了解,先定義一個函數add就是把輸入x加上1之後傳回,而第二行的意思就是對于資料[1 .. 4]中的每個元素都執行add函數,并形成對應的元素。與for循環的做法相比,函數式語言避免了循環變量的出現帶來的串行問題,雖然表達變簡單了但是由于沒有規定具體的實作,卻增大了并行優化的空間。

好,這次的主要内容就是這些,總結一句話目前的多核移動時代,你可以不了解函數式語言的具體文法,但是不能不了解這種思想。後面的部落格也不想就f#的具體文法來做詳細介紹,但是我會盡我所能對函數式語言中所包含的思想進行介紹。