Перейти к содержанию

16. Проект, автосохранение и диагностика

English

Эта страница — о том, что происходит с работой оператора на диске: как программа хранит и защищает проект (файл, автосохранение, восстановление после сбоя) и что отправить разработчику, если что-то пошло не так (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 поверх главного окна: заголовок «What should we know? Bugs, ideas, annoyances — all
welcome.», пустое многострочное поле с подсказкой «Type your feedback here…», отмеченный флажок «Attach the
recent session log (recommended for bug reports)» и под ним подпись «We send your message, the DL20 version
and an anonymous install id — plus the log tail when the box is checked. No file names, no project content.»;
кнопки OK и Cancel

Кнопка 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: статус «UNLICENSED · FREE TIER», подпись «No license installed. Free
tier — the output is clean.», строка «ID: — · FEATURES: —»; поле MACHINE ID с кнопкой COPY ID, поле LICENSE
FILE с кнопкой OPEN FOLDER (значения на снимке — заглушки); кнопки INSTALL .DLLIC, RECHECK и затенённая
REMOVE

Карточка 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.

Строка ABOUT внизу экрана SETTINGS: кнопка SEND FEEDBACK слева и подпись текущей версии справа — кнопка
INSTALL UPDATE появляется на этом же месте, когда найдено обновление

Ограничения

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