游戏循环性能和组件方法

top*_*dev 3 architecture performance components game-loop

我有一个组织游戏循环的想法.我对性能有些怀疑.可能有更好的做事方式.

考虑一下你有一系列游戏组件.他们都被称为在每次游戏循环迭代中做一些事情.例如:

GameData data; // shared
app.registerComponent("AI", ComponentAI(data) );
app.registerComponent("Logic", ComponentGameLogic(data) );
app.registerComponent("2d", Component2d(data) );
app.registerComponent("Menu", ComponentMenu(data) )->setActive(false);
//...
while (ok)
{
//...
app.runAllComponents();
//...
}
Run Code Online (Sandbox Code Playgroud)

优点:

  1. 良好的基于​​组件的应用程序,没有依赖性,良好的模块化
  2. 我们可以动态激活/停用,注册/取消注册组件
  3. 一些组件可以透明地删除或替换,系统仍然可以正常工作(更改2d到3d)(团队合作:每个程序员创建他/她自己的组件,不需要其他组件来编译代码)

释疑:

  1. 游戏循环中的内部循环,对Component :: run()进行虚拟调用
  2. 我希望Component :: run()返回bool值并检查此值.如果返回false,则必须停用组件.因此内循环变得更加昂贵.

嗯,这个解决方案有多好?你是否在实际项目中使用过它?

Kri*_*son 5

一些C++程序员对虚函数的开销有太多担忧.与函数无关,虚拟调用的开销通常可以忽略不计.布尔检查也不是很贵.

在最易于维护的代码中执行任何操作.仅在您需要时才进行优化.如果您确实发现需要优化,则消除虚拟呼叫可能不是您需要的优化.

  • 是的,重要的是你的程序每秒需要进行多少次虚函数调用.100000?没问题.但是1000万可能是总CPU时间的显着部分.另一个问题是每个函数调用完成了多少工作.只要大多数虚拟调用执行大量工作,就没有问题. (2认同)