Если необходимо было думать о событии как о списке абонентов в коде все, что Вы делаете, регистрирует подписчика. Количество инструкций должно было достигнуть, который, вероятно, будет минимален на уровне CLR.
Если Вы хотите, чтобы Ваш код был универсальным или динамичным, то Вы - потребность проверить, подписано ли что-то до вызова события. Механизм события/делегата C# и.NET предоставляет это Вам по очень небольшому количеству стоимости (с точки зрения ЦП).
Если бы Вы действительно обеспокоены каждым тактом, Вы никогда не писали бы универсальную/динамичную игровую логику. Это - компромисс между удобным в сопровождении/настраивавшимся кодом и прямой скоростью.
Записанный хорошо, я одобрил бы события/делегатов, пока я не мог доказать, что это - проблема.
Единственным путем Вы будете действительно знать, является ли это проблема для Вас, путем профилирования кода - который необходимо сделать так или иначе для любой разработки игр!
Важно понять, что события в C# не ставятся асинхронные события в очередь (как, например, очередь сообщений Windows). Они - по существу список указателей функции. Так генерирование события не имеет худших последствий производительности, чем итерация через список указателей функции и вызова каждого.
В то же время поймите, что из-за этого, события синхронны. Если Ваш слушатель события будет медленным, то Вы замедлите класс, генерирующий события.
В мое дополнительное время далеко от реальной работы, я изучал XNA также.
По моему скромному мнению (или не столь скромный, если Вы спрашиваете моих коллег) то, что издержки дескрипторов события будут разбиты другими элементами в игре, такими как рендеринг. Учитывая интенсивное использование событий в нормальном программировании .NET я был бы базовым кодом, хорошо оптимизирован.
Честно говоря, я думаю, идя в метод UpdateCameras, могла бы быть преждевременная оптимизация. Система событий, вероятно, имеет больше использования кроме камеры.
Основной вопрос здесь, кажется: "Что издержки связаны с использованием Делегатов C# и Событий?"
События имеют небольшие значительные издержки по сравнению с вызовом регулярной функции.
Использование Делегатов может создать неявный и таким образом скрытый мусор. Мусорный бак быть основной производительностью причины проблемы особенно на XBox360.
Следующий код генерирует приблизительно 2 000 байтов мусора в секунду (на уровне 60 кадр/с) в форме объектов EntityVisitor:
private delegate void SpacialItemVisitor(ISpacialItem item);
protected override void Update(GameTime gameTime)
{
m_quadTree.Visit(ref explosionCircle, ApplyExplosionEffects);
}
private void ApplyExplosionEffects(ISpacialItem item)
{
}
Пока Вы стараетесь не генерировать мусор, делегаты достаточно быстры в большинстве целей. Из-за скрытых опасностей я предпочитаю избегать их и интерфейсов использования вместо этого.
XNA поощряет использование интерфейсов, событий и делегатов управлять чем-то записанным с ним. Смотрите на связанные с GameComponent классы, которые настраивают это для Вас.
Ответ, "Так, как Вы чувствуете себя довольными в".
Для разработки немного, Если, например, Вы берете и наследовались gamecomponent классу в cameracontroller класс и добавляют его к Игре. Набор компонента. Затем можно создать классы камеры и добавить их к cameracontroller.
Выполнение этого заставит cameracontroller регулярно называться и сможет выбрать и активировать надлежащую камеру или несколько камер если, для именно это Вы идете.
Вот пример этого (Все его учебные руководства превосходны): ReoCode
Как в стороне, Вам могло бы быть интересно знать, что Shawn Hargreaves, исходный разработчик Allegro, является одним из основных разработчиков в команде XNA :-)