Из того, что я понимаю, вам следует избегать выделения большого количества объектов из кучи в XNA, потому что это приводит к плохой производительности. Но поскольку Vector2
- это struct
, мы не размещаем здесь ничего в куче, так что здесь проблем не должно быть.
Теперь, если у вас есть замкнутый контур, как у вас, в приложении, критичном к производительности, например, в игре, вам всегда придется думать о производительности, нет никакого обхода.
Если мы посмотрим на код для LevelPosition
, вы дважды вызываете геттер для WorldPosition
и, возможно, еще несколько геттеров. Получатель для WorldPosition
, вероятно, вызывает несколько других получателей. (Трудно сказать, что именно происходит без источника, потому что вызов геттера и доступ к полю выглядят совершенно одинаково.)
Вызов getter, который на самом деле является просто вызовом специального метода, обычно довольно быстрый и может быть даже быстрее, если компилятор решит использовать встраивание. Но все вызовы складываются вместе, особенно если вы вызываете их в цикле.
Решением для этого является своего рода кэширование. Одним из вариантов было бы сделать LevelPosition
полем и разработать систему для его обновления при необходимости. Это может сработать, но может также снизить производительность, если вам нужно обновлять его чаще, чем вы читаете.
Другое решение, как вы обнаружили, заключается в кэшировании результата в локальной переменной. Если вы знаете, что это правильно, то есть, что значение свойства не изменится во время выполнения цикла, то это здорово! Вы решили свою проблему с производительностью и сделали это с помощью всего одной строки кода, которая легко понятна любому программисту. Что еще ты хочешь?
Позвольте мне повторить это. Вы нашли решение проблемы с производительностью, которая:
- работает
- просто реализовать
- легко понять
Я думаю, что такое решение будет очень трудно победить.