Диплом_Frozen / отчет о преддипломной практике
.docОтчет о преддипломной практике.
Компания «МиСТ ленд – ЮГ» занимается разработкой компьютерных игр. Современная компьютерная игра – крупный и сложный программный комплекс, и затраты только на программную разработку измеряются сотнями человеко-месяцев. Одной из отличительных черт игры как компьютерного приложения является работа с огромным количеством ресурсов. Объемы графики, музыки, видео, скриптов исчисляются гигабайтами, ресурсы проектов насчитывают тысячи файлов. Имеет место проблема организации ресурсов, в частности, информации на диске. Применение СУБД в данном случае сопряжено с техническими и экономическими сложностями:
-
Требуется специальная обработка данных для помещения их в БД, впоследствии будет затруднено их редактирование.
-
СУБД – отдельное приложение, необходимо программно устанавливать связь между процессами.
-
Высокая стоимость быстродействующих СУБД. В случае с распространением игры как товара, как правило, требуется отдельное лицензирование.
Ранее проблема решалась построением иерархических структур на диске. В силу внешних причин отдельные части ресурсов могут быть заархивированы и/или зашифрованы. Часть ресурсов может быть оставлена на ключевом носителе (сейчас в этой роли выступает оптический диск), который тоже может быть защищен по какой-либо технологии (используется StarForce). Также ресурсы могут быть размещены на сетевом сервере, что накладывает свои требования к доступу, верификации и иногда к защите. Особенности проектов «МиСТ ленда» диктуют и такое требование: необходима возможность работы с несколькими параллельными версиями ресурсов – это нужно для корректной установки патчей (пакетов исправлений и дополнений) и пользовательских модификаций. В результате формируется распределенный комплекс весьма сложных по структуре хранилищ. Кроме того, необходимость знать о типах хранилищ и особенностях работы с ними, вызывает резкое усложнение остального кода проекта и затрудняет его повторное использование.
Студент группы МП-55 Ересов А.Е., направленный в «МиСТ ленд – ЮГ» на преддипломную практику, решая описанную проблему, в рамках разработанного им ТЗ разработал модуль VFS, внедренный в проект «Альфа Антитеррор».
В разработанном модуле применен подход к организации файловых хранилищ, известный как «виртуальная файловая система». Основные положения этого подхода:
-
Любые обращения к файловой системе идут по виртуальному «дереву» каталогов, начиная с корня (root).
-
Любое файловое хранилище – носитель, архив, сетевой каталог и т.п. – может быть присоединено (замонтировано) к дереву как «ветка», соответственно, часть полного пути до файла будет располагаться в дереве, а часть – в ветке.
-
Под «файлом» подразумевается любой потоковый источник информации, это могут быть дисковый файл, устройство или программно сформированные данные в памяти.
Этот подход был заложен в операционных системах UNIX. Он отличается высокой гибкостью и прозрачностью в использовании. Его реализация позволяет полностью инкапсулировать код, отвечающий за непосредственную работу с разнородными хранилищами, и предоставить единый интерфейс на все файловые операции.
Используя этот подход, Ересов А.Е. разработал модуль, задачей которого является прозрачная работа с файловыми ресурсами вне зависимости от хранилища, из которого они получены – дисковый каталог, сеть, архив, зашифрованное хранилище, exe-файл или dll-файл. В рамках разработанного ТЗ, модуль предлагает следующий программный интерфейс для работы с файлами:
-
Открытие файла на чтение и предоставление входного потока на него стандартной библиотеки С++, согласно относительной системе именования, принятой в структуре данных проекта.
-
Открытие файла на запись или его создание с предоставлением исходящего потока стандартной библиотеки С++, согласно той же системе именования.
-
Перебор файлов внутри директории безотносительно типу файлового хранилища с использованием идиомы STL «итератор».
Для обеспечения эффективного управления списком файловых хранилищ (синоним – «подсистем») модуль имеет следующие возможности:
-
Наличие системы виртуальных директорий для организации разветвленных виртуальных пространств именования файлов.
-
Возможность монтирования подсистемы (дисковой директории, зип-архива, сетевого диска, ресурсного exe/dll) в виртуальную директорию.
-
Ручное и автоматическое («сборка мусора») демонтирование и удаление подсистем.
Архитектура модуля предусматривает максимально простое расширение функционала:
-
Увеличение количества типов поддерживаемых файловых подсистем (хранилищ). Предусмотрен специальный интерфейс, реализуя который можно реализовать и подключить новую подсистему.
-
Наращивание механизмов эвристики по выбору вариантов файлов в случае использования параллельных веток. Предусмотрен механизм передачи внешнего функтора для сравнения файлов.
Предлагаемый модуль является независимой dll-библиотекой, статически подключаемой к любому проекту через интерфейс на языке С++.
Работа с ZIP-архивами реализована при помощи свободно распространяемой библиотеки zlib. Используются алгоритмы inflate/deflate.
Шифрование выполняется по алгоритму CRC32, реализованному самостоятельно, для обеспечения работы с зашифрованными ZIP-архивами.
Поддержка сети реализована для всех типов подсистем путем опознавания стандартного в Win32 указания сетевого пути в начале имени файла – двойной обратный слеш.
Работа с ресурсами исполняемых файлов Win32 реализована с помощью средств WinAPI.
Выбор средств разработки определялся удобством интеграции в существующие проекты, а также быстродействием результирующего модуля. В силу того, что программирование в «МиСТ ленд – ЮГ» ведется на языке С++, модуль также был реализован на C++ с обширным использованием STL. Из инструментальных средств, выбор пал на Microsoft Visual Studio 7.1, STLport, BOOST и zlib. Проектирование велось в Rational Rose, для не-UML схем использовался Microsoft Visio.
В рамках тестирования системы проведены следующие проверки.
-
Общий интерфейс VFS:
-
Открытие файла на чтение и предоставление входного потока на него стандартной библиотеки С++, согласно относительной системе именования, принятой в структуре данных проекта.
-
Открытие файла на запись или его создание с предоставлением исходящего потока стандартной библиотеки С++, согласно той же системе именования.
-
Перебор файлов внутри директории безотносительно типу файлового хранилища.
-
-
Ядро VFS:
-
Создание системы виртуальных директорий, размещение подсистем в случайном порядке, проверка корректного их перебора.
-
Монтирование/демонтирование подсистем различных типов в директории.
-
Проверка механизма "сборки мусора".
-
-
Особенности:
-
Проверка на возможность существования нескольких файлов с одинаковым именем в рамках всей VFS.
-
Проверка работы критериев сортировки и выбора предпочтительных вариантов файлов.
-
-
Специализированные модули:
-
Проверка корректности работы шифрования/дешифрования средствами разработанной подсистемы ml_encrypted_zip при заведомо внедренных ошибках шифрации.
-
-
Надежность:
-
Проверка на недопустимые имена файлов.
-
Проверка на отсутствие запрашиваемых файлов.
-
Проверка на ошибки физического доступа к подсистемам.
-
Все проверки проводились в многопоточной среде в различных комбинациях. Выявленные ошибки были исправлены, окончательное тестирование показало полную работоспособность модуля.
Студент группы МП-55
______________ (Ересов А.Е.)
Предполагаемая оценка за преддипломную практику – «отлично».
Технический директор ЗАО «МиСТ ленд - ЮГ»
_____________ (Сорокин А.С.)