《游戲的優(yōu)化》PPT課件.ppt_第1頁(yè)
《游戲的優(yōu)化》PPT課件.ppt_第2頁(yè)
《游戲的優(yōu)化》PPT課件.ppt_第3頁(yè)
《游戲的優(yōu)化》PPT課件.ppt_第4頁(yè)
《游戲的優(yōu)化》PPT課件.ppt_第5頁(yè)
已閱讀5頁(yè),還剩48頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

游戲的優(yōu)化,不僅僅是幀速率,我們將談?wù)撌裁?,何時(shí)何地需要做優(yōu)化? C 和 C+ 的比較 C+中的性能問(wèn)題 算法優(yōu)先 我們需要 C+ 的高級(jí)特性嗎?,優(yōu)化無(wú)處不在,最好的優(yōu)化器是你的大腦,而不是編譯器 評(píng)測(cè)而不是臆測(cè) Windows 游戲不應(yīng)該有特權(quán) Windows 游戲首先是一個(gè) Windows 程序 每一點(diǎn)資源的節(jié)省都將是有意義的 專(zhuān)家的選擇是不優(yōu)化,FPS?,提高了 10 fps 表示什么含義? 10fps-20fps 100fps-120fps 最高幀速率和平均幀速率 Loading 時(shí)間 關(guān)心一下 CPU 占用率 了解 Windows 多一點(diǎn),記時(shí)器,TimeGetTime QueryPerformanceCounter RDTSC 精度 多任務(wù)環(huán)境的影響 流水線 測(cè)不準(zhǔn)原則,微觀和宏觀,微觀上的優(yōu)化 CPU指令、流水線吞吐量、等待時(shí)間 有限的硬件優(yōu)化 有限的編譯器優(yōu)化 宏觀上的優(yōu)化 算法和代碼結(jié)構(gòu)的改進(jìn) 減少需要處理的數(shù)據(jù)量,減少處理的頻率和次數(shù),C 與 C+ 微觀上的比較,C 比 C+ 快 10%? 不要迷信書(shū)本 證據(jù)? C+ 編譯器的改進(jìn) 更合理的參數(shù)傳遞方式 Inline 堆棧和函數(shù)調(diào)用 靜態(tài)變量的使用,C+提供更強(qiáng)的語(yǔ)言特性,new/delete malloc/free C+ exception setjmp/longjmp 虛函數(shù) 函數(shù)指針數(shù)組 Template 宏 標(biāo)準(zhǔn)庫(kù),C 的優(yōu)勢(shì),簡(jiǎn)單 可移植性更強(qiáng) 接口簡(jiǎn)潔 更少的二義性 CRT 開(kāi)銷(xiāo)小 編譯速度快,C+ 需要了解更多,STL,最被人喜愛(ài)的容器 std:map std:string std:vector std:list 大多數(shù)情況他們沒(méi)有被正確的使用,std:map,插入是很慢的 O(log(N) 有額外的內(nèi)存消耗 (三個(gè)指針+顏色) 大多數(shù)情況,我們需要的只是查找 數(shù)組+二分查找 Hash map 通??梢蕴岣咝剩唤^對(duì) 還有更多的優(yōu)化手段 lua 的實(shí)現(xiàn) 大話西游的實(shí)現(xiàn),std:string,還有一種字符串叫作 const char * const std:string & 不要依賴(lài) COW (copy-on-write) 考慮多線程環(huán)境 良好的設(shè)計(jì)下,cow 通常多余 Lua 如何處理字符串?,std:vector,std:vector 并不僅僅是數(shù)組 通常我們把 vector 作為數(shù)組使用 Vector:push_back() 常引起內(nèi)存重分配 vector:reserve() vector:clear() 不一定釋放內(nèi)存 POD 類(lèi)型的優(yōu)化 記住:從 C 語(yǔ)言開(kāi)始,就支持了數(shù)組,std:list,std:list 是一個(gè)雙向鏈表 std:list 有內(nèi)存的額外開(kāi)銷(xiāo) 鏈表可以在常數(shù)時(shí)間插入,而當(dāng) N 不大的時(shí)候,優(yōu)勢(shì)并不明顯。,正確的使用STL,STL 是 C+ 提供的強(qiáng)有力的工具 STL 的使用都是有開(kāi)銷(xiāo)的 STL 并不能解決我們所有的問(wèn)題 有些問(wèn)題可以用 STL ,但那并不是最好的解決方案 讓代碼達(dá)到最佳的性能,需要用我們的大腦,重新發(fā)明輪子?,不要因?yàn)槟隳軌蜃龅蕉匦聦?shí)現(xiàn) STL 幾乎所有的 MyVector MyString MyMap 都不如 std:vector std:string std:map 更多的了解 STL 更多的了解 C+,CRT 的使用,sprintf(s,”%d”,n); 為什么不用 itoa ? sprintf(s,”); 為什么不用 s0=0; printf 與 puts 不要忽略 CRT 的開(kāi)銷(xiāo),重寫(xiě) CRT?,優(yōu)化 memcpy:MMX 版本、SSE 版本 任何小于 64k 數(shù)據(jù)復(fù)制的優(yōu)化都沒(méi)有意義 重寫(xiě) string 庫(kù),MyStrlen MyStrcmp CRT 可以做的更好 Intrinsic 函數(shù) #pragma intrinsic(),內(nèi)存優(yōu)化,展開(kāi)循環(huán),消除數(shù)據(jù)相關(guān)性 數(shù)據(jù)并行處理 減少數(shù)據(jù)結(jié)構(gòu)的尺寸,讓數(shù)據(jù)盡量緊湊的放在一起 數(shù)據(jù)對(duì)齊 了解內(nèi)存的工作方式,內(nèi)存管理優(yōu)化,C+ 提供了更靈活的內(nèi)存管理機(jī)制 new/delete 不一定是最好的方式(STL就不用) 自定義內(nèi)存分配器 方便調(diào)試 分配速度和內(nèi)存碎片同樣重要 注意分離模塊的問(wèn)題 DLL 最容易出錯(cuò),算法,C+ 更適合實(shí)現(xiàn)更復(fù)雜的游戲引擎 引擎的復(fù)雜度提升,層次的增加,會(huì)降低效率 更高的復(fù)雜度是為了宏觀上的優(yōu)化,臟矩形,問(wèn)題,臟矩形的合并算法并不簡(jiǎn)單 合并后的臟區(qū)域并不是一個(gè)矩形,不方便做圖片裁減 有許多的物體在屏幕上移動(dòng) 卷動(dòng)屏幕 圖像引擎設(shè)計(jì)的復(fù)雜度,改進(jìn)的臟矩形,分格處理 渲染管道 繪圖操作對(duì)象化,滾動(dòng)優(yōu)化,更大的back buffer 破碎的分格,覆蓋優(yōu)化,C+的高級(jí)特性,天使還是惡魔?,Template 避免重復(fù)的代碼,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!=mask_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); ,矩陣運(yùn)算,Matrix A,B,C; A=B+C; Matrix operator+(const Matrix ,Expression Templates,template class add_type const T ,class Matrix /* . */ Matrix /* . */ ,編譯時(shí)計(jì)算,template class factorial public: enum value = N * factorial:value ; ; template class factorial public: enum value = 1 ; ;,冒泡排序,inline void compare_swap(int ,template struct 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*) ; template struct 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;i:expand(a) 展開(kāi)后的代碼 compare_swap(*data,data2); compare_swap(*data,data1); +data; compare_swap(*data,data1);,盡可能的在編譯時(shí)運(yùn)算?,還有更多的 template 技巧 Modern C+ Design - Generic Programming a

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論