一、quake3在性能方面的做了很大的优化,
如:1. 自己的内存分配机制,memzone
2. 自己的底层函数,memcpy等
改写为C++后应该保证系统原来的性能,我主要从以下方面考虑
1。 不使用stl,异常。stl库是c++相对c性能差的主要原因,因此坚决不能用。
2。采用对象缓冲池机制,在系统初始化构造所有对象,尽量避免动态构造对象。
3. 保持原来底层函数,只是简单封装
4. 尽量避免虚函数、多重继承等特性。
二、quake3代码虽然是采用c编写,但具有很多面向对象的思想,改写起来还算方便。
但Cmd_AddCommand (实现函数与命令关联的功能)在c语言中采用函数指针实现。
由于c++ 成员函数没有不是函数指针,所以要通过其它方式实现。
1. static 的成员函数,
这种方法最简单,但无法访问类的成员变量。
2. 采用代理实现,代码如下
struct handle {
virtual void invoke(void) = 0;
virtual ~handle() {}
};
template <class _Ty>
struct delegate : handle {
typedef void (_Ty::*pfun)(void);
typedef _Ty *pcls;
delegate(pfun the_fun, pcls the_cls)
: cls(the_cls) ,fun(the_fun) {
void *p = *(void**)&fun;
}
virtual void invoke(void){
(cls->*fun)();
}
private:
pfun fun;
pcls cls;
};
缺点:采用了虚函数,性能有所损失。
3. 采用汇编实现
__asm{
mov ecx cls
call fun
}
cls 为void * 的对象指针
fun 为void * 的成员函数指针
采用如下代码,将成员函数指针强制转化为void*
template <class T>
inline void *void_cast(void (T::*f)()){
return *(void**)(&f);
}
缺点:移植性差