16. Проект, автосохранение и диагностика¶
Эта страница — о том, что происходит с работой оператора на диске: как программа хранит и защищает проект (файл, автосохранение, восстановление после сбоя) и что отправить разработчику, если что-то пошло не так (SEND FEEDBACK, журналы сессий, крах-дампы) или нужно разобраться с лицензией.
Проект¶
Логотип DL20 в левом верхнем углу верхней полосы открывает меню приложения. Верхняя часть меню отвечает за файл проекта: New Project (Ctrl+N), Save Project (Ctrl+S), Save Project As… (Ctrl+Shift+S), Load Project… (Ctrl+O); ниже — Open Project Folder и Open Logs Folder, открывающие нужную папку в проводнике.
Файл проекта .dlproj — один JSON-документ со всей настройкой показа: слои и окна сетки, эффекты,
привязки, таймлайн и дорожки, экраны/слайсы/маски/бленды, приборы DMX, настройки движка и звука. У формата
есть версия схемы с миграциями и атомарная запись на диск (запись либо целиком удаётся, либо файл на диске
не трогается) — более старая сборка программы открывает документ, сохранённый более новой, без отказа.
При первом запуске portable-копии проект по умолчанию сохраняется рядом с dl_composition.exe как
project.dlproj; если эта папка недоступна для записи (например, установленная копия в Program Files) —
в Документы\DL\project.dlproj. Save Project As… всегда спрашивает путь явно и сама дописывает
расширение .dlproj, если оно не указано.
Если в проекте есть несохранённые изменения, действия New Project, Load Project…, Exit, закрытие окна крестиком или Alt+F4, установка обновления (INSTALL UPDATE) и смена проекта через восстановление автосохранения сначала спрашивают: «В проекте есть несохранённые изменения. Сохранить их перед действием «…»?» — кнопки Сохранить / Не сохранять / Отмена (в английском интерфейсе — Save / Discard / Cancel). Неудачное сохранение (например, папка недоступна для записи) показывает отдельное предупреждение и отменяет исходное действие, ничего не теряя. Крестик и Alt+F4 после этого вопроса задают ещё один — «Quit DL20?»: шоу гаснет только после обоих ответов, а Отмена на первом или No на втором оставляют окно открытым и выходы работающими. Автосохранение (ниже) этот вопрос не отменяет: изменения считаются несохранёнными, пока файл проекта не сохранён явно.
Если Load Project… не смог прочитать файл (статус LOAD FAILED), открытый проект остаётся как был — программа сначала проверяет весь файл и только потом применяет его. Успешные Load Project… и New Project очищают историю отмены (Ctrl+Z): отменить правку прежнего проекта в новом нельзя.
New Project (Ctrl+N) после ответа на этот вопрос возвращает программу в состояние, как при обычном запуске без файла: пустые окна сетки, остановленные слои, умолчания слоёв и эффектов, таймлайн с одной дорожкой MAIN. Разрешение композиции, частота кадров, разрядность, аудиовыход, Link, генератор таймкода и DMX не меняются — это настройки экрана SETTINGS, а не содержимое проекта. Путь проекта становится пустым («без имени»); Save Project (Ctrl+S) сразу после этого открывает Save Project As…, а не перезаписывает файл, с которым работали раньше.
Ресурсы проекта¶
Если в открытом проекте не находится файл — слой, блок таймлайна, маска выхода или GLSL-слот, — строка состояния после загрузки оканчивается «PROJECT LOADED · НЕТ ФАЙЛОВ: N» красным цветом (вместо просто «PROJECT LOADED»). Если в этот момент окно программы видно и не идёт проба, окно «Ресурсы проекта…» (пункт меню логотипа, сразу после Open Project Folder) открывается само — не забирая фокус клавиатуры: пробел и клавиши транспорта по-прежнему идут в окно программы. Его можно открыть и вручную в любой момент, даже когда все файлы на месте.
Таблица показывает три колонки:
- Где — что использует этот файл: слой (
L<n>), дорожка и лейн блока таймлайна с его таймкодом, экран или слайс маски выхода, окно и слот пользовательского GLSL-эффекта, ячейка сетки деки («ячейка LS »). - Файл — путь, записанный в проекте; подсказка над строкой показывает полный путь.
- Состояние — OK (файл на месте по записанному пути), найден: <папка> (файл нашёлся в другом месте — папке проекта, папке браузера FILES или папке поиска, добавленной «Найти папку…») или НЕТ ФАЙЛА.
Кнопки под таблицей:
- «Найти папку…» добавляет папку поиска в проект (она сохраняется с ним — настройка переживает перезапуск программы); переехавший файл находится по имени, прямо в этой папке или в одноимённой подпапке. Слой, который при загрузке остался пустым из-за недоступного файла, занимает найденный файл сам, без повторного назначения руками. Тот же список корней пополняет и импорт пакета трека (стр. 09) — папка импортированного пакета добавляется сюда сама, без отдельного шага «Найти папку…».
- «Заменить файл…» выбирает другой файл для выбранной строки вручную. Для блока таймлайна — одна команда (Ctrl+Z отменяет всё сразу) меняет путь во ВСЕХ блоках всех дорожек, у которых был тот же файл, а длина и длительность блока пересчитываются по новому файлу. Для слоя и для ячейки сетки деки — переназначает его заново (настройки окна ячейки сохраняются). Ячейку кнопка заменяет, только если та всё ещё держит путь этой строки — если сетку после открытия окна правили, нажмите «Перепроверить»; у уже открытой ячейки новый файл сбрасывает точки In/Out, как перетаскивание файла мышью. Файл, который программа не может открыть (не видео, повреждён), не принимается: появляется сообщение «Файл не открылся — ничего не заменено», блоки, слой и ячейка остаются прежними. У маски выхода и GLSL-слота кнопка неактивна — заменить их можно только как раньше, с экрана OUTPUT (маску) или из карточки эффекта (GLSL).
- «Перепроверить» сканирует проект заново без перезагрузки и, как «Найти папку…», возвращает в пустой слой файл, который снова лежит на месте. Пока слой не занял свой файл (его нет или он не открывается), его строка — НЕТ ФАЙЛА, даже если файл по пути уже есть.
Путь файла слоя, оставшегося пустым при загрузке, запоминается и сохраняется с проектом, пока слой не получит другое содержимое (рукой, cue таймлайна, OSC/MIDI или пультом) или пока оператор сам не погасит слой кнопкой STOP — тогда путь забывается. Так же устроена и ячейка сетки деки (экран COMPOSITION): если её файл не нашёлся, путь запоминается и сохраняется с проектом, а сама ячейка на сетке показывается как «НЕТ ФАЙЛА» (не пустой со знаком «+» — см. 06. Композиция) и держит своё место, пока её не заполнят заново через «Найти папку…», «Заменить файл…» или перетаскиванием нового файла; попытка запустить такую ячейку отказывает со строкой-подсказкой, ведущей к этому же окну, а пульт отвечает на неё «нет файла». Такая ячейка считается занятой: двойной щелчок по файлу в браузере FILES кладёт файл в соседнюю ячейку линии, а не поверх неё, а – LINE на линии с такими ячейками спрашивает подтверждение, как для линии с клипами.
На холсте таймлайна (стр. 09) блок, у которого путь не найден, получает диагональную штриховку и подпись «НЕТ ФАЙЛА · <имя>» вместо обычной — то же правило поиска, что и в этом окне. Проверка существования файлов — в фоновом потоке, сетевой диск не задерживает интерфейс.
Автосохранение и восстановление¶
Программа сама сохраняет копию проекта каждые 30 секунд в %LOCALAPPDATA%\DL\autosave\ с ротацией
последних пяти снимков — отдельно от файла, который открыт и сохраняется вручную.
Если при следующем запуске программа находит автосохранение новее открытого проекта, перед обычным стартом появляется диалог Recover DL20 autosave: «DL20 found a newer autosave from the previous session. Restore it now?» — кнопки Yes / No. Если предыдущая попытка восстановления сама привела к падению программы, в диалог добавляется строка-предупреждение об этом, а кнопкой по умолчанию становится No — вместо обычного Yes. Если падения повторяются на одном и том же снимке автосохранения второй раз подряд, программа больше не предлагает его восстановить: снимок переименовывается («в карантин»), а в строке состояния появляется пометка, что автосохранение закарантинено, с путём, куда оно уехало.
После Yes программа загружает снимок. Получилось — в строке состояния «RECOVERED — SAVE TO KEEP»:
восстановленный проект помечен изменённым и сохраняется в файл проекта по умолчанию, а не в сам снимок (снимки
перезаписываются по кругу) — сохраните его, чтобы не потерять. Если снимок повреждён и не загружается, в строке
состояния — красное «RESTORE FAILED: <причина> — autosave moved to <новый путь>»: снимок переименован рядом в
dl-composition-1.restore-failed-<дата-время>.dlproj (автосохранение его больше не перезаписывает), открытый
проект и путь его сохранения остаются прежними (с 0.8.91; раньше программа и в этом случае писала «RECOVERED»).
Выбрать другой снимок в диалоге нельзя: отодвинутый и остальные снимки лежат в той же папке — скопируйте нужный в
другую папку и откройте копию через Load Project…. Если загрузка отказала, когда часть проекта уже была
применена, статус говорит «RESTORE FAILED: <причина> — project state mixed, save path reset to <путь>; autosave
moved to <новый путь>»: прежнего проекта в окне больше нет, откройте нужный проект заново.
Диагностика: SEND FEEDBACK, журналы и крах-дампы¶

Кнопка SEND FEEDBACK внизу экрана SETTINGS открывает это окно в любой момент работы. Текст пишется свободно; флажок «Attach the recent session log» отмечен по умолчанию и прикладывает хвост текущего журнала сессии. Разработчику уходит сам текст, версия DL20 и анонимный идентификатор установки — без имён файлов и содержимого проекта, хвост журнала добавляется, только пока флажок отмечен.
Отдельно от обратной связи по требованию, в SETTINGS есть тумблер USAGE STATISTICS — анонимная телеметрия: версия и сборка программы, модель GPU/ОС, fps, счётчики ошибок и анонимный идентификатор машины, старт и конец сессии, падения и факт отправки отзыва — без файлов, содержимого и имён. Выключается этим же тумблером в любой момент.
Для разбора проблемы, которую не описать парой слов в SEND FEEDBACK, к обращению стоит приложить:
- журнал сессии —
%LOCALAPPDATA%\DL\logs\, отдельный файл на каждый запуск программы; - крах-дамп —
%LOCALAPPDATA%\DL\crashes\(minidump), с ротацией последних десяти.
Обе папки открываются тем же меню приложения (Open Logs Folder — для журналов).
Что значит код sendto в журнале и в строке OUTPUT¶
Если сетевой выход (объём, установка, DMX) теряет кадры, с 0.8.96 в журнале сессии и в строке состояния объёма
(экран OUTPUT, WIRE … dropped · sendto …) стоит первый код ошибки sendto с адресом приёмника. Приложите журнал
к SEND FEEDBACK (флажок с журналом отмечен по умолчанию) — по коду видно, чего не хватает. Частые коды Windows:
| Код | Имя | Что это обычно значит |
|---|---|---|
| 10035 | WSAEWOULDBLOCK |
буфер отправки сокета полон — сеть не успевает принимать |
| 10049 | WSAEADDRNOTAVAIL |
адрес назначения недоступен (например, 0.0.0.0) |
| 10051 | WSAENETUNREACH |
сеть недостижима: нет маршрута к адресу (например, 240.0.0.1) |
| 10065 | WSAEHOSTUNREACH |
хост недостижим |
| 10054 | WSAECONNRESET |
ICMP «port unreachable» от приёмника (с 0.8.96 SIO_UDP_CONNRESET выключен, такого быть не должно) |
| 10039 | WSAEDESTADDRREQ |
адрес приёмника установки не точечный IPv4 (например, имя хоста): пакеты на него не уходят, текст — «receiver '<имя>' is not an IPv4 address» (код ставит сама программа, sendto не вызывался) |
Если кадры теряются, а кода нет, их сбрасывает заполненная очередь отправителя — в журнале вместо кода стоит «queue full».
Лицензия¶

Карточка LICENSE в SETTINGS показывает состояние лицензии на этой машине: ACTIVE с именем клиента или UNLICENSED · FREE TIER с короткой причиной, рядом — идентификатор лицензии, список функций и срок действия, если лицензия есть. Пока лицензия не установлена, вывод всё равно остаётся чистым — таков нынешний режим свободного яруса. Третье состояние — COPY DISABLED · REVOKED: копия программы отозвана издателем и отключена.
- MACHINE ID — отпечаток этой машины, кнопка COPY ID копирует его в буфер для выпуска лицензии, привязанной к машине.
- LICENSE FILE — путь к активному файлу лицензии, OPEN FOLDER открывает его папку.
- INSTALL .DLLIC выбирает файл лицензии и активирует его без перезапуска программы; подпись, продукт, срок и привязка к машине проверяются до замены — невалидный файл не портит рабочую лицензию. Прежний файл сохраняется рядом как резервная копия.
- RECHECK перечитывает текущий файл лицензии заново; REMOVE отключает лицензию на этой машине, тоже сохранив резервную копию.
Обновление¶
Строка ABOUT внизу экрана SETTINGS несёт кнопку SEND FEEDBACK и подпись текущей версии; когда программа находит новую версию, здесь же появляется кнопка INSTALL UPDATE — подробно про установку и обновление программы, включая эту кнопку, рассказано на странице 02.

Ограничения¶
- Падения при выходе из программы, замеченные на одной из полевых машин, пока не разобраны — если такое случилось, самое полезное для обращения — это журнал сессии и свежий крах-дамп из папок выше.
- Маски выхода и GLSL-слоты в окне «Ресурсы проекта…» — только список: кнопка «Заменить файл…» на их строке неактивна, и даже если файл нашёлся («найден: …») тем же поиском, что у слоя или блока, сама загрузка маски и эффекта этот поиск не использует — переехавшую маску или GLSL-файл нужно переназначить вручную, как раньше.
- Путь слоя, назначенный через «Найти папку…», сохраняется в проекте как путь уже найденного файла, а не как путь, который был записан раньше; у блока таймлайна — наоборот, записанный путь сохраняется прежним вместе со списком папок поиска.