尽量不让每帧都更新,用回调代替。
重点关注每帧都更新的函数,频繁调用的函数。
重点关注大型的函数,算法效率复杂的函数,优化算法。
需要注意一些细节的开销。
优化思路:不计算,少计算,并发并行计算,转移计算任务,对计算任务的细节优化。
借鉴epoll的高性能设计方案: 线程池的多线程机制,异步事件回调非阻塞,边缘触发对遍历的集合划分分为活跃和非活跃的遍历更少的集合,mmap内存文件映射机制减少拷贝,事件队列检测用了数组结构查询效率变为O(1)。从IO拷贝, 查询的集合空间, 查询的算法, 多线程池, 异步事件回调机制方面进行了非常精细的优化。
一、用回调或观察者来代替每帧update
对于一些界面信息的更新,尽量用回调的机制来实现,而不是每帧update的方式来实现。
能够设计为回调的,能够设计为观察者模式的,都应该设计为回调为观察者。而不是用蛮力的每帧检查。
二、每帧调用,一定要非常手段进行优化
1.尽量避免计算:
存储常量,避免每次都计算。
事件触发的计算,放置到事件发生时候才计算。
尽量避免查找算法:
比如勾八边的需要阴影的字体,需要查询8次并渲染,那么存放第一次,后面的就不用查找了;
能够查找少尽量查找一次存放起来,但是有的对象是必须每次都查找的,比如对象模型。
2.优化计算,写出高效的算法:
优化查找算法:
尽量使用map,set,hash查找算法提高查询效率。
精简算法里面的容器大小,比如迪杰斯特拉算法中,本来是80 x 80的点,却要在构造的8000X8000。
优化排序算法:
如果有排序的,用map存储,重载好<运算符得到的结果就是排序好了的。
优化函数:
使用内联函数。
函数参数尽量使用传递指针引用,结构体或类对象输出也可以用引用参数输出形式,避免过多的构造函数开销。
优化表达式:
速度:移位>乘法>除法。
乘法是加操作,而除法是每步的结果作加法或减法(加减交替法),有的算法还需要恢复上一次的结果(余数恢复法),而且每一步加减后还要进行移位,所以最慢。
因为移位速度快,所以经常被应用。
优化类型转换:
尽量不用dynamic_cast这些,否则也是比较影响性能。
尽量将这些转换提取为常量或者计算一次使用。
三、优化算法复杂的大型函数
这种函数尽管不是每帧调用,但是调用一次都很影响性能。
那么需要尽量避免计算,或者尽量计算一次,如果要计算,也尽量优化计算。
1)减少空间提升效率,空间个数是很影响效率的。
2) 增大空间提升效率,数据结构角度。
3)优化算法,O(n2),O(n),O(log2n),O(1)的角度去不断优化。
也需要从优化查找算法,排序算法,优化函数,优化表达式,优化类型转换角度出发。
四、大量的计算采用多线程
太大量的计算使用多线程,比如解压线程,比如纹理读取解析线程。
一些复杂的图形图像计算,也可以多线程来实现,通过单CPU并发,多CPU并行机制,能够有效的利用CPU性能。
五、分离计算任务,转移到GPU分担计算
利用shader将图形计算转移到GPU。
六、优化细节,减少细节的开销
尽量使用位移,|,&,^这些高效的位操作。
尽量保存更多的常量。
尽量小而频繁调用的函数声明为内联函数。
尽量不要过多的dynamic_cast类型的转换,很影响性能。