March 16th, 2011

nyaload

VFS case

Регулярно вижу в виртуальных файловых системах для игр один и тот же фейл.
Когда VFS смонтирована на реальной файловой системе, то функции "проверь сущестование файла" или "открой файл" реализованы просто через вызовы OS. В результате под windows файлы 'y.' и 'y' или 'y' и 'Y' и '.\.\y' считаются существующими если есть хотя бы один. Когда же VFS монтируется на zip-файле или на unix - то файл который раньше существовал - перестаёт сущестовать.

Решение "является ли VFS case-sensitive" - это интерфейс VFS, и оно не должно меняться от реализации под интерфейсом. Или везде case-sensitive или везде case-insensitive.
Как оно ИМХО должно быть в VFS игр/игровых редакторах: во всех операциях VFS, результат которых зависит от существования файла - не полагаться на нижележащую FS/VFS. Сначала получать листинг директории, смотреть есть ли файл в этом списке и только после этого принимать решение о существовании файла. Для read-only immutable систем такие листинги можно сгенерировать при старте/экспорте. В частности, решение "есть ли файлик под svn" тоже должен браться из .svn/entries и функций svn, а не из функций os.

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

Не понимаю так же людей, которые в игровых проектах форсят именование файлов с больших букв - типа 'Data\Models\Unit.model'. На двух проектах так именовали, в обоих были регулярные фейлы "путь запоменый в xml-ке - на другой VFS не существует". Можно подумать что это дело вкуса, на самом деле это портит карму проекта (всякие 3rd party тулзы при экспорте или наколенные скрипты чаще подкидывают сюрпризы с NameCase)

Про VFS которые монтируются в os а не в игре - сказать как надо не могу, но подозреваю что там такие проблемы тоже всплывают. И блин, учитывайте что файлы с расширением .PNG - это тоже рисунки (пусть и рождённые c плохой кармой).