回覆列表
  • 1 # 蘇打sda

    工作第二年時候的一個經驗,第一次實實在在感覺到簡潔程式碼的威力,整潔程式碼實乃保命保平安神器。

    當時開發的是這個遊戲:

    實際遊戲畫面:

    這個巔峰時期團隊過百,一共前後做了4,5年,程式碼量那是大大的,我這裡參與的是ps3版,使用的是unreal3引擎。

    xbox360/ps3這一代,unreal在微軟平臺上做的很是不錯,在ps3上面各種原因吧,做的很不到位,對應出的unreal tournament 3在ps3上面各種縮水。

    一定程度上也和ps3的機能不足以及奇怪的架構有關。

    ps3的在cpu端基本架構是這樣:

    其中可以重點關注大家不太常見的叫做SPE的這個東西,這個可以說是ps3的一大特色,就是一個很強的協處理器,非常善於做vector類的“傻算”,單個能力超過現在的普通I7的單核cpu的計算能力,而且這樣的東東有8個。。。

    甚至sony開始希望這個spe搞定一切,連GPU都省了,但是後來發現不行,急急忙忙上的nvidia的縮水GTX7800級別的GPU。

    但是SPE畢竟設計時候牛逼,後面大家拿這個東西來做計算蛋白質序列啊,在ps3的中後期,大家開始研究怎麼用SPU做一些渲染的工作,一度能承擔40%的GPU的工作,其戰鬥力可見一斑。

    當時sony底層系統方面的能力比微軟差不少,所以底層一大特色就是“裸”,你有兩個選擇,一個是opengl的api,這樣使用預設的驅動,但是效率就是一個普通效率。

    還有一個版本的就是叫gcm的一個api,就比較的底層,你自己來管理一切,從視訊記憶體的管理到command buffer的flush都是自己來做。

    近乎等於開發者自己來實現一個類似driver的東西了,為了效率這個是大家普遍的選擇。

    然後sony文件上有介紹說,SPE可以支援去執行這些gcm的命令的構建,也就是說可以把整個驅動實現出來,然後放到SPE上去跑,這樣就進一步解放核心CPU的工作,達到更好的效能。

    當時花了一些時間把ps3版的底層寫好了,driver也都跑順了,然後就開始做把driver往SPE上移植的工作。

    這個過程就是一個把unreal底層進行拆解分離,把driver部分獨立出來,然後實現到SPE上面,由SPE把命令構建好,送往GPU;為了進一步最佳化效能,自己實現的這個部分還可以提供更高層的一些api,把一些遊戲常用的api直接打包成一個包,定製出一個比opengl更簡單樣子,但是效率非常的高。

    剛剛寫了第一版,直接就一團亂,跟了程式碼一瞅。。。程式碼段被衝了,這個之前都沒見到過,正常系統上對程式碼段會有保護,衝過去會有warning什麼的,SPE上面就是完全裸的,沒有任何保護。

    然後說回SPE,上面一個很小的local storage,需要把命令送過去,然後管理本地的記憶體,進而執行程式碼等等,然後程式碼的執行是透過gpu來看的,所以如果出錯了,你只能知道錯了,不知道哪裡錯了。

    而且ps3的早期,各種debug工具也不完整,debug能力就各種抓瞎。

    當時工作也不久,經驗也不足,就這樣,扛著一個這種大遊戲的底層,沒日沒夜的在SPE裡面一直泡著,一個坑出來再進到另外一個坑。

    中間一個問題憋了一個多星期,沒有一點進展,甚至開始懷疑是不是這個SPE做driver是不可能的,畢竟只是文件上提一嘴。

    在sony論壇上求教,還真有一個哥們,歐洲一個公司的,做網球遊戲的,給我發來郵件說他也這麼幹的,能行;這真給我相當大的希望,繼續又懟了1個星期,程式碼都快全背下來了,終於能夠繼續前進,剛剛長舒一口氣

    leader把我叫到辦公室裡問我還有多長時間能弄完,有點擔心這個能不能行,在考慮要不要把任務cancel。。。當時的表情是這樣的:

    和leader曉之以理動之以情,軟磨硬泡,最後leader再給2星期時間,必須能夠跑得比較穩定,否則還是要卡擦掉。

    然後繼續猛懟,後面進展還算可以,但是由於專案已經比較靠後了,比較擔心上了之後會出各種難查的問題(這個的情況比多執行緒要更棘手了)。

    中間開發的過程已經明顯感覺到,對於這種難以debug的情況,把設計做清晰,把程式碼寫整潔有多麼重要。

    所以到最後就是不停的去重構程式碼,一直到程式碼已經整潔到自己想吐了,就是那種中考前複習的實在煩了,去tmd的考就考吧的感覺。

    開始合入了主幹,提測QA,然後買好紅牛,等著bug徹夜奮戰。

    然後過了一天。。。沒事,QA只是反映,幀數是更好了一些。

    2天。。。沒事

    最後一週下來,就是零星2個小問題。

    這對於這種規模應該說是比較少見了,最後實際profile下來,能節省6-8ms(面向30幀的遊戲,一共33ms,所以對於效能來說是非常關鍵的一波)。

    這波下來,有這樣的感覺

    整潔程式碼絕非裝逼用的,簡直就是保命保平安神器變得特別喜歡欣賞整潔程式碼的美妙之處,後來看insomniac的spu實現的計算水的fft(剛剛查了下已經沒有了),真是如同欣賞水墨風景的怡然的感覺

    總的說來,談不上美哭了,但是也有美的一面,整個過程連滾再爬也快哭了。。。

  • 2 # 蘇靜文0319

    不可能的。你說的這種事對程式設計師來說是不可能發生的。除非對自己的期望低到無以復加。否則。以自己對自己的瞭解。真的太渺茫了。

    不過真的有這種。肯定要紀念下來。而且慶祝一番。這種事在程式設計師眼裡堪比足球比賽。結婚紀念日什麼的。

  • 3 # 程式設計師七小小

    一般人寫程式碼,就像其他樓說的只會被自己寫的東西蠢哭, 寫好了以後過幾天一看,都感覺不是自己寫的,為什麼當時要這麼寫!當然也是可以美哭的,寫好了以後做好調優,養成良好的程式碼習慣,多花費一些心思,寫出來的東西還是很漂亮的

  • 中秋節和大豐收的關聯?
  • 如何看待守望先鋒20161123對於秩序之光的改版?