насколько дорого обходятся обратные вызовы? - PullRequest
3 голосов
/ 21 июня 2010

Я создаю движок рендеринга. И есть два способа создания системы управления задачами. Создание собственных пользовательских обратных вызовов, вызываемых до и после рендеринга, или внедрение системы управления задачами, в которой мне нужно было бы извлечь класс из родительского TaskClass и затем выбросить его в очередь.

Честно говоря, я чувствую, что создавать обратные вызовы лучше, потому что это позволяет мне создавать подсистему управления задачами, независимую от фактического механизма рендеринга. Это позволяет мне больше сосредоточиться на механизме рендеринга и позже беспокоиться об управлении задачами.

Но мой вопрос ... "стоит ли использовать обратные вызовы?" Это обычная практика в интенсивной среде процессора, такой как игровой движок.

Ответы [ 7 ]

5 голосов
/ 21 июня 2010

Относительно стоимости обратных вызовов при использовании указателей на функции в C для этого небольшого фрагмента

void func1() { }

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

  func1();
  funcptr();
}

gcc -S генерирует следующие инструкции ассемблера для тела func2:

movq $func1, -8(%rbp)
movl $0, %eax
call func1
movq -8(%rbp), %rdx
movl $0, %eax
call *%rdx

Таким образом, как и ожидалось, вы платите только за косвенность указателя, т.е. вам не нужно беспокоиться о производительности.

5 голосов
/ 21 июня 2010

Прежде всего, это относительно дорого, если вы будете вызывать эти обратные вызовы на частоте 10000 Гц, да, некоторые реализации обратных вызовов могут быть слишком дорогими. Однако простой обратный вызов на основе указателя на функцию практически не будет содержать служебных данных.

Но самое главное: это пример преждевременной оптимизации, и, разумеется, вы будете вызывать эти обратные вызовы только 60 раз в секунду в среднем со скоростью 30 кадров в секунду. В большинстве игр будут гораздо более важные проблемы с производительностью. Начните с одного метода, профилируйте его, если у вас есть проблемы с производительностью, а если его действительно недостаточно, оптимизируйте его. В любом случае вы, вероятно, потеряете гораздо больше циклов ЦП по математическим или AI-функциям.

Наконец: во многих играх узким местом является GPU, а не CPU;).

2 голосов
/ 21 июня 2010

Обратный вызов - это указатель на функцию. Вызов функции через один не очень дорогой, но, безусловно, вызывает некоторые накладные расходы - функция не будет встроена по крайней мере.

Только вы можете оправдаться, если можете себе это позволить - напишите небольшую тестовую программу и профилируйте ее. В зависимости от того, как часто вы будете вызывать функцию, накладные расходы будут занимать меньшую или большую долю процессорного времени. Без составления прогнозов и анализа ничего не стоит.

0 голосов
/ 22 июня 2010

Если вы используете Visual Studio и рассматриваете систему управления задачами, взгляните на Concurrency Runtime, Parallel Pattern Library и Agents Library в VS 2010 здесь .

Вам не нужно создавать свою собственную систему задач, вы можете построить ее поверх одной.

0 голосов
/ 21 июня 2010

"стоит ли использовать обратные вызовы?"

Это может быть всего лишь стоимость вызова виртуальной функции.

В зависимости от вашей среды, это может быть дороже: если это обратный вызов из режима ядра, например, в режим пользователя, то вам может потребоваться сделать умные и / или дорогие вещи для реализации очевидного преобразования кольца.

Одна из проблем с обратными вызовами - это блокировки: если ваш код многопоточный и / или поточно-ориентированный, то если вы владеете какими-либо блокировками в момент, когда вы вызываете обратный вызов, то (в зависимости от того, что делает код пользователя в обратном вызове) Например, попытайтесь получить больше замков) вы можете зайти в тупик.

0 голосов
/ 21 июня 2010

Обратные вызовы сами по себе не являются дорогостоящими, но следует соблюдать осторожность, чтобы не делать слишком много вычислений. Обычно обратный вызов отправляет сообщение, дает семафор / сигнал и т. Д. И останавливается.

0 голосов
/ 21 июня 2010

Обратные вызовы довольно дешевы, когда они не связаны с замыканиями.

Обратные вызовы с замыканиями немного дороже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...