2010-07-09 3 views
5

Я в настоящее время разрабатываю C# .net xna игровой движок.C# делегат производительности в игре xna

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

Я недавно прочитал, что делегаты могут быть медленными. Делегаты в моей игре вызывают каждый кадр, и мне было интересно, может ли быть удар по производительности?

Update:

я только что нашел этот http://blogs.msdn.com/b/shawnhar/archive/2007/07/09/delegates-events-and-garbage.aspx

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

+0

Напиши небольшой микрочип и узнай себя? – Brian

+0

Что касается вашего обновления - просто не воссоздавайте делегатов каждые 1/60 сек. Однако, даже если бы вы это сделали, все экземпляры были бы в Gen0 в куче, а GC был бы эффективен при сборе Gen0. – codekaizen

+0

@codekaizen За исключением GC на Xbox не является поколением! –

ответ

8

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

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

+0

Да, их нужно получать не более 60 раз в секунду. –

+0

Будет разница в микросекундах, если это всего лишь 60 раз/секунду. Я сомневаюсь, что вы заметили большую разницу между делегатами и функциями, если это было 6000 раз/с. –

+0

@ Крис Да, если это 60 раз в секунду, то влияние производительности будет совершенно незначительным. Если делегаты работают и сохраняют код простым и удобным, то идите. – mikera

1

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

+0

Я сделаю это и дам вам знать –

1

Очевидно, что есть перфект с делегатом и прямым вызовом метода, но с современными версиями CLR (read: post v1.1), это примерно так же быстро, как вызов метода через интерфейс.

Вот таблица грубых мер перфорации: http://msdn.microsoft.com/en-us/magazine/cc507639.aspx

Как всегда, вы должны измерить, чтобы увидеть, если производительность является приемлемой для вас. Поскольку я использовал делегатов в критическом для производительности коде (анимации) и не испытывал проблем, я бы ожидал, что это сработает для вас.

+0

Я этот стол помогает спасибо! –

1

Ваши догадки (и наши догадки) не будут точными и не обязательно будут соответствовать действительной производительности вашей игры. Единственный способ узнать фактический удар производительности - это, по крайней мере, один вид профилирования. Why measure when you can guess?

Помимо получения фактического измерения вашей производительности, подумайте: имеет ли это значение? Если ваша игра работает со скоростью 60 кадров в секунду (я даже наслаждаюсь скоростью 30 кадров в секунду в играх с быстрыми темпами, и я могу справиться со скоростью 20 кадров в секунду, если она медленнее, например, пошаговая игра), и вы способны поражать 300 кадров в секунду в переменное время -ступенчатый режим, и делегаты обойдутся вам в целых 20 кадров (они, вероятно, не будут, кстати) ... ваша игра может поддерживать 60 кадров в секунду в режиме фиксированного времени.

1

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

Одна вещь, чтобы не упускать из виду, что может быть проблемой, является проблемой, если вы повторно создаете делегаты в каждом кадре - в этом случае вы можете создавать избыточный мусор, что уменьшит вашу производительность. Тем не менее, используйте инструменты, такие как профилировщик CLR, чтобы определить сначала, если это проблема для вас.

 Смежные вопросы

  • Нет связанных вопросов^_^