Здавалка
Главная | Обратная связь

Технические примечания



Сборка мусора. Все объекты и акторы в Unreal обрабатываются системой сборки мусора аналогично Java VM. Сборщик мусора Unreal использует функциональность сериализации класса UObject и рекурсивно определяет ссылки на другие объекты каждого активного объекта. В результате, объект не удаляется явно, сборщик мусора отслеживает их использование и удаляет объект только в случае его неиспользования. Этот подход имеет побочный эффект в виде скрытого удаления неиспользуемых объектов, однако это гораздо более эффективно, чем подсчет ссылок и удаление отдельных объектов. Подробнее читайте на странице Сборка мусора .

UnrealScript основан на байт-коде. Код языка UnrealScript компилируется в серии байт-кода, похожие на серии P-кода или байт-кода Java. Это делает UnrealScript независимым от платформы, позволяет осуществлять перенос компонентов клиента и сервера Unreal на другие платформы, то есть на Macintosh или на Unix.

Unreal, как виртуальная машина. Движок Unreal можно рассматривать как виртуальную машину для 3D-игр, как и язык и встроенные иерархии классов Java составляют виртуальную машину для сценариев веб-страниц. Виртуальная машина Unreal изначально портативна (благодаря разделению кода, зависимого от платформы, на отдельные модули) и расширяема (благодаря расширяемой иерархии классов). Однако, у нас нет никаких планов на документирование Unreal VM в объеме, необходимом для ее реализации других на платформах сторонними разработчиками.

Компилятор UnrealScript является трехпроходным. В отличие от C++, компиляция сценариев UnrealScript осуществляется в три разных прохода. В первый проход обрабатываются переменные, структуры, перечисления, константы, состояния, обявления функций и строится каркас каждого класса. На втором проходе код сценариев компилируется в байт-код. Два прохода позволяют собрать и связать сложные иерархии сценариев с круговыми зависимостями без отдельной фазы линковки. Третий проход анализирует и импортирует свойства по умолчанию для классов с использованием значений, указанных в блоке defaultproperties .uc файла.

Устойчивое состояние актора. Важно отметить, что в играх на двежке Unreal пользователь может сохранять игру в любое время, а состояния всех акторов, включая состояния выполнения их сценариев, могут быть сохранены только в то время, когда все акторы находятся на низком уровне стека UnrealScript. В целях устойчивости введено ограничение: латентные функции могут вызываться только из кода состояний. Код состояния выполняется на низком уровне стека, и, таким образом, состояние может быть легко сериализовано. Код функций, особенно, код встроенных функций на C++, может находиться на любом уровне стека, и их состояние не всегда возможно сохранить на диске, а затем восстановить.

Файлы Unreal имеют встроенный (native) двоичный формат. Файлы Unreal содержат индексы, сериализованные в дамп объектов, в частности, в пакеты Unreal. Файлы Unreal аналогичны DLL, они могут включать в себя ссылки на другие объекты, хранящиеся в других файлах Unreal. Такой подход сокращает времян загрузки (каждый пакет не загружается более одного раза), позволяет распространять контент Unreal в подготовленных "пакетах" через Интернет.

Почему UnrealScript не поддерживает статические переменные. C++ поддерживает статические переменные потому, что берет свои корни от низкоуровневого языка. Язык Java поддерживает статические переменные по причинам, которые кажутся не очень хорошо продумаными. Но таким переменным нет места в языке UnrealScript из-за неопределенностей, связанных с сериализацией, выводом и множеством уровней: статические переменные должны иметь "глобальные" семантики, а это означает, что все статические переменные во всех активных уровнях Unreal имеют одинаковое значение. Должны ли они быть в пакете? Должны ли они быть на уровне? Если да, то как они должны быть сериализованы: с классом в его .u файл, или с уровнем в .unr файл? Являются ли они уникальными для базового класса или модифицированные варианты классов имеют свои собственные значения статических переменных? В UnrealScript мы обошли эти проблемы, отказавшись от статических переменных, как от особенности языка, и позволили программистам управлять глобальными переменными путем создания классов. Если вам нужны переменные, которые доступны для всех объектов уровня, то вы можете создать новый класс для хранения этих переменных и, при этом, все переменные будут сериализованы вместе с уровнем. Таким образом исключается неопределенность. Примерами таких классов являются LevelInfo и GameInfo.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.