游戲的優(yōu)化ppt課件_第1頁
游戲的優(yōu)化ppt課件_第2頁
游戲的優(yōu)化ppt課件_第3頁
游戲的優(yōu)化ppt課件_第4頁
游戲的優(yōu)化ppt課件_第5頁
已閱讀5頁,還剩48頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、游戲的優(yōu)化不僅僅是幀速率我們將議論什么?n何時何地需求做優(yōu)化?nC 和 C+ 的比較nC+中的性能問題n算法優(yōu)先n我們需求 C+ 的高級特性嗎?優(yōu)化無處不在n最好的優(yōu)化器是他的大腦,而不是編譯器n評測而不是臆測nWindows 游戲不應該有特權nWindows 游戲首先是一個 Windows 程序n每一點資源的節(jié)省都將是有意義的n專家的選擇是不優(yōu)化FPS?n提高了 10 fps 表示什么含義?n10fps-20fps100fps-120fpsn最高幀速率和平均幀速率nLoading 時間n關懷一下 CPU 占用率n了解 Windows 多一點記時器nTimeGetTimenQueryPerfo

2、rmanceCounternRDTSCn精度n多義務環(huán)境的影響n流水線n測不準原那么微觀和宏觀n微觀上的優(yōu)化nCPU指令、流水線吞吐量、等待時間n有限的硬件優(yōu)化n有限的編譯器優(yōu)化n宏觀上的優(yōu)化n算法和代碼構造的改良n減少需求處置的數(shù)據(jù)量,減少處置的頻率和次數(shù)C 與 C+ 微觀上的比較nC 比 C+ 快 10%?n不要迷信書本n證據(jù)?nC+ 編譯器的改良n更合理的參數(shù)傳送方式nInlinen堆棧和函數(shù)調(diào)用n靜態(tài)變量的運用C+提供更強的言語特性nnew/deletemalloc/freenC+ exception setjmp/longjmpn虛函數(shù) 函數(shù)指針數(shù)組nTemplate宏n規(guī)范庫C 的

3、優(yōu)勢n簡單n可移植性更強n接口簡約n更少的二義性nCRT 開銷小n編譯速度快C+ 需求了解更多STLn最被人喜歡的容器nstd:mapnstd:stringnstd:vectornstd:listn大多數(shù)情況他們沒有被正確的運用std:mapn插入是很慢的 O(log(N)n有額外的內(nèi)存耗費 (三個指針+顏色)n大多數(shù)情況,我們需求的只是查找n數(shù)組+二分查找nHash map 通??梢蕴岣咝?,但不絕對n還有更多的優(yōu)化手段nlua 的實現(xiàn)n大話西游的實現(xiàn)std:stringn還有一種字符串叫作 const char *nconst std:string &n不要依賴 COW (copy

4、-on-write)n思索多線程環(huán)境n良好的設計下,cow 通常多余nLua 如何處置字符串?std:vectornstd:vector 并不僅僅是數(shù)組n通常我們把 vector 作為數(shù)組運用nVector:push_back() 常引起內(nèi)存重分配nvector:reserve()nvector:clear() 不一定釋放內(nèi)存nPOD 類型的優(yōu)化n記住:從 C 言語開場,就支持了數(shù)組std:listnstd:list 是一個雙向鏈表nstd:list 有內(nèi)存的額外開銷n鏈表可以在常數(shù)時間插入,而當 N 不大的時候,優(yōu)勢并不明顯。正確的運用STLnSTL 是 C+ 提供的強有力的工具nSTL 的

5、運用都是有開銷的nSTL 并不能處理我們一切的問題n有些問題可以用 STL ,但那并不是最好的處理方案n讓代碼到達最正確的性能,需求用我們的大腦重新發(fā)明輪子?n不要由于他可以做到而重新實現(xiàn) STLn幾乎一切的 MyVector MyString MyMap 都不如 std:vector std:string std:mapn更多的了解 STL 更多的了解 C+CRT 的運用nsprintf(s,%d,n);n為什么不用 itoa ?nsprintf(s,);n為什么不用 s0=0;nprintf 與 putsn不要忽略 CRT 的開銷重寫 CRT?n優(yōu)化 memcpy:MMX 版本、SSE 版

6、本n任何小于 64k 數(shù)據(jù)復制的優(yōu)化都沒有意義n重寫 string 庫,MyStrlen MyStrcmp nCRT 可以做的更好nIntrinsic 函數(shù)n#pragma intrinsic()內(nèi)存優(yōu)化n展開循環(huán),消除數(shù)據(jù)相關性n數(shù)據(jù)并行處置n減少數(shù)據(jù)構造的尺寸,讓數(shù)據(jù)盡量緊湊的放在一同n數(shù)據(jù)對齊n了解內(nèi)存的任務方式內(nèi)存管理優(yōu)化nC+ 提供了更靈敏的內(nèi)存管理機制nnew/delete 不一定是最好的方式(STL就不用)n自定義內(nèi)存分配器n方便調(diào)試n分配速度和內(nèi)存碎片同樣重要n留意分別模塊的問題nDLL 最容易出錯算法nC+ 更適宜實現(xiàn)更復雜的游戲引擎n引擎的復雜度提升,層次的添加,會降低效率

7、n更高的復雜度是為了宏觀上的優(yōu)化臟矩形問題n臟矩形的合并算法并不簡單 n合并后的臟區(qū)域并不是一個矩形,不方便做圖片裁減 n有許多的物體在屏幕上挪動 n卷動屏幕 n圖像引擎設計的復雜度 改良的臟矩形n分格處置n渲染管道n繪圖操作對象化滾動優(yōu)化n更大的back buffern破碎的分格覆蓋優(yōu)化 C+的高級特性天使還是惡魔?Template 防止反復的代碼void _blit(pixel *dst,const pixel *src,size_t s,bool mask_blit) for (size_t i=s;i!=0;-i,+dst,+src) if (!mask_blit | *src!=ma

8、sk_color) *dst=*src; template void _blit(pixel *dst,const pixel *src,size_t s) for (size_t i=s;i!=0;-i,+dst,+src) if (!mask_blit | *src!=mask_color) *dst=*src; void blit(pixel *dst,const pixel *src,size_t s) _blit(dst,src,s);void mask_blit(pixel *dst,const pixel *src,size_t s) _blit(dst,src,s);矩陣運算n

9、Matrix A,B,C;nA=B+C;nMatrix operator+(const Matrix &lhs,const Matrix &rhs);nMatrix & my_type:operator=(const Matrix &v);n如何防止暫時對象的前往?n轉(zhuǎn)化為 A=B; A+=C;Expression Templatestemplateclass add_type const T& _lhs;const T& _rhs;public:add_type(const T &lhs,const T &rhs) :_lhs(

10、lhs),_rhs(rhs) T& calculate(T &result) const result=_lhs;result+=_rhs;return result; ;template add_type operator+(const T &a,const T &b)return add_type(a,b);class Matrix /* . */ Matrix& operator+=(const Matrix &v); Matrix& operator=(const add_type &v) return v.calcula

11、te(*this); /* . */編譯時計算templateclass factorial public: enum value = N * factorial:value ;template class factorial public: enum value = 1 ;冒泡排序inline void compare_swap(int &a,int &b)if (ab) int t=a;a=b;b=t;void sort(int *data,int n)for (int i=0;in-1;i+) for (int j=i+1;jn;j+) compare_swap(data

12、i,dataj);templatestruct inner_loop static inline void expand(int* data) compare_swap(*data, dataN);inner_loop:expand(data);template struct inner_loop static inline void expand(int*) ;templatestruct sort static inline void expand(int* data) inner_loop:expand(data); sort:expand(+data); ;template struct sort static inline void expand(int* data) ;int main()int a=3,2,1;const int len=sizeof(a)/sizeof(a0);sort:expand(a);for (int i=0;ilen;i+) printf(%d,ai);/ sort:expand(a) 展開后的代碼compare_swap(*data,data2);compare_swap(*data,data1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論