我正在使用Visual Studio,目前正在使用c ++创建游戏引擎,它是2D模式。目的是学习一般的现代游戏引擎体系结构和基于组件的系统。这意味着我有一个非常注重性能的心态(即使在现代硬件上进行2D开发时,性能并不是一个大问题)。

编译器会优化这样的东西吗?

template<class T>
inline T & Scene::accessComponent(unsigned int id)
{
    if (dynamic_cast(T*) < Transform > ) {
        ...
    }
    else if (dynamic_cast(T*) < Collidable > ) {
        ...
    }
    else if (dynamic_cast(T*) < AnotherComponentType > ) {
        ...
    }

    etc ...
}


我听说,如果函数在顺序调用中进入相同的逻辑门,则编译器可以针对将来的调用进行优化。这也适用于模板化函数吗?编译器是否在顺序调用中优化T是否为相同类型?

我无法剖析任何内容,因为当前代码是一团糟,尚未实现允许accessComponent调用的引擎的不同部分。所以我有点处于计划阶段。

最佳答案

此代码肯定是不应该在面向性能的代码中完成的。它有多个分支机构。从逻辑上讲,每个dynamic_cast检查至少有两个分支:由编译器本身生成的分支(用于检查RTTI)和由if语句生成的分支。

现代硬件中的分支预测器功能强大,但功能有限。至少,它们的数量是有限的,并且如果事件的分布或多或少是均匀的,则它们将失败。

即使分支预测成功,您仍然会失去一些分支计算本身的周期。

我认为根本没有理由进行动态投射。由于您的类已经是多态的,所以只需调用相应的虚方法。

09-10 04:42
查看更多