Как правильно провести рефакторинг большого скрипта Unity для оптимизации фрагментов на подклассыC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно провести рефакторинг большого скрипта Unity для оптимизации фрагментов на подклассы

Сообщение Anonymous »

У меня вопрос относительно оптимизации скрипта создания карт в Unity. Недавно я завершил работу над сценарием оптимизации (MapOptimization) для новых блоков и сейчас рассматриваю возможность разделения его функциональности на два дополнительных сценария, чтобы улучшить читабельность и модульность. Сценарий MapOptimization в настоящее время содержит около 1000 строк кода, и я подумываю о создании двух отдельных сценариев: BorderOptimization и CornerOptimization, которые будут обрабатывать границы. и задачи угловой оптимизации соответственно.
Вот структура, к которой я стремлюсь:
  • Оптимизация карты

    MapOptimization

    Оптимизация границ
  • Оптимизация углов

Структуру см. здесь
Мой первоначальный подход заключался в том, чтобы сделать < Strong>BorderOptimization и CornerOptimization наследуются от MapOptimization, так как мне нужны определенные методы и переменные из MapOptimization (например, метод, который проверяет если есть соседний блок выше или ниже текущего блока). Однако я столкнулся с проблемой, когда вызов делегата действия в BorderOptimization вызывал исключение NullReferenceException. По-видимому, это связано с наследованием и тем фактом, что все три скрипта прикреплены как компоненты к одному GameObject, что привело к тому, что ProcessAllCubeDataOfNewChunk вызывался дважды в скрипте MapGenerator. Действие делегата в этом процессе было нулевым во время второй итерации, что привело к сбою.
Хотя я пытался решить эту проблему с помощью шаблона Singleton, в конечном итоге это не оказалось необходимым, поскольку ProcessAllCubeDataOfNewChunk и Start/Awake неожиданно перестали вызываться дважды. (Я подозреваю, что это может быть связано с порядком выполнения Unity, хотя я все еще исследую это.)
Несмотря на устранение этого конкретного дублирования, запрос количества экземпляров MapOptimization все еще показывает 3 активных экземпляра, которые я проверил с помощью:

Код: Выделить всё

int count = FindObjectsOfType(FindObjectsInactive.Include).Length;
Debug.Log("Total instances of MyScript (including inactive): " + count);
Кроме того, чтобы некоторые защищенные переменные в MapOptimization были доступны, мне пришлось сделать их статическими. Насколько я понимаю, использование статических переменных в Unity обычно не рекомендуется, особенно при разработке игр, за исключением случаев крайней необходимости.
Отказ от MapOptimization усложнит структуру, так как для этого потребуются чрезмерные квалификаторы (например, mapOptimization.centerOfXNegativeNeighbourChunk) и затруднится вызов методов MapOptimization. Хранение всего в одном скрипте могло бы сработать, но я предпочитаю избегать этого, если это возможно. Реализация уровня абстракции кажется невыполнимой, учитывая контекст, и сделать MapOptimization абстрактным не вариант, поскольку он содержит [SerializedFields] и другие переменные и методы, требующие реализации.
Вопросы:
  • Можно ли иметь только один экземпляр MapGenerator, когда мне нужно BorderOptimization и CornerOptimization для наследования от него, или я в корне неправильно понимаю наследование?
  • Действительно ли это с точки зрения чистого кода иметь несколько экземпляров MapOptimization, если я не могу ограничить каждый дочерний класс (BorderOptimization, CornerOptimization) одним экземпляром, и будет ли это приемлемо ли делать общие переменные статическими в этом контексте?
  • С точки зрения производительности, сохраняю ли я все в одном скрипте или разделяю его на несколько скриптов, влияние на производительность, которое я проверял по умолчанию и глубоко профилирование кажется похожим.
Есть ли лучший способ структурировать это, чтобы мне не приходилось хранить функции оптимизации границ и углов в одном скрипте ? Мы будем очень признательны за любые советы о том, как решить эту дизайнерскую головоломку.

Подробнее здесь: https://stackoverflow.com/questions/791 ... nto-subcla
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»