Много кнопок - это всегда плохо. Как говаривал Стив Джобс, если на экране у пользователя вдруг оказывается больше одной кнопки, вы подвергаете его пытке выбора, на какую из них нажать. )))))
Понятие "медленный" - всегда сравнительное. Например, в моей юнитевской библиотеке телеграмма, я с помощью reflections вызываю "функции событий" API, на основе пришедших с сервера данных. И в данном случае (применительно к данной задаче) это в высшей степени быстро и правильно. И попытка "оптимизировать" это формированием каких-либо вспомогательных словарей, усложнило бы код намного значительнее, чем дало бы выигрыш в производительности.
То есть, использование тех или иных подходов всегда целесообразно/нецелесообразно применительно в той или иной задаче.
Если, как вы говорите, потери в производительности нет - значит, скорее всего, всё у вас правильно. =)
AABB писал(а):Они создаются на лету: берётся класс, с помощью reflections ... при создании каждой кнопки создаётся корутина, которая каждый фрейм присваивает тексту кнопки значение поля, через FieldInfo.GetValue.
"Создание на лету" у вас происходит один раз, при формировании интерфейса. Тут вопросов к производительности быть не может. Следовательно, раз в вашем случае оказалось удобнее формировать с помощью reflections - значит так правильно.
А вот множество корутинов, равно как и постоянное присваивание значений (в холостую), равно как и столь частое обращение через FieldInfo - это всё конечно же не оптимально.
Оптимизация:а. Первое, что приходит в голову, зачем каждый раз обращаться через FieldInfo.GetValue? При создании корутина берите один раз через reflections переменную, а далее, каждый фрейм просто присваивайте данной переменной значение. Зачем вызывать "медленную" функцию в цикле, вместо того, что бы вызвать её один раз перед запуском цикла, а далее уже, в теле цикла только пользоваться её результатом (полученной ссылкой на переменную).
б. Много корутинов - плохо? Тогда почему не сделать один массив, и каждый раз, при добавлении новой кнопки, добавлять не новый корутин с ссылкой на текст данной кнопки, а ссылку на текст данной кнопки - в этот массив. И тогда вам понадобиться один единственный корутин (или Update), в котором вы просто будете каждый раз пробегаться по массиву, обновляя его значения.
в. Постоянное обновление значений переменной в холостую - явно не очень хороший подход. Вероятно имеет смысл делать это через события. Ну, или, обновлять значение переменных через метод доступа set, в который добавить код обновления интерфейсного текста.
С Наступившим! =)
Красота — не прихоть полубога, а хищный глазомер простого столяра.