我有这个库,其中有一个用于不同类型元素的通用显示列表,对于系统的每个循环,这个显示列表是通过对添加到列表中的每个对象调用 render() 方法来呈现的。 现在,列表可以包含不同类的元素,比如 A、B、C、D,它们都有自己特定的 void render();
我已经找到了两种可行的方法,并且想听听哪种方法在速度方面的性能更好(或者如果有更好的方法不同于我正在评估的方法,请提出建议)。
选项 1: 最简单的方法是,我在 A、B、C..etc 类中的每一个共有的父类(super class)上有一个 int 类型变量,它标识该类的编号。因此,当显示列表正在呈现时,有一个很大的 switch() {} 询问类型,并根据此变量的值,对相应类进行强制转换以呈现它,例如:
case OBJ_A:
((ObjA*)obj)->render();
break;
那是因为所有对象都作为指向父类(super class)类型的指针添加到列表中。
选项 2: 使用函数指针。 (如 http://www.newty.de/fpt/functor.html 中所述)。 这里我们有一个模板仿函数类,它可以接收任何其他类作为参数并存储指向渲染函数的指针引用。所以当遍历它时,仿函数类将进行转换......我不知道这在运行时的含义。
感谢您对此的任何帮助!
最佳答案
为什么不用虚函数?
class Renderable {
public:
virtual void Render() = 0;
};
class ARenderable : public Renderable {
public:
virtual void Render() {
// implement this
}
}
class BRenderable : public Renderable {
public:
virtual void Render() {
// implement this
}
}
// .. and then keep a list of Renderable's and call Render() on all of them
std::vector<Renderable*> rr;
rr.push_back(new ARenderable());
rr.push_back(new BRenderable());
// (pseudocode)
for each .. Renderable * r
r->Render()
这三种情况下的运行时开销都是相似的——基本上,虚函数是函数指针,只是非常优雅的指针;-)使用这种策略来解决此类问题在 C++ 中是惯用的,在对象中是基础面向编程。
关于c++ - 自定义 C++ 渲染系统中的性能比较。为不同的类调用渲染函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5410291/