2008年9月24日 星期三

時間換空間,空間換時間

標題這句話,是程式設計裡頭進行最佳化(Optimize)調整時的最終圭臬。不是唯一的方法,卻是全世界通用、軟硬體通吃的最後一招。

所以寫程式的人都沒什麼才華,弄來弄去,只剩一招。

最佳化調整通常有兩個目的,一個是增加程式的運算效能,另一個就是節省程式的資源使用。我們需要減少運算時間的時候,就用查表的方式、建立快取(Cache)的方式,拿空間換時間;需要節省記憶體空間、硬碟空間的時候,就改存放比較簡單的資料、壓縮過的資料,再花時間用演算法計算。

不過,不管怎麼樣,這都是最後一招。意思是,在我們將能夠調整的都調整過了之後,才能使用它。如果有一個比較快速的演算法可以改善程式的運算效能,我們就還不能使用這最後一招。畢竟這一招是需要付出代價的。

舉個很簡單的例子講。我們需要做一個計算從整數A累加到整數B的函式。看到題目,我們很快的寫了一個迴圈來做累加的計算。然後我們將這個函式做最佳化。不需要查表,不需要快取,不需要任何用空間換時間的方法,只需要一個很簡單的梯形面積公式。Sum = (B+A)*(B-A+1)/2。

好,我知道這個例子很蠢,但是概念很重要。

概念是,有比較好的方法可以改進運算效能、節省資源使用量的時候,千千萬萬不要只會想到時間換空間,空間換時間的最後一招。

我們最近進行了一個最佳化的任務--改善遊戲的資料讀取時間。

一開始,我們將資料讀取的工作修改為交給一個專門的執行緒來做,得到一部份的成果,只是還不夠理想。然後我們進一步的將資料分出優先順序,盡可能的將資料載入的時間點分開來,不要讓很多資料載入的工作集中在同一時間。但是這樣的改善成果也還不夠。

最後,我們發現資料載入的效能瓶頸,是出在將這些讀取得的資料轉換為遊戲內資料的過程,於是就施放大絕--拿空間換時間。我們將資料檔案做修改,改成存放已經轉換過的資料,載入的過程中不再需要做轉換,只需要很單純的將資料讀取到記憶體中就可以。效果很好,達到我們的理想需求,但是代價也很大--檔案容量膨脹了十倍以上。

問題來了。

這樣的檔案容量大爆炸,會影響到下載檔案的時間與頻寬,還有,搞不好安裝光碟會從一片DVD變成兩片,成本大增。於是我們又想了個辦法調整。

我們將一部份的資料還原成轉換前的比較小的原始資料,然後做了個小程式把轉換資料的工作獨立出來。使用者下載與安裝的是容量小的原始資料,經過轉換程式轉換後,再存放到資料硬碟裡面。這樣,我們又拿時間來換空間,只不過這個時間並不是遊戲進行時的運算時間,而是檔案安裝與更新的時間。遊戲還是保持順暢,安裝與更新嘛…多花一點時間無妨的啦!

2008年9月17日 星期三

Spore : 向沙丘魔堡致敬

39003m

最近一個新上市的遊戲,Spore,很火熱。今天看到新聞說,已經登上全球的賣座冠軍。玩了幾天下來,突然有個想法--這是在向『沙丘魔堡』致敬啊!!

從頭說起。

Spore是製作模擬城市、模擬市民這一系列遊戲的製作人,所帶著的團隊所做的新遊戲。所以多多少少還帶著一些「模擬」系列的玩法與風格。 不過,讓人津津樂道的,是遊戲裡面的幾個可以讓玩家自行發揮創意的編輯器,包括 生物的編輯器、載具的編輯器、建築的編輯器等等。玩家製作出來的東西,可以上傳到伺服器來分享,然後就可能會出現在別的玩家的遊戲中,變成你的盟友或是敵人,呵...

ph_paintph_make

昨天有一篇報導,有很多很棒的作品...

承載所有玩家夢想 各式知名ACG人物於《SPORE》現身

我是沒什麼美術概念的人,所以這東西,基本上沒什麼在玩,不過倒是下載到了其他人所做的東西來欣賞讚嘆一下。

除了這創意編輯器之外,遊戲本身分成幾個階段,從最渺小的一個單細胞生物,發展到生物階段、部落階段、文明階段、最後到太空階段。換句話說,這遊戲,是在模擬一個生物的進化。但是遊戲還是遊戲,生物的進化過程是根本不能模擬的,所以,除了最後的太空階段之外,前面的幾個階段都有過關條件,達到了就可以進入下一階段,一跳就是個幾百萬年的進化....

所以我就像玩一般的遊戲一樣,想辦法過關,花了幾個小時吧,衝到了太空階段。

80021

太空階段就回到「模擬」系列遊戲的概念了--沒有結局。玩家有一個星球,然後要想辦法在宇宙中生存,擴張自己的星際帝國版圖。你可以用軍事力量征服,經濟力量收購,或是用宗教力量感化,也可以就一步一步的,找無人的星球慢慢殖民,慢慢擴張。宇宙有多大,遊戲就有多大.....

到了這裡,我就把這遊戲當做『三國志』在玩了....哈...

殖民星球有幾個要素,
1. 改變星球的氣候與生態
2. 建立殖民地
3. 採集香料換錢

這...只要再加上『沙蟲』,就是『沙丘魔堡』了啊!!

2008年9月13日 星期六

2008 員工旅遊 之五

第四天,該回家了。廬山溫泉-->清境農場-->台北

DSC00213

離開廬山之前,來一張有圖有真相。

DSC00225

綿羊餵食。

DSC00231

喔...這隻毛毛蟲只是要測試新相機的數位變焦效果.....結果焦距好像對準到後面的葉子上了。

DSC00238

清境農場的7-11與Starbucks,以前是全台最高的,現在被阿里山上的打敗。據說,這整個建築都是7-11的...

DSC00245

關西休息站的黃昏。

貼完。

其實每一張照片都有我,相機後面的那個就是....

2008 員工旅遊 之四

第三天的後半段。

DSC00174

森林國家公園裡的樹林。

DSC00179

姐妹潭一隅。

DSC00201

到現在還是不知道為什麼星巴克跟阿里山站會黏在一起.....

DSC00209

這是南投信義鄉農會的一個酒莊,拼經濟的好地方。東西算有點貴了,但是包裝得很有質感,當伴手禮很適合。

DSC00211

呵....很可愛喔?

2008年9月12日 星期五

2008 員工旅遊 之三

第三天,阿里山日出-->廬山泡溫泉 (前半段,日出篇)

DSC00088

『半夜三點』的阿里山車站。(絕對要強調『半夜三點』)

DSC00091

等車中。

DSC00103

觀日平台的人群,時間--四點半。

DSC00121

太陽還躲在山後面,時間--五點。

DSC00143

五點半,還是躲在山後面不給人看。

DSC00147

五點四十,日出前。

DSC00156

五點四十六,終於等到了。(新買的相機效果還算不錯,相機厲害比拍攝技術重要)

DSC00171

這張,有前景、中景、遠景,還有光源....

2008 員工旅遊 之二

員工旅遊第二天,嘉義-->阿里山

DSC00053

現烤蚵。很燙。

DSC00065

沙洲上抓到的笨螃蟹(也不會躲好一點....)

DSC00074

奮起湖街上的7-11,樓下是便當專賣店。

DSC00078

奮起湖火車站。可惜火車頭躲到維修場裡了,沒看見。

DSC00082

古老的鐵道。

DSC00086

阿里山上,全台最高的7-11與Starbucks。

2008 員工旅遊 之一

2008年9月的員工旅遊。

DSC00029

出發第一天,關西休息站。

DSC00048

嘉義酒廠,啤酒配香腸,錯誤的開始。(豪華晚餐就因為這樣而吃不下....)

DSC00051

遊樂場裡有90%是公司員工,公司員工有80%在遊樂場裡。做這一行的還真是容易預測行蹤。

2008年9月2日 星期二

偉大的米勒

今天做了一件偉大的事--我花了三個小時去排隊看米勒畫展! 三個小時哪! 偉大吧!

畫展本身並不大,展場也很小,畫作據說只有五十一幅,不過,真的很棒。偉大的畫作,值得我花費三個小時去排隊,也值得我忍受展場裡面擁擠的人。

再想一想,如果要去法國看,花的時間可絕對不止三五個小時!

我對這些美術畫作其實並不懂,還好有個語音導覽可以租借,可以讓我從看熱鬧的人升級到看一點門道。所以我才能說,很棒,真的很偉大。

語音導覽是蔣勳老師解說的,我就像是上了一堂課一般,從那個時期的時代背景,巴比松畫派的起源,米勒的簡易生平,畫風演變,然後才到那幾幅知名的『拾穗』、『晚禱』,不但是收益良多,如果再加上自己一點想像力來想像當時的生活與情景,那真的會有一點的感動的。

為什麼以前學校沒有這種課程啊? 還是我根本沒認真上?

請了半天假,排了三小時的隊,腳已經快練成『鐵腿』,但是,一切都值得,不後悔........