По сути, единственная серьезная проблема с производительностью, о которой нужно знать в C #, которая отличается от той, которую вы должны знать в C ++, - это сборщик мусора. Просто не выделяйте память во время основного игрового цикла, и все будет в порядке. Вот пост в блоге, который подробно описан .
Теперь к вашим вопросам:
1) Если итератор коллекции фреймворка можно реализовать как тип значения (без создания мусора), то обычно (всегда?) Это так. Вы можете безопасно использовать foreach
, например, List<>
.
Вы можете проверить, выделяете ли вы в свой основной цикл, используя CLR Profiler .
2) Используйте List
s вместо массивов. Они будут обрабатывать изменение размера для вас. Вам следует использовать свойство Capacity
, чтобы заранее выделить достаточно места перед началом игры, чтобы избежать проблем с сборкой мусора. Используя массивы, вам просто нужно реализовать все эти функции самостоятельно - безобразно!
GC запускает распределение (не когда память становится свободной). На Xbox 360 он включается на каждый выделенный 1 МБ и работает очень медленно. В Windows это немного сложнее, но также не оказывает такого большого влияния на производительность.
3) C # делегаты чертовски быстры. И быстрее, чем большинство людей ожидают. Они примерно соответствуют вызовам методов на интерфейсах. Здесь и здесь - это вопросы, которые предоставляют больше подробностей о производительности делегата в C #.
Я не могу сказать, как они сравниваются с опциями C ++. Вы должны были бы измерить это.
4) Нет. Я уверен, что этот код будет выдавать идентичный IL. Вы можете разобрать его и проверить или профилировать.
Я мог бы добавить - не проверяя себя - я подозреваю, что event myDelegate
будет медленнее, чем простая myDelegate
, если вам не нужна вся магия event
.