回电的代价是多少?

num*_*l25 3 c visual-c++

我正在创建一个渲染引擎.以及我创建任务管理系统的两种方式.创建自己的自定义回调,在渲染之前和之后调用,或者实现一个任务管理系统,在这个系统中,我必须从父TaskClass派生一个类,然后将其抛入队列.

老实说,我觉得创建回调更好,因为它允许我创建独立于实际渲染引擎的任务管理子系统.这使我可以更专注于渲染引擎,并在以后担心任务管理.

但我的问题是......"使用回调是否代价高昂?" 这是一种在处理器密集环境(如游戏引擎)中常见的做法.

Kil*_*nDS 5

首先,昂贵是相对的,如果你将这些回调调用10000Hz,是的,一些回调实现可能成本太高.但是,一个简单的基于函数指针的回调实际上几乎没有开销.

但最重要的是:这是一个过早优化的例子,当然,因为看起来你平均每秒只能在平均30 fps的游戏中称这些回调为60次.在大多数游戏中,性能问题会更加重要.从一个方法开始,在遇到性能问题时对其进行分析,如果确实不够,则优化它.无论如何,你可能会在数学或AI函数上放松更多的cpu周期.

最后:在许多游戏中,瓶颈是GPU,而不是CPU;).


Gre*_*g S 5

关于使用C中的函数指针执行回调的成本,对于这个小片段

void func1() { }

void func2() 
{
  void (*funcptr)() = func1;

  func1();
  funcptr();
}
Run Code Online (Sandbox Code Playgroud)

gcc -S为func2的主体生成以下汇编程序指令:

movq $func1, -8(%rbp)
movl $0, %eax
call func1
movq -8(%rbp), %rdx
movl $0, %eax
call *%rdx
Run Code Online (Sandbox Code Playgroud)

因此,正如预期的那样,您只需支付指针间接费用,即您不应该担心性能.