
游戏的优化ppt课件.ppt
53页游戏的优化不仅仅是帧速率我们将谈论什么?n何时何地需要做优化?nC 和 C++ 的比较nC++中的性能问题n算法优先n我们需要 C++ 的高级特性吗?优化无处不在n最好的优化器是你的大脑,而不是编译器n评测而不是臆测nWindows 游戏不应该有特权¨Windows 游戏首先是一个 Windows 程序¨每一点资源的节省都将是有意义的n专家的选择是不优化FPS?n提高了 10 fps 表示什么含义?¨10fps->20fps100fps->120fpsn最高帧速率和平均帧速率nLoading 时间n关心一下 CPU 占用率¨了解 Windows 多一点记时器nTimeGetTimenQueryPerformanceCounternRDTSC¨精度¨多任务环境的影响¨流水线¨测不准原则微观和宏观n微观上的优化¨CPU指令、流水线吞吐量、等待时间¨有限的硬件优化¨有限的编译器优化n宏观上的优化¨算法和代码结构的改进¨减少需要处理的数据量,减少处理的频率和次数C 与 C++ 微观上的比较nC 比 C++ 快 10%?¨不要迷信书本¨证据?nC++ 编译器的改进¨更合理的参数传递方式¨Inline¨堆栈和函数调用¨静态变量的使用C++提供更强的语言特性nnew/deletemalloc/freenC++ exception setjmp/longjmpn虚函数 函数指针数组nTemplate宏n标准库C 的优势n简单n可移植性更强n接口简洁n更少的二义性nCRT 开销小n编译速度快C++ 需要了解更多STLn最被人喜爱的容器¨std::map¨std::string¨std::vector¨std::listn大多数情况他们没有被正确的使用std::mapn插入是很慢的 O(log(N))n有额外的内存消耗 (三个指针+颜色)n大多数情况,我们需要的只是查找¨数组+二分查找nHash map 通常可以提高效率,但不绝对n还有更多的优化手段¨lua 的实现¨大话西游的实现std::stringn还有一种字符串叫作 const char *nconst std::string &n不要依赖 COW (copy-on-write)¨考虑多线程环境¨良好的设计下,cow 通常多余nLua 如何处理字符串?std::vectornstd::vector 并不仅仅是数组n通常我们把 vector 作为数组使用nVector::push_back() 常引起内存重分配nvector::reserve()nvector::clear() 不一定释放内存nPOD 类型的优化n记住:从 C 语言开始,就支持了数组std::listnstd::list 是一个双向链表nstd::list 有内存的额外开销n链表可以在常数时间插入,而当 N 不大的时候,优势并不明显。
正确的使用STLnSTL 是 C++ 提供的强有力的工具nSTL 的使用都是有开销的nSTL 并不能解决我们所有的问题n有些问题可以用 STL ,但那并不是最好的解决方案n让代码达到最佳的性能,需要用我们的大脑重新发明轮子?n不要因为你能够做到而重新实现 STLn几乎所有的 MyVector MyString MyMap 都不如 std::vector std::string std::mapn更多的了解 STL 更多的了解 C++CRT 的使用nsprintf(s,”%d”,n);¨为什么不用 itoa ?nsprintf(s,””);¨为什么不用 s[0]=‘\0’;nprintf 与 putsn不要忽略 CRT 的开销重写 CRT?n优化 memcpy:MMX 版本、SSE 版本…¨任何小于 64k 数据复制的优化都没有意义n重写 string 库,MyStrlen MyStrcmp …¨CRT 可以做的更好nIntrinsic 函数¨#pragma intrinsic()内存优化n展开循环,消除数据相关性n数据并行处理n减少数据结构的尺寸,让数据尽量紧凑的放在一起n数据对齐n了解内存的工作方式内存管理优化nC++ 提供了更灵活的内存管理机制nnew/delete 不一定是最好的方式(STL就不用)n自定义内存分配器n方便调试n分配速度和内存碎片同样重要n注意分离模块的问题¨DLL 最容易出错算法nC++ 更适合实现更复杂的游戏引擎n引擎的复杂度提升,层次的增加,会降低效率n更高的复杂度是为了宏观上的优化脏矩形问题n脏矩形的合并算法并不简单 n合并后的脏区域并不是一个矩形,不方便做图片裁减 n有许多的物体在屏幕上移动 n卷动屏幕 n图像引擎设计的复杂度 改进的脏矩形n分格处理n渲染管道n绘图操作对象化滚动优化n更大的back buffern破碎的分格覆盖优化 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!=mask_color) *dst=*src; }}template












