Нижче подано посібник щодо використання SteamPipe — інструмента Valve для подання вмісту до Steam. Корисні поради щодо оновлення гри можна прочитати
ось тут.
Вступ до системи вмісту SteamPipe
SteamPipe — це система управління вмістом гри/застосунку в Steam. SteamPipe містить наступні функції:
- Ефективна й швидка доставка вмісту.
- Загальнодоступні та приватні бета-гілки, що дозволяють тестувати різні збірки.
- Простий сайт для керування збірками: для публікації й видалення збірок потрібно натиснути всього кілька кнопок.
- Можливість бачити розмір оновлення до публікації збірки.
- Вміст може бути спільним для кількох застосунків.
- Можливість створювати диски інсталяції із загальнодоступного чи бета-вмісту.
- Ігри/застосунки лишаються доступними в автономному режимі навіть після того, як почалося завантаження оновлень.
- Увесь вміст завжди зашифрований, а користувачі не бачать неактивні версії.
- Під час розробки може використовуватися локальний сервер вмісту.
ПРИМІТКА: деякі поняття є суттєвими для розуміння функціонування SteamPipe, тож перед початком вам слід ознайомитися з усіма поняттями, що описані в розділі про
застосунки. Навіть якщо ви матимете лише базове розуміння того, як ці частини пов’язані, це згодиться для вивантаження вашого продукту в Steam.
Структура ігрового вмісту — корисні поради
SteamPipe розроблений як для ефективного завантаження інсталяцій початкової версії гри, так і для ефективного застосування її оновлень. Загалом він добре підходить для великого різноманіття структур ігрового вмісту. Однак є деякі важливі моменти, які слід знати задля оптимізації й уникнення ситуацій, що можуть призвести до неефективності.
Примітка: якщо ваша гра використовує
Unreal Engine, перегляньте примітки для його файлів пакетів наприкінці цього розділу.
SteamPipe початково ділить кожний файл на фрагменти розміром приблизно один мегабайт (МБ). Кожен фрагмент потім стискається й зашифровується перед вивантаженням через систему доставки вмісту Steam. Вони лишаються стисненими й зашифрованими до завантаження кожним клієнтом, де розшифровуються, розпаковуються й розміщуються у відповідних розташуваннях файлів.
Коли SteamPipe обробляє оновлення наявної гри, він шукає фрагменти, які збігаються з попередньою збіркою гри. Таким чином, в ідеалі, лише нові й модифіковані фрагменти кожного файлу стають «новими» фрагментами, і для оновлення гри клієнт повинен завантажувати тільки ці нові фрагменти.
Багато ігрових рушіїв використовують «файли пакетів» для поєднання ігрових елементів і для покращення часу завантаження шляхом ефективнішого доступу до диска. Загалом це добре працює зі SteamPipe. Однак деякі системи об’єднання файлів використовують або дозволяють поведінку, що може призвести до проблем. Наслідком цих проблем майже завжди є те, що оновлення відбуваються значно довше, ніж необхідно. Вони також можуть призвести до швидкого завантаження, але повільного процесу оновлення через перевантаження локального диска.
Якщо ваша гра використовує файли пакетів, то ось деякі загальні настанови.
- Переконайтеся, що зміни елементів у файлі пакетів максимально локалізовано.
- Уникайте змін порядку елементів у файлі пакетів.
- Обмежуйте розмір файлу пакетів.
- Групуйте елементи за рівнем / середовищем / функцією у їхніх файлах пакетів, а також обдумайте можливість додавання нових файлів пакетів для оновлень замість зміни вже наявних.
- Не включайте оригінальні назви файлів чи часові мітки файлів/збірок до кожного елементу.
Перший пункт угорі стосується обсягу байтів, що змінені у файлі після модифікації одного елемента. Якщо дані цього елемента змінені та/або розширені чи зменшені в одному місці файлу пакетів, це ідеальний варіант. SteamPipe створюватиме нові фрагменти лише для тих частин файлу, що містять дані елементів. Однак для всіх файлів пакетів також потрібно щось на зразок змісту, щоби рушій міг розташувати дані елементів. Структура цього змісту може суттєво вплинути на ефективність оновлення через SteamPipe. В ідеалі має бути один зміст чи дерево змісту на початку або в кінці файлу. Оскільки інші елементи можуть змінювати позицію байтів усередині файлу, то їхні записи в змісті також змінюватимуться. У цій ситуації SteamPipe зробить нові фрагменти для модифікованих даних елементів і для модифікованих частин змісту.
Однак у деяких ігрових рушіях ми бачимо, що інформація про зміст розподіляється по всьому файлу. І, що навіть гірше, зміст використовує абсолютні значення зміщення байтів. Тож якщо елемент, розташований на байті 3450, зросте на 8 байтів, то всі значення зміщення для всіх елементів у файлі після цього елемента зміняться. Навіть якщо кожне значення зміщення має величину 4 чи 8 байтів, то ця восьмибайтна зміна призведе до створення SteamPipe нового фрагменту обсягом 1 МБ. Це може призвести до катастрофічних наслідків, коли зміна навіть кількох маленьких елементів у файлі пакетів може вимагати від клієнта завантаження половини обсягу всього файлу. Якщо ви знаєте або підозрюєте, що структура вашого файлу пакетів призводить до цієї проблеми, якомога швидше зверніться до свого представника Valve. У нас є альтернативний алгоритм збірки, який може допомогти пом’якшити цю проблему, хоча й певною ціною.
Також SteamPipe не відомо про межі елементів усередині файлу пакетів. Якщо перемішуються елементи розміром менше одного мегабайта, SteamPipe може не виявити це перевпорядкування, оскільки раніше визначені одномегабайтні фрагменти більше не будуть присутні в файлі. Тому, якщо під час створення оновлення для вашої гри ви хочете оптимізувати час завантаження шляхом перегрупування елементів у файлі пакетів, майте на увазі, що це може призвести до дуже великого завантаження цього оновлення. Ми рекомендуємо це робити, тільки якщо покращення швидкодії суттєві.
Потім, щоб оновити файл пакетів на клієнтському пристрої, SteamPipe збирає нову версію паралельно зі старою. Коли всі нові файли зібрано, він здійснює оновлення шляхом видалення старих файлів і додавання нових. Це значить, що для оновлення 25-гігабайтного файлу пакетів, SteamPipe завжди створюватиме новий 25-гігабайтний файл. Якщо в оновленні цього файлу зміниться лише 10 байт, то SteamPipe все одно мусить скопіювати майже всі 25 гігабайт старого файлу до нового файлу. Залежно від обладнання клієнта, це може бути дуже повільний процес. Через це ми рекомендуємо дві речі.
По-перше, обмежуйте розмір файлів пакетів. Імовірно один чи два гігабайти — оптимальна величина. Цього більш ніж достатньо для ефективного читання диску під час завантаження гри.
По-друге, за можливості обмежуйте масштаб елементів у файлі пакетів. Наприклад, одним ігровим рівнем чи функцією, яку можна розблокувати. Так оновлення, що стосуються певної частини вашої гри, не копіюватимуть на клієнтському комп’ютері дані з інших частин гри. Також, додаючи нові функції, рівні тощо, ви зможете розміщувати їх у їхніх власних нових файлах пакетів. Клієнти, що завантажують таке оновлення, просто завантажать нові файли й не матимуть жодних вищевказаних проблем із модифікацією файлів пакетів.
Якщо ви сумніваєтеся, то можете скористатися локальним інструментом перевірки розбіжностей, як-от Beyond Compare, для порівняння версій ваших об’єднаних файлів. Переконайтеся, що показані відмінності мають очікуваний розмір для змінених ресурсів, і що немає десятків чи й сотень невеликих змін, розкиданих по всьому файлу. Якщо ви побачили щось неочікуване, перевірте налаштування свого інструменту файлу пакетів.
Стиснення: оскільки Steam стискає всі дані для вивантаження / зберігання / завантаження, ми загалом не рекомендуємо використовувати стиснення файлів пакетів. Однак, якщо вас хвилює розмір вашої гри на диску, можливо, ви все ж захочете стиснути файл пакетів. Це нормально працюватиме зі SteamPipe, якщо ви дотримуватиметеся вказаних вище вимог. Зокрема вам слід впевнитися, що стиснення відбувається для кожного елемента, наскільки це можливо. Будь-яке стиснення, що вийде за межі елемента, поширить зміни й клієнту доведеться завантажувати більше даних, ніж необхідно.
Шифрування: схоже до стиснення, найчастіше непотрібне й має деякі згадані вище ризики.
Якщо ви дотримуватиметеся цих правил, то мінімізуєте розмір патчів і потрібно буде завантажувати лише новий вміст. Ваші користувачі подякують вам за це, а ви зможете покращувати якість продукту, випускаючи більше оновлень.
Якщо ви підозрюєте, що ваша система ігрових пакетів не взаємодіє належно з процесом оновлення SteamPipe, зверніться до своєї контактної особи у Valve й ми розглянемо можливість ввімкнення розширених функцій, щоби допомогти із цим.
Unreal Engine — примітки
Деякі версії Unreal Engine використовують елемент «padding alignment» у файлах пакетів, який може значно впливати на розмір оновлень SteamPipe. Це вирівнювання може спричиняти каскадні зсуви елементів під час збирання нових версій, особливо в разі ввімкненого стиснення файлів пакетів. Використання такого вирівнювання обсягом 1 МБ (1 048 576 байтів) гарантує, що під час повторного вирівнювання елементи зміщуватимуться на кратне число відповідно до того розміру блоку, який SteamPipe використовує для розрахунку дельти.
Як приклад, для зміни чи визначення вирівнювання відступу під час підготовки файлів пакетів гри, вам потрібно змінити один рядок усередині файлу
UnrealEngine/Engine/Source/Programs/AutomationTool/Win/WinPlatform.Automation.cs. Цей файл містить функцію
GetPlatformPakCommandLine. Усередині цієї функції змініть такий рядок:
string PakParams = " -patchpaddingalign=2048";
ось так:
string PakParams = " -patchpaddingalign=1048576 -blocksize=1048576";
Ця зміна дозволить вам вмикати стиснення файлів пакетів та водночас гарантуватиме оптимізовану поведінку SteamPipe під час оновлень.
Unreal Engine — це торгова марка або зареєстрована торгова марка Epic у США та інших країнах.Відеоурок Steamworks — створення гри в SteamPipe
Це навчальне відео про SteamPipe, де також є кроки для створення простого застосунку для Steam за допомогою інструментів Steamworks.
https://www.youtube.com/watch?v=SoNH-v6aU9QВідеоурок Steamworks — додавання нових платформ і мов
Це навчальне відео присвячене додаванню нових платформ і мов до вашої гри шляхом додавання сховищ до вашого застосунку.
https://www.youtube.com/watch?v=PShS32hcingТехнічні подробиці SteamPipe
SteamPipe використовує протокол HTTP для доставлення вмісту. Оскільки завантаження — це звичайний Інтернет-трафік, будь-який сторонній HTTP-кеш між покупцем та серверами Steam збільшить швидкість завантаження. Уміст може знаходитись на зовнішніх CDN-провайдерах, які можна легко додати до мережі доправлення вмісту. Більшість користувацьких брандмауерів дозволяють HTTP-трафік і не блокуватимуть завантаження.
SteamPipe має ефективний алгоритм оновлень на основі бінарних дельт і змінює лише модифіковані частини наявних файлів умісту. Коли вміст оновлюється, надсилаються лише ці дельти. Це означає, що розробник та користувач будуть передавати менше даних, і ця передача буде швидшою. Більшість партнерів вважають, що не обов’язково використовувати
локальний сервер вмісту, оскільки можна ефективно оновлювати збірки в приватних гілках.
Акаунт Steam для збірок
Щоби створювати збірки в Steam, ви повинні мати акаунт Steam у Steamworks із дозволами на «Зміну метаданих застосунку» та «Публікацію змін застосунку в Steam». Із міркувань безпеки рекомендуємо вам мати окремий акаунт для збірок із цими дозволами. Для цієї мети ви можете створити новий акаунт Steam на сторінці
https://store.steampowered.com/join.
Будь-який адміністратор вашого акаунта Steamworks може додати акаунт Steam і надати йому необхідні дозволи. Більше інформації про цей процес можна знайти в документації про
управління користувачами. Приклад того, як такий акаунт може виглядати:

Примітка: якщо акаунту Steam знадобиться опублікувати збірку для випущеного застосунку, йому потрібен або пов’язаний із ним номер телефону, або пов’язаний мобільний застосунок Steam. Ці методи використовуватимуться для підтвердження публікації збірки випущеного застосунку. Крім того, якщо ви вносили безпекові зміни до акаунта Steam (пов’язані з електронною поштою, номером телефону тощо), вам доведеться зачекати 3 дні, перш ніж ви зможете опублікувати збірку випущеного застосунку. Це для того, щоб акаунти, до яких несанкціоновано отримали доступ зловмисники, не могли керувати випущеними збірками вашого застосунку.
Початкове налаштування нових застосунків SteamPipe
Дотримуйтеся цих кроків, щоби налаштувати нові застосунки SteamPipe:
- Знайдіть AppID свого застосунку (його можна побачити, якщо обрати застосунок на головній сторінці Steamworks).
- Перейдіть на сторінку загальних налаштувань інсталяції для вашого застосунку.
- Створіть щонайменше один варіант запуску (шлях і, за бажанням, умови, необхідні для запуску гри). Наведіть вказівник на (?), щоби довідатися більше про кожне поле.
Приклад нижче показує 5 параметрів запуску: 2 для Windows, 2 для macOS та 1 для Linux.
Третій параметр запуску показуватиметься на Windows, якщо користувач володіє вказаним завантажуваним вмістом.

- Перейдіть на сторінку сховищ і додайте необхідні цьому застосунку сховища. Стандартно сховище вже може бути сконфігурованим для вашого застосунку.
- Клацніть на назву сховища, щоби його відредагувати. Оберіть належну впізнавану назву (наприклад, Base Content чи Windows Content).
- Залиште параметр [Усі мови], окрім випадків, коли це сховище стосується лише конкретної мови.
- Залиште параметр [Усі ОС], окрім випадків, коли це сховище стосується лише конкретної операційної системи (якщо застосунок запускається на всіх ОС, або лише на ПК, або лише на Mac, тоді залишіть [Усі ОС]). Цей параметр можна змінювати, тільки якщо сховище стосується конкретної операційної системи.
- Для додавання нового сховища клацніть відповідну кнопку.
- Для збереження змін клацніть відповідну кнопку.
- Після завершення визначення сховищ опублікуйте зміни на цій сторінці.
- Нові визначені сховища слід включити у відповідний пакунок, яким ви володієте. Кожна гра в Steam повинна мати пакунок «Developer Comp», який автоматично надається акаунтам, указаним у вашій видавничій групі.
Ви можете додавати нові сховища до цього пакунку (та/або інших пакунків, які повинні мати ці сховища) на сторінці https://partner.steamgames.com/apps/associated.
- Тимчасово вимкніть локальний антивірус чи програми блокування спаму.
- Перевірте регіон завантаження Steam у меню «Налаштування»->«Завантаження». Він має збігатися з вашим місцеперебуванням.
- Припиніть завантаження, деінсталюйте та повторно інсталюйте гру (очищує кеші маніфестів).
- Вийдіть зі Steam, видаліть теки appcache та depotcache з теки інсталяцій Steam.
- Спробуйте вибрати регіон завантаження Steam на віддалений. Це спрацює, якщо сервер умісту поруч із вами надає пошкоджені дані.
[/list]Збірки для Mac і/або Linux не інсталюють файли. Чому?
Якщо ви через Steam тестуєте інсталяцію своєї гри чи застосунку на різних платформах, може виникнути ситуація, коли збірка запускається на Windows, але жоден файл не запускається на Mac чи Linux попри те, що ваш процес SteamPipe налаштований для вивантаження сховищ Mac і/або Linux. Тут легко пропустити крок, що включає додавання альтернативних сховищ до пакунка для запуску. Ви можете перевірити, які сховища включені до пакунка: - Перейдіть до своєї сторінки адміністрування застосунку.
- У розділі пов’язаних елементів клацніть на «Усі пов’язані пакунки, вміст, демоверсії та інструменти».
- Клацніть на назву пакунка, який ви намагаєтеся завантажити.
- Перегляньте розділ «Включені сховища».
- Використовуйте «Додати/вилучити сховища», щоби призначити потрібні сховища для пакунка.
Є багато гілок обговорень про це, у яких ви можете знайти потрібну інформацію:Запуск steamcmd.exe призводить до такої помилки: «SteamUpdater: Error: Steam needs to be online to update. Please confirm your network connection and try again.»
Рішення: перейдіть до «Параметри Інтернету» → «Підключення» → «Налаштування локальної мережі» → «Виявляти налаштування автоматично».Запуск збірки застосунку викликає наступну помилку: «ERROR! Failed 'DepotBuild for scriptname.vdf' - status = 6.»
Можливі причини: - Акаунт не має дозволів для цього застосунку.
- Перевірте, що в app_build.vdf правильний AppID.
- Перевірте, що акаунт збірки має належні дозволи для цього AppID.
- Steamcmd не може знайти вміст сховищ.
- Перевірте, що значення contentroot у скрипті app_build має правильний шлях відносно розташування файлу скрипта.
- Перевірте, що значення LocalPath у скрипті depot_build має правильний шлях відповідно до шляху в скрипті app_build. Перевірте, що шлях містить актуальний уміст.
Запуск збірки застосунку викликає наступну помилку: «ERROR! Failed to get application info for app NNNNN (check login and subscription)»
Це значить, що Steam не може отримати інформацію про застосунок, бо той не існує або користувач не має до нього доступу. - Перевірте, що NNNNN — це AppID, призначене вами для застосунку.
- Перевірте, що в app_build.vdf правильний AppID.
- Якщо це новий AppID, перевірте, чи опубліковано конфігурацію застосунку Steamworks. Нові застосунки повинні мати теку інсталяції SteamPipe і сховище. Перевірити це можна на сторінці редагування налаштувань Steamworks: тека інсталяції вказується в опції «Загальне — інсталяція» на вкладці «Інсталяція», а сховища — в однойменній опції на вкладці «SteamPipe». Зміни публікуються на вкладці публікації.
- Якщо все виглядає правильно, переконайтеся, що ваш акаунт володіє цим AppID.
«An error occurred while installing [AppName] (Invalid content configuration)» під час запуску
Можливі причини:Я не пам’ятаю, яка команда використовувалася в steamcmd, або як вона працює.
Скористайтеся командою «find» у steamcmd для пошуку команд steamcmd. Результат покаже часткові збіги назв, а також синтаксис команди.Steam>find build_installer
ConVars:
Команди:
build_installer : <project file> <target folder> <beta key> <beta pwd>