Разработка программного модуля для компьютерной игры

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



ится в дереве system, поэтому класс directory агрегирован классом system.

Рис. 1.7. Диаграмма класса sub_fs

На рисунке 1.7 изображена диаграмма класса sub_fs, который является интерфейсом хранилища (подсистемы). Класс предоставляет следующий интерфейс:

) Получение физического расположения подсистемы.

) Доступность подсистемы на запись.

) Существование файла в подсистеме.

) Атрибуты файла: размер, доступ, время создания, директория ли он.

) Создать итератор по пути и маске поиска.

) Открыть файл на запись или на чтение.

) Удалить файл.

) Создать реальные директории по пути.

) Как было сказано выше, подсистему агрегирует класс directory. Создаваемый объект sub_fs_iter имеет ссылку на sub_fs.

Рис. 1.8. Диаграмма класса sub_fs_iter

На рисунке 1.8 изображена диаграмма класса sub_fs_iter, который является итератором подсистемы. Объекты данного класса, используются алгоритмами get_files и get_descriptor. Основные методы - получение текущего дескриптора и оператор инкремента. Содержит ссылку на свою подсистему.

Рис. 1.9. Диаграмма класса file_id

На рисунке 1.9 изображена диаграмма класса file_id, который является дескриптором файла в VFS. Класс содержит своё полное имя и ссылку на подсистему. В текущей реализации в интерфейсе file_id есть набор методов для получения атрибутов файла, которые являются делегированием соответствующих из подсистемы.

Для полноты картины стоит упомянуть вспомогательные классы io_file и iterator, диаграммы которых помещены на рисунки 1.10 и 1.11. Класс io_file служит для предоставления потока на файл, хранит в себе исходящий либо входящий поток и экземпляр file_id. Класс iterator служит для построения контейнеров дескрипторов в реализации алгоритмов get_files и get_descriptor.

Рис. 1.10. Диаграмма класса io_file

Рис. 1.11. Диаграмма класса iterator

1.2.5 Конфигурация технических средств

Ограничения на конфигурацию технических средств накладываются проектом в целом. В проектах MiSTland, согласно тестированию, VFS никогда не занимала сколько-нибудь значительного объема памяти (это связано с небольшими объемами её собственных данных) и не отбирала сколько-нибудь заметное количество процессорного времени. Наиболее серьезно, как показали тесты, машину нагружает распаковка архива.

Требования к программному обеспечению - наличие Windows 98 и старше в случае использования подсистемы ресурсов исполняемых файлов Win32.

1.2.6 Алгоритмы работы модуля

На рис. 1.12 изображен алгоритм работы кода, собирающего последовательность файлов по маске поиска. Этот алгоритм используется при формировании списка итерирования и при нахождении отдельного файла для открытия потока либо для получения его свойств.

Рис.1.12. Схема алгоритма get_files

Необходимо пояснить работу алгоритма. Клиентский код предоставляет путь до искомой последовательности и маску поиска (допустимо конкретное имя файла), а также осуществляет выбор механизма сортировки дескрипторов файлов с одинаковыми виртуальными именами. Используется идиома предикат, заимствованная из STL. Может использоваться предикат по умолчанию, либо же предоставленный пользовательским кодом. Потом запрашивается ядро VFS, у ядра запрашивается дерево виртуальных директорий. Дерево обходится начиная от корня, при каждой итерации выделяется текущая директория, в соответствии с ней корректируется путь поиска: путь директории считается виртуальной частью пути поиска, остальная часть - реальной, соответственно реальная часть пути должна быть передана подсистемам. Из директории берется список замонтированных в неё подсистем, к каждой подсистеме формируется запрос на существование файла с именем реальная часть + маска поиска. Для этого используется собственный итератор подсистемы. Все найденные таким образом дескрипторы сохраняются в контейнер со структурой, несколько напоминающей графический эквалайзер (рис.1.13).

Рис. 1.13. Схема контейнера файлов виртуальной директории

Контейнер является списком, элементами которого являются списки дескрипторов с одинаковыми виртуальными именами, отсортированных в соответствии с переданным предикатом.

На рисунке 1.14 изображен алгоритм работы кода, получающего дескриптор файла по введенному имени. Работа аналогична алгоритму get_files, за исключением таких деталей:

) В системе существует кэш для одиночных запросов, поэтому перед запуском сканирования дерева проверяется он - в случае совпадения имен искомого и закешированного дескрипторов выдается закешированный.

) Наружу вместо контейнера выдается первый его элемент.

На рисунке 1.15 изображен алгоритм работы кода, монтирующего и демонтирующего подсистемы.

При монтировании клиентский код должен создать подсистему и передать её ядру VFS вместе с виртуальным путем, по которому должна находиться эта подсистема. У ядра запрашивается дерево и обходится в поиске директории с именем, совпадающим с желаемым виртуальным путем. Если такая находится, подсистема монтируется в неё. Если нет, берется директория с наиболее длинным подходящим виртуальным путём и в ней создаются недостающие директории, в последнюю из них монтируется подсистема. При демонтировании подсистемы VFS, конечно, ограничивается только поиском по дереву.

Рис. 1.14. Схема алгоритма get_descriptor

Рис. 1.15. Схема алгоритма mount

1.2.7 Методика тестирования

Во время реализации модуля широко применялся подход так на