Простой ответ «нет», TDD не является нормальным подходом в разработке игр. Некоторые люди указывают на Хаймуна и Нила Ллописа в качестве контрпримеров, но это большая индустрия, и они единственные, кого я знаю, кто полностью принял TDD. Я уверен, что есть и другие, но они единственные, о которых я знаю (и я работаю в этой отрасли уже 5 лет).
Я думаю, что многие из нас когда-то баловались юнит-тестированием, но по тем или иным причинам это не получилось. Судя по личному опыту, игровой студии сложно перейти на TDD. Обычно кодовая база хранится от проекта к проекту, и применение TDD к большой существующей кодовой базе является утомительным и в значительной степени неблагодарным. Я уверен, что в конечном итоге это окажется плодотворным, но заставить программистов игр купить его сложно.
У меня был некоторый успех в написании модульных тестов для низкоуровневого кода игрового движка, потому что этот код имеет очень мало зависимостей и легко инкапсулируется. Это всегда было проверкой после факта, хотя и не TDD. Код игры более высокого уровня обычно сложнее написать, потому что он имеет гораздо больше зависимостей и часто связан со сложными данными и состоянием. Взяв ИИ в качестве примера, для тестирования ИИ необходим некоторый контекст, то есть навигационная сетка и другие объекты в мире. Установка такого теста в изоляции может быть нетривиальной, особенно если задействованные системы не были предназначены для него.
Что более распространено в разработке игр, и у меня больше личного успеха, так это тест на дым. Вы часто будете видеть тестирование дыма, используемое в сочетании с непрерывной интеграцией, чтобы обеспечить различные виды обратной связи о поведении кода. Дымовое тестирование легче, потому что это можно сделать, просто подавая данные в игру и считывая информацию, без необходимости разбивать ваш код на крошечные тестируемые фрагменты. Снова взяв ИИ в качестве примера, вы можете указать игре загрузить уровень и предоставить скрипт, который загружает агента ИИ и дает ему команды. Затем вы просто определяете, выполняет ли агент эти команды. Это скорее тест на дым, чем на юнит-тест, потому что вы запускаете игру в целом и не тестируете систему искусственного интеллекта в изоляции.
По моему мнению, можно получить приличное тестовое покрытие, выполняя модульное тестирование кода низкого уровня, в то время как тестирование поведения высокого уровня в дыму. Я думаю (надеюсь), что другие студии также используют аналогичный подход.
Если мое мнение о TDD звучит несколько двусмысленно, то это потому, что так оно и есть. Я все еще немного об этом. Хотя я вижу некоторые преимущества (регрессионное тестирование, акцент на дизайне перед кодом), его применение и применение при работе с уже существующей кодовой базой похоже на рецепт головной боли.
Самый простой способ - использовать:
svnadmin dump path/to/repos > repos.out
Это создаст переносимый формат для вашего репозитория (с историей) в файле repos.out
. Затем вы можете использовать
svnadmin load path/to/newrepos < repos.out
для загрузки своего «дампового» репозитория в новый или существующий.
Глава 5. Обслуживание репозитория -> Перенос данных репозитория в другое место содержит примечание об использовании svnadmin dump
] для версии 1.7:
Формат дампа репозитория Subversion описывает репозиторий с поддержкой версий. только изменения. Он не будет нести никакой информации о незафиксированных транзакции, пользовательские блокировки путей файловой системы, репозитория или сервера настройки конфигурации (включая сценарии ловушек) и т. д.
Как предложено в книге о Subversion :
svnadmin dump path/to/repos_src \
| svndumpfilter include path/inside/svn/to/directory \
| svnadmin load path/to/repos_dst
В примере:
svnadmin dump /var/lib/svn/old_repo \
| svndumpfilter include trunk/my_project/common_dir \
| svnadmin load /var/lib/svn/new_repo
Вы можете создать файл дампа с помощью svnadmin dump
, а затем импортировать в новый репозиторий с помощью svnadmin load
.
If you don't want history, you can use svn export
to get a clean folder without the .svn
folders and then svn import
into your other repository.
With history, you would need to use the svnadmin dump
. You would then use svndumpfilter
to filter for only the parts or paths you want to use before using svnadmin load
.
Topics to read:
Используйте команду svnsync
- Subversion Repository Mirroring :
svnsync
- это инструмент зеркалирования удаленного репозитория Subversion. Проще говоря, это позволяет вам воспроизводить ревизии одного репозитория в другом.
В документации по Subversion для команды svnsync
есть следующее предупреждение (начиная с версии 1.7), подразумевающее, что после использования некоторых других команд SVN для изменения зеркального репозитория svnsync
не должен снова использовать с этим конкретным зеркалом:
svnsync
очень чувствителен к изменениям, сделанным в репозитории зеркала которые не были сделаны как часть операции зеркалирования. Чтобы предотвратить это чтобы не произошло, лучше всего, если процессsvnsync
будет единственным процессом разрешено изменять зеркальный репозиторий.