Игровое программирование и обработчики событий

12
задан FlySwat 15 September 2008 в 15:37
поделиться

6 ответов

Если необходимо было думать о событии как о списке абонентов в коде все, что Вы делаете, регистрирует подписчика. Количество инструкций должно было достигнуть, который, вероятно, будет минимален на уровне CLR.

Если Вы хотите, чтобы Ваш код был универсальным или динамичным, то Вы - потребность проверить, подписано ли что-то до вызова события. Механизм события/делегата C# и.NET предоставляет это Вам по очень небольшому количеству стоимости (с точки зрения ЦП).

Если бы Вы действительно обеспокоены каждым тактом, Вы никогда не писали бы универсальную/динамичную игровую логику. Это - компромисс между удобным в сопровождении/настраивавшимся кодом и прямой скоростью.

Записанный хорошо, я одобрил бы события/делегатов, пока я не мог доказать, что это - проблема.

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

10
ответ дан 2 December 2019 в 18:23
поделиться

Важно понять, что события в C# не ставятся асинхронные события в очередь (как, например, очередь сообщений Windows). Они - по существу список указателей функции. Так генерирование события не имеет худших последствий производительности, чем итерация через список указателей функции и вызова каждого.

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

4
ответ дан 2 December 2019 в 18:23
поделиться

В мое дополнительное время далеко от реальной работы, я изучал XNA также.

По моему скромному мнению (или не столь скромный, если Вы спрашиваете моих коллег) то, что издержки дескрипторов события будут разбиты другими элементами в игре, такими как рендеринг. Учитывая интенсивное использование событий в нормальном программировании .NET я был бы базовым кодом, хорошо оптимизирован.

Честно говоря, я думаю, идя в метод UpdateCameras, могла бы быть преждевременная оптимизация. Система событий, вероятно, имеет больше использования кроме камеры.

1
ответ дан 2 December 2019 в 18:23
поделиться

Основной вопрос здесь, кажется: "Что издержки связаны с использованием Делегатов 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)
    {
    }

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

2
ответ дан 2 December 2019 в 18:23
поделиться

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

Ответ, "Так, как Вы чувствуете себя довольными в".

Для разработки немного, Если, например, Вы берете и наследовались gamecomponent классу в cameracontroller класс и добавляют его к Игре. Набор компонента. Затем можно создать классы камеры и добавить их к cameracontroller.

Выполнение этого заставит cameracontroller регулярно называться и сможет выбрать и активировать надлежащую камеру или несколько камер если, для именно это Вы идете.

Вот пример этого (Все его учебные руководства превосходны): ReoCode

1
ответ дан 2 December 2019 в 18:23
поделиться

Как в стороне, Вам могло бы быть интересно знать, что Shawn Hargreaves, исходный разработчик Allegro, является одним из основных разработчиков в команде XNA :-)

1
ответ дан 2 December 2019 в 18:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: