多核時代的移動開發(一)-函數式編程思想到來
在這裏我們先初步分析一下目前移動遊戲開發的概念與以往發生了怎樣的改變。我們知道以前所謂的遊戲開發與移動開發基本沒有交集,移動遊戲開發往往專指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#的具體語法來做詳細介紹,但是我會盡我所能對函數式語言中所包含的思想進行介紹。
最後更新:2017-04-02 00:06:57