游戏的优化 不仅仅是帧速率.

Slides:



Advertisements
Similar presentations
高级服务器设计和实现 1 —— 基础与进阶 余锋
Advertisements

四資二甲 第三週作業 物件導向程式設計.
Memory Pool ACM Yanqing Peng.
第一章 C语言概述 计算机公共教学部.
编译原理上机实习
基于解释性语言的手机跨平台架构 Sloan Yi. Qt MTK.
勾股定理 说课人:钱丹.
類別與物件 Class & Object.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
Using C++ The Weird Way Something about c++11 & OOP tricks
走向C++之路 WindyWinter WindyWinter感谢诸位前来捧场。
Signutil.
导入 STL的概念与组成 Iterator(迭代器) Container(容器) Algorithm(算法) Adaptors(配接器)
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
程序设计期末复习 黎金宁
第三章 C++中的C 面向对象程序设计(C++).
第12章 從C到C++語言 12-1 C++語言的基礎 12-2 C++語言的輸出與輸入 12-3 C++語言的動態記憶體配置
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
文件读写实践 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
人教版数学四年级(下) 乘法分配律 单击页面即可演示.
泛型委托 泛型接口、方法和委托.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第七章 操作符重载 胡昊 南京大学计算机系软件所.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
SOA – Experiment 2: Query Classification Web Service
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
潘爱民 C++ Overview 潘爱民
顺序表的删除.
C#程序设计基础 $3 成员、变量和常量.
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
VisComposer 2019/4/17.
Aspect Oriented Programming
Oop8 function函式.
保留字與識別字.
分裂对象模型 C++ otcl.
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
信号量(Semaphore).
本节内容 类成员的访问控制 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第 9 章 建構函式與解構函式.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
第四章 函数 丘志杰 电子科技大学 计算机学院 软件学院.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
_03宽字符与Unicode编程 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
本节内容 结构体.
美丽的旋转.
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
24 or 1024? PWN Jawbone Up24 手环.
插入排序的正确性证明 以及各种改进方法.
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
C++程序语言设计 Chapter 14: Templates.
本节内容 this指针 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Presentation transcript:

游戏的优化 不仅仅是帧速率

我们将谈论什么? 何时何地需要做优化? C 和 C++ 的比较 C++中的性能问题 算法优先 我们需要 C++ 的高级特性吗?

优化无处不在 最好的优化器是你的大脑,而不是编译器 评测而不是臆测 Windows 游戏不应该有特权 专家的选择是不优化 Windows 游戏首先是一个 Windows 程序 每一点资源的节省都将是有意义的 专家的选择是不优化 Popo龙珠的例子: 热点在python 接口的调用而不是一开始认为的图象显示

FPS? 提高了 10 fps 表示什么含义? 最高帧速率和平均帧速率 Loading 时间 关心一下 CPU 占用率 10fps->20fps 100fps->120fps 最高帧速率和平均帧速率 Loading 时间 关心一下 CPU 占用率 了解 Windows 多一点

记时器 TimeGetTime QueryPerformanceCounter RDTSC 精度 多任务环境的影响 流水线 测不准原则 RDTSC 精度没有想象的高,而且受流水线影响(调用 cpuid)

微观和宏观 微观上的优化 宏观上的优化 CPU指令、流水线吞吐量、等待时间 有限的硬件优化 有限的编译器优化 算法和代码结构的改进 减少需要处理的数据量,减少处理的频率和次数 吞吐量 throughput 等待时间 latency 硬件优化掉部分操作,保证逻辑正确

C 与 C++ 微观上的比较 C 比 C++ 快 10%? C++ 编译器的改进 不要迷信书本 证据? 更合理的参数传递方式 Inline 堆栈和函数调用 静态变量的使用 Thiscall, stdcall, 函数返回 add esp,xxx 堆栈的起源,CPU 指令针对主流语言的优化

C++提供更强的语言特性 new/delete malloc/free C++ exception setjmp/longjmp 虚函数 函数指针数组 Template 宏 标准库 函数重载等方便开发者写出质量更高的代码 C++ 多采用空间换取时间的策略 几乎在所有情况下,时间效率都大过 C

C 的优势 简单 可移植性更强 接口简洁 更少的二义性 CRT 开销小 编译速度快 C 的目标代码普遍小于 C++

C++ 需要了解更多

STL 最被人喜爱的容器 大多数情况他们没有被正确的使用 std::map std::string std::vector std::list 大多数情况他们没有被正确的使用

std::map 插入是很慢的 O(log(N)) 有额外的内存消耗 (三个指针+颜色) 大多数情况,我们需要的只是查找 数组+二分查找 Hash map 通常可以提高效率,但不绝对 还有更多的优化手段 lua 的实现 大话西游的实现 Vc 7.1 每个node要消耗 14字节 参考:《effctive c++》 Lua 的 map

std::string 还有一种字符串叫作 const char * const std::string & 不要依赖 COW (copy-on-write) 考虑多线程环境 良好的设计下,cow 通常多余 Lua 如何处理字符串?

std::vector std::vector 并不仅仅是数组 通常我们把 vector 作为数组使用 Vector::push_back() 常引起内存重分配 vector::reserve() vector::clear() 不一定释放内存 POD 类型的优化 记住:从 C 语言开始,就支持了数组 VC 里 100 次 push_back 会引起 13 次内存重新分配

std::list std::list 是一个双向链表 std::list 有内存的额外开销 链表可以在常数时间插入,而当 N 不大的时候,优势并不明显。

正确的使用STL STL 是 C++ 提供的强有力的工具 STL 的使用都是有开销的 STL 并不能解决我们所有的问题 让代码达到最佳的性能,需要用我们的大脑

重新发明轮子? 不要因为你能够做到而重新实现 STL 几乎所有的 MyVector MyString MyMap 都不如 std::vector std::string std::map 更多的了解 STL 更多的了解 C++

CRT 的使用 sprintf(s,”%d”,n); sprintf(s,””); printf 与 puts 不要忽略 CRT 的开销 为什么不用 itoa ? sprintf(s,””); 为什么不用 s[0]=‘\0’; printf 与 puts 不要忽略 CRT 的开销

重写 CRT? 优化 memcpy:MMX 版本、SSE 版本… 重写 string 库,MyStrlen MyStrcmp … 任何小于 64k 数据复制的优化都没有意义 重写 string 库,MyStrlen MyStrcmp … CRT 可以做的更好 Intrinsic 函数 #pragma intrinsic()

内存优化 展开循环,消除数据相关性 数据并行处理 减少数据结构的尺寸,让数据尽量紧凑的放在一起 数据对齐 了解内存的工作方式 更进一步的讨论超出了本次的讨论范围

内存管理优化 C++ 提供了更灵活的内存管理机制 new/delete 不一定是最好的方式(STL就不用) 自定义内存分配器 方便调试 分配速度和内存碎片同样重要 注意分离模块的问题 DLL 最容易出错 多种分配方式。

算法 C++ 更适合实现更复杂的游戏引擎 引擎的复杂度提升,层次的增加,会降低效率 更高的复杂度是为了宏观上的优化

脏矩形

问题 脏矩形的合并算法并不简单 合并后的脏区域并不是一个矩形,不方便做图片裁减 有许多的物体在屏幕上移动 卷动屏幕 图像引擎设计的复杂度

改进的脏矩形 分格处理 渲染管道 绘图操作对象化

滚动优化 更大的back buffer 破碎的分格

覆盖优化

C++的高级特性 天使还是恶魔?

Template 避免重复的代码 template <bool mask_blit> 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 <bool mask_blit> void _blit(pixel *dst,const pixel *src,size_t s)

void blit(pixel *dst,const pixel *src,size_t s) { _blit<false>(dst,src,s); } void mask_blit(pixel *dst,const pixel *src,size_t s) _blit<true>(dst,src,s);

矩阵运算 Matrix A,B,C; A=B+C; 如何避免临时对象的返回? 转化为 A=B; A+=C; Matrix operator+(const Matrix &lhs,const Matrix &rhs); Matrix & my_type::operator=(const Matrix &v); 如何避免临时对象的返回? 转化为 A=B; A+=C;

Expression Templates template<typename T> class add_type { const T& _lhs; const T& _rhs; public: add_type(const T &lhs,const T &rhs) :_lhs(lhs),_rhs(rhs) {} T& calculate(T &result) const { result=_lhs; result+=_rhs; return result; } }; template <typename T> add_type<T> operator+(const T &a,const T &b) { return add_type<T>(a,b); http://osl.iu.edu/~tveldhui/papers

class Matrix { /* ... */ Matrix& operator+=(const Matrix &v); Matrix& operator=(const add_type<Matrix> &v) { return v.calculate(*this); }

编译时计算 template<int N> class factorial { public: enum { value = N * factorial<N-1>::value }; }; template<> class factorial<1> { enum { value = 1 };

冒泡排序 inline void compare_swap(int &a,int &b) { if (a>b) { int t=a; b=t; } void sort(int *data,int n) for (int i=0;i<n-1;i++) { for (int j=i+1;j<n;j++) { compare_swap(data[i],data[j]);

template<int N> struct inner_loop { static inline void expand(int* data) { compare_swap(*data, data[N]); inner_loop<N-1>::expand(data); } }; template<> struct inner_loop<0> { static inline void expand(int*) {} struct sort { sort<N-1>::expand(++data); template<> struct sort<1> { static inline void expand(int* data) {}

int main() { int a[]={3,2,1}; const int len=sizeof(a)/sizeof(a[0]); sort<len>::expand(a); for (int i=0;i<len;i++) { printf("%d,",a[i]); } // sort<len>::expand(a) 展开后的代码 compare_swap(*data,data[2]); compare_swap(*data,data[1]); ++data;

尽可能的在编译时运算? 还有更多的 template 技巧 滥用 template 的后果 编译速度下降 模块间耦合度增加 《Modern C++ Design - Generic Programming and Design Pattens Applied》 滥用 template 的后果 编译速度下降 模块间耦合度增加 对开发伙伴要求增加 调试不便

编译效率同样重要 尽可能的,正确的,使用动态连接库 允许的话,用 .c 编写部分代码 减少 .h 依赖 简单的东西更具有美感 预编译头文件是万恶之源 简单的东西更具有美感

Q&A http://www.codingnow.com