Dokumentacja Steamworks
Przesyłanie do Steam
Poniżej znajduje się poradnik korzystania ze SteamPipe, narzędzia Valve do dostarczania zawartości do Steam. Aby dowiedzieć się więcej o najlepszych praktykach związanych z aktualizacją twojej gry, przejdź do artykułu o aktualizowaniu twojej gry.

Wprowadzenie do systemu zawartości SteamPipe

SteamPipe to system zawartości gier/aplikacji, na którym opiera się Steam. Zawiera on następujące funkcje:
  • Szybkie i wydajne dostarczanie zawartości.
  • Nieograniczone publiczne i prywatne gałęzie „bety” pozwalające na testowanie wielu kompilacji.
  • Proste zarządzanie kompilacjami z poziomu sieci – wydaj nową kompilację lub cofnij do poprzedniej wersji za pomocą kilku kliknięć.
  • Możliwość sprawdzenia rozmiaru aktualizacji kompilacji przed opublikowaniem jej.
  • Możliwość współdzielenia zawartości między wieloma aplikacjami.
  • Możliwość stworzenia płyt instalacyjnych na podstawie zawartości beta lub tej publicznie dostępnej.
  • Gry i aplikacje są dostępne offline, nawet jeśli rozpoczęto pobieranie aktualizacji.
  • Cała zawartość jest zawsze szyfrowana, a nieaktywne wersje nie są widoczne dla klientów.
  • Lokalny serwer zawartości, którego można użyć podczas prac rozwojowych.
UWAGA: istnieje kilka zamysłów integralnych z działaniem SteamPipe. Przed rozpoczęciem prac polecamy zapoznać się z wszystkimi z nich wymienionymi w tym artykule dokumentacji. Posiadanie chociaż podstawowej wiedzy na temat tego, jak te elementy łączą się ze sobą, okaże się niezwykle użyteczne podczas przesyłania twojego produktu na Steam.

Samouczek wideo Steamworks – kompilowanie twojej gry w ramach SteamPipe

Niniejszy samouczek wprowadza system SteamPipe i przedstawia kroki, jakie należy wykonać z użyciem narzędzi Steamworks, by stworzyć kompilację przykładowej aplikacji.
https://www.youtube.com/watch?v=SoNH-v6aU9Q

Samouczek wideo Steamworks – dodawanie nowych platform i języków

Ten samouczek wideo dostarczy ci informacji na temat sposobu dodawania nowych platform i języków do gry poprzez umieszczenie dodatkowych magazynów zawartości do twojej aplikacji.
https://www.youtube.com/watch?v=PShS32hcing

Szczegóły techniczne SteamPipe

SteamPipe korzysta z protokołu HTTP, by dostarczać zawartość. Z racji tego, iż pobieranie jest zwykłym ruchem sieciowym, obecność dowolnej zewnętrznej pamięci podręcznej HTTP między klientem a serwerami Steam spowoduje zwiększenie szybkości pobierania. Zawartość może być hostowana przez zewnętrznych dostawców sieci dystrybucji zawartości (CDN), których można łatwo dodać do naszej sieci z zawartością. Większość zapór przeznaczonych dla konsumentów zezwala na ruch HTTP i nie będzie blokować pobierania.

System SteamPipe posiada wydajny algorytm wydawania łatek oparty na deltach binarnych, zmieniając tylko zmodyfikowane części istniejących plików zawartości. Kiedy ta zawartość jest aktualizowana, tylko te delty muszą zostać przesłane – oznacza to, że transfery są mniejsze i szybsze zarówno po stronie producenta, jak i użytkownika. Większość partnerów zauważy, że korzystanie z lokalnego serwera zawartości nie jest konieczne, ponieważ mogą oni sprawnie wydawać łatki kompilacji na prywatnych gałęziach.

Konto kompilacji Steam

Zanim będziesz w stanie tworzyć jakiekolwiek kompilacje na Steam, musisz posiadać konto Steam w ramach konta Steamworks, które będzie posiadało uprawnienia „Edycja metadanych aplikacji” oraz „Publikacja zmian dla aplikacji na Steam”. Ze względów bezpieczeństwa zaleca się posiadanie odrębnego konta do zarządzania kompilacjami posiadającego tylko te dwa uprawnienia. Możesz utworzyć takie konto pod adresem https://store.steampowered.com/join.

Dowolny administrator konta Steamworks może dodać twoje konto Steam i nadać mu odpowiednie uprawnienia. Więcej informacji na temat tego procesu znajduje się w dziale dokumentacji poświęconemu zarządzaniu użytkownikami. Takie konto może wyglądać w następujący sposób:

create_build_account.png

Wstępna konfiguracja dla nowych aplikacji SteamPipe

Wykonaj poniższe kroki, by skonfigurować nowe aplikacje SteamPipe:
  1. Znajdź ID twojej aplikacji (np. wybierając ją z poziomu strony głównej Steamworks).
  2. Przejdź do strony ustawień ogólnych instalacji dla twojej aplikacji.
  3. Określ przynajmniej jedną opcję uruchamiania (ścieżkę oraz ewentualne argumenty wymagane do uruchomienia twojej gry). Najedź na symbol (?), by dowiedzieć się więcej o każdym polu.

    Poniższy przykład pokazuje 4 opcje uruchamiania, 2 dla systemu Windows oraz po 1 dla systemów macOS i Linux oraz SteamOS. Opcja uruchamiania 3 będzie wyświetlana tylko na systemie Windows, jeśli użytkownik posiada również określone DLC.

    updatedlaunchoptions.png
  4. Przejdź do strony magazynów zawartości i dodaj wymagane magazyny dla tej aplikacji. Domyślnie może już istnieć skonfigurowany magazyn dla twojej aplikacji.
    1. Kliknij na domyślny magazyn zawartości i zmień jego nazwę na właściwą i rozpoznawalną, np. „Zawartość bazowa” lub „Zawartość dla systemu Windows”).
    2. Pozostaw język magazynu jako [Wszystkie języki], chyba że jest to magazyn przeznaczony dla konkretnego języka.
    3. Pozostaw system operacyjny na [Wszystkie systemy operacyjne] (jeżeli aplikacja wspiera wszystkie lub jest przeznaczona tylko na PC lub tylko na maki, tę opcję również należy zostawić). Określaj system operacyjny tylko dla magazynów zawartości dedykowanych temu systemowi.
    4. Kliknij Dodaj nowy magazyn zawartości, by stworzyć dodatkowe magazyny.
    5. Kliknij Zapisz zmiany, by zapisać wszelkie dokonane zmiany.
  5. Po zakończeniu określania swoich magazynów zawartości opublikuj wprowadzone zmiany, korzystając ze strony Publikacja.
  6. Twoje nowo określone magazyny zawartości będą musiały zostać zawarte w pakiecie, aby móc ci przyznać stan posiadania ich. Każda gra na Steam powinna zawierać pakiet egzemplarza producenta, który będzie automatycznie przyznawany kontom będącym w twojej grupie wydawcy.
    Możesz dodać nowe magazyny do tego pakietu (i/lub inne pakiety, które powinny zawierać te magazyny) na stronie Powiązane pakiety i DLC.
Uwaga: jeżeli twój plik wykonywalny znajduje się w podfolderze głównego folderu instalacyjnego, dodaj nazwę podfolderu w polu „Plik wykonywalny”. Nie używaj ukośników w prawo ani kropek.

Konfigurowanie SDK dla plików przesyłanych do SteamPipe

Pobierz i rozpakuj najnowszą wersję Steamworks SDK na komputerze, z którego będziesz przesyłać kompilacje.

Narzędzia SteamPipe można znaleźć wewnątrz SDK w folderze tools, który zawiera 2 powiązane podfoldery.

Folder ContentBuilder to miejsce na zawartość twojej gry oraz narzędzia kompilacyjne SteamPipe. Ten folder zawiera następujące podfoldery:
  • builder – ten katalog na początku zawiera tylko plik steamcmd.exe, który jest wersją Steam w stylu wiersza polecenia.
  • builder_linux – wersja steamcmd dla systemu Linux.
  • builder_osx – wersja steamcmd dla systemu macOS.
  • content – ten katalog zawiera wszystkie pliki gry, które zostaną skompilowane do magazynów zawartości.
  • output – ten katalog będzie miejscem na dzienniki kompilacji, pamięć podręczną porcji programu oraz pośredni zapis danych. UWAGA: ten folder może zostać usunięty lub opróżniony w dowolnym momencie, ale po jego usunięciu czas kolejnego przesłania wydłuży się.
  • scripts – ten katalog będzie miejscem na umieszczenie wszystkich twoich skryptów kompilacji używanych do kompilowania magazynów zawartości.
steampipebuilddir.png

Zaleca się jednorazowe uruchomienie steamcmd.exe bezpośrednio z folderu „builder” odpowiednim dla twojej platformy, by wstępnie załadować twój system kompilacji. Powinno to rozmieścić wszelkie pliki wymagane do tworzenia magazynów zawartości w twoim folderze kompilacyjnym.

Katalog ContentServer zawiera narzędzia do uruchomienia twojego lokalnego serwera zawartości, jeśli się zdecydujesz na ten krok.

SteamCmd na systemie macOS

Aby włączyć SteamCmd na systemie macOS, musisz wykonać następujące kroki:
  1. Z poziomu terminala przejdź do folderu tools\ContentBuilder\builder_osx\osx32.
  2. Uruchom chmod +x steamcmd.
  3. Przejdź do folderu wyżej (tools\ContentBuilder\builder_osx).
  4. Wpisz „bash ./steamcmd.sh”.
  5. SteamCmd zostanie uruchomiony i zaktualizowany do najnowszej kompilacji, a następnie otworzy się jego okno.
  6. Wpisz „exit” i wciśnij Enter, by wyjść z okna.
Następnie możesz stosować się do reszty niniejszej dokumentacji (zamieniając ścieżki na odpowiednie dla twojego przypadku), by tworzyć magazyny zawartości i pliki konfiguracyjne aplikacji celem przesyłania twoich treści do Steam.

Tworzenie plików konfiguracyjnych kompilacji SteamPipe

Aby przesłać pliki dla swojej aplikacji przez SteamPipe, musisz utworzyć skrypty opisujące twoją kompilację oraz każdy magazyn zawartości, który będzie w niej zawarty. Przykładowe skrypty pokazane tutaj znajdują się w folderze Tools\ContentBuilder\scripts w Steamworks SDK.

Narzędzie z interfejsem graficznym SteamPipe

Jeżeli korzystasz z systemu Windows i preferujesz narzędzie z interfejsem graficznym, by pomóc w tworzeniu tych plików konfiguracyjnych i przesyłaniu twoich kompilacji, to możesz użyć SteamPipeGUI, który znajduje się w folderze tools w Steamworks SDK. Wewnątrz archiwum znajdują się dodatkowe instrukcje, by pomóc ci w rozpoczęciu z korzystania.

Jeżeli zdecydujesz się na skorzystanie z narzędzia z interfejsem graficznym, to wciąż zalecamy przeczytanie poniższych działów dokumentacji, aby lepiej zaznajomić się ze sposobem, w jaki działa system SteamPipe.

Prosty skrypt kompilacyjny


Zacznijmy od najbardziej podstawowego skryptu kompilacji. W naszym przykładzie mamy grę (AppID: 1000), która ma jeden magazyn zawartości (DepotID: 1001) i chcemy przesłać wszystkie pliki z folderu zawartości i jego podfolderów. Potrzebujemy tylko pojedynczego skryptu kompilacyjnego. Spójrz na simple_app_build.vdf, który został zawarty w SDK:

"AppBuild" { "AppID" "1000" // twoje ID aplikacji "Desc" "This is a simple build script" // wewnętrzny opis dla tej kompilacji "ContentRoot" "..\content\" // zawartość folderu root w odniesieniu do lokalizacji tego pliku "BuildOutput" "..\output\" // folder wyjściowy kompilacji dla rejestru kompilacji i plików cache kompilacji "Depots" { "1001" // twoje ID magazynu zawartości { "FileMapping" { "LocalPath" "*" // wszystkie pliki z folderu contentroot "DepotPath" "." // zmapowane do roota magazynu zawartości "recursive" "1" // zawierają wszystkie podfoldery } } } }

Podmień wartości AppID i DepotID na te odpowiadające twojej grze. Aby rozpocząć kompilację, należy uruchomić steamcmd i przekazać kilka parametrów:
tools\ContentBuilder\builder\steamcmd.exe +login <account_name> <password> +run_app_build ..\scripts\simple_app_build.vdf +quit

UWAGA: twoja pierwsza próba uruchomienia może się nie powieść z powodu Steam Guard. If the login fails due to Steam Guard, check your email for the Steam Guard code, and run steamcmd as: steamcmd.exe "set_steam_guard_code <code>", and try again. Po pierwszym zalogowaniu się ze Steam Guard zostanie utworzony plik czuwania używany do weryfikacji prawidłowego zalogowania.

Jeżeli korzystasz ze steamcmd na komputerze lub maszynie wirtualnej, która często ma zmieniany obraz, powinieneś dołączyć ten plik czuwania wraz z plikiem konfiguracyjnym do twojego obrazu, aby nie być za każdym razem proszony o wprowadzenie kodu Steam Guard. Plik czuwania znajduje się w <Steam>\ssfn<hashOfNumbers>, a plik konfiguracyjny w <Steam>\config\config.vdf.

Następujące czynności są wykonywane podczas tworzenia kompilacji SteamPipe:
  1. Steamcmd.exe zaktualizuje się do najnowszej wersji.
  2. Steamcmd.exe loguje się do back-endu Steam, korzystając z podanego konta Steam wykorzystywanego do tworzenia kompilacji.
  3. Rozpoczęcie kompilacji aplikacji jest rejestrowane na głównym serwerze magazynów zawartości (Master Depot Server, MDS), co pozwala upewnić się, że użytkownik ma właściwe uprawnienia do modyfikowania tej aplikacji.
  4. Dla każdego magazynu zawartości dołączonego do kompilacji aplikacji zostaje wygenerowana lista plików na podstawie plików w folderze zawartości oraz zasad filtra określonych w pliku konfiguracyjnym kompilacji magazynu.
  5. Każdy plik zostaje przeskanowany i podzielony na małe porcje ważące około 1 MB. Jeżeli magazyn zawartości został wcześniej utworzony, to to partycjonowanie zachowa tak wiele niezmienionych porcji jak to możliwe.
  6. Nowe porcje plików są kompresowane, szyfrowane i przesyłane do MDS.
  7. Ostateczny manifest jest generowany dla tej wersji magazynu zawartości. Każdy manifest jest identyfikowany poprzez unikalne 64-bitowe ID manifestu.
  8. Po przetworzeniu wszystkich magazynów zawartości MDS kończy tę kompilację aplikacji i przyznaje jej globalne ID kompilacji (BuildID).
  9. Po zakończeniu kompilacji w folderze rezultatu kompilacji mogą znajdować się pliki *.csm oraz *.csd. Są one tymczasowe i mogą zostać usunięte, jednak przyspieszają one czasy tworzenia przyszłych kompilacji.


Po tym, jak kompilacja zostanie zakończona, możesz ją zobaczyć na swojej stronie z kompilacjami aplikacji – w tym przypadku byłoby to https://partner.steamgames.com/apps/builds/1000. Tam możesz ustawić tę kompilację jako aktywną dla domyślnej gałęzi lub dowolnej gałęzi beta, a użytkownicy będą w stanie pobrać tę aktualizację w ciągu kilku minut.

Zaawansowane skrypty kompilacyjne


Jeżeli twoja aplikacja ma wiele magazynów zawartości ze złożonymi regułami mapowania plików, możesz stworzyć skrypt kompilacyjny magazynu zawartości dla każdego magazynu, do którego będzie odnosił się skrypt kompilacyjny aplikacji. Najpierw rzućmy okiem na dostępne parametry w skrypcie kompilacyjnym aplikacji:

  • AppID – ID aplikacji twojej gry. Przesyłające konto partnerskie Steam musi posiadać uprawnienia do edycji metadanych aplikacji.
  • Desc – opis jest widoczny tylko dla ciebie w sekcji „Twoje kompilacje” w panelu administratora aplikacji. Można to zmienić w dowolnej chwili po przesłaniu kompilacji na stronie „Twoje kompilacje”.
  • ContentRoot – folder root twoich plików gry, może być ścieżką bezwzględną lub względną do pliku skryptu kompilacyjnego.
  • BuildOutput – ten katalog będzie miejscem na dzienniki kompilacji, manifesty magazynów zawartości, pamięci podręczne porcji programu oraz pośredni zapis danych. Dla najlepszych rezultatów użyj oddzielnego dysku dla twojego rezultatu kompilacji. Rozdziela to pracę wejścia/wyjścia, pozwalając twojemu dyskowi z rootem zawartości na zajęcie się żądaniami odczytu, a twojemu dyskowi z rezultatem zająć się żądaniami zapisu.
  • Preview – ten typ kompilacji tworzy na wyjściu tylko dzienniki i plik manifestu do folderu wyjściowego kompilacji. Tworzenie kompilacji podglądu jest dobrym sposobem na iterowanie twoich skryptów przesyłania i upewnienie się, że twoje mapowania plików, filtry i właściwości działają jak należy.
  • Local – ustaw to na ścieżkę htdocs swojego lokalnego serwera zawartości (Local Content Server – w skrócie LCS). Kompilacje LCS umieszczają zawartość tylko na twoim własnym serwerze HTTP i umożliwiają ci przetestowania instalacji twojej gry z wykorzystaniem klienta Steam.
  • SetLive – nazwa gałęzi beta do automatycznego ustawienia jako aktywnej po pomyślnej kompilacji. Żadna, gdy puste. Pamiętaj, że nie można ustawić „domyślnej” gałęzi jako aktywnej automatycznie – należy to zrobić poprzez panel administratora aplikacji.
  • Depots – ta sekcja zawiera wszelkie mapowania plików, filtry i właściwości plików dla każdego magazynu lub odnosi się do oddzielnego skryptu kompilacyjnego dla każdego magazynu zawartości.

Przykładowy skrypt kompilacyjny aplikacji app_build_1000.vdf używający wszystkich opcji:
"AppBuild" { "AppID" "1000" // twoje ID aplikacji "Desc" "Your build description here" // wewnętrzny opis dla tej kompilacji "Preview" "1" // uczyń to tylko kompilacją poglądową, nic nie jest przesyłane "Local" "..\..\ContentServer\htdocs" // umieść zawartość na lokalnym serwerze zawartości zamiast przesyłać na Steam "SetLive" "AlphaTest" // ustaw tę kompilację jako aktywną na gałęzi beta "ContentRoot" "..\content\" // folder root zawartości w odniesieniu do tego pliku skryptu "BuildOutput" "D:\build_output\" // umieść pamięć podręczną kompilacji i pliki dzienników na innym dysku dla lepszej wydajności "Depots" { // instrukcje mapowania plików dla każdego magazynu zawartości są w oddzielnych plikach skryptów "1001" "depot_build_1001.vdf" "1002" "depot_build_1002.vdf" } }

Ten skrypt kompilacyjny aplikacji odwołuje się do dwóch plików skryptów kompilacyjnych magazynów zawartości, które określają wszystkie mapowania plików i właściwości plików. Poniższe instrukcje są dostępne w skrypcie kompilacyjnym magazynu zawartości (i również, gdy sekcja jest zawarta bezpośrednio w skrypcie kompilacyjnym aplikacji).

  • DepotID – ID magazynu zawartości dla tej sekcji.
  • ContentRoot – umożliwia ci opcjonalne obejście folderu ContentRoot ze skryptu kompilacyjnego aplikacji dla każdego magazynu oddzielnie.
  • FileMapping – mapuje to pojedynczy plik lub zbiór plików z lokalnego roota zawartości do twojego magazynu. Może istnieć wiele mapowań plików, które dodają pliki do magazynu zawartości. Parametr LocalPath jest ścieżką względną do folderu roota zawartości i może zawierać wieloznaczniki takie jak „?” lub „*”. Zostanie również zastosowany do pasujących plików w podfolderach, jeżeli Recursive jest włączone. Parametr DepotPath określa, gdzie wybrane pliki powinny się pojawić w magazynie (użyj samej kropki dla braku specjalnego mapowania).
  • FileExclusion – ponownie wykluczy zmapowane pliki i może również zawierać wieloznaczniki takie jak „?” lub „*”.
  • InstallScript – oznaczy plik jako skrypty instalacyjne i podpisze plik podczas procesu kompilacji. Klient Steam wie, by uruchamiać je dla dowolnej aplikacji, która ładuje ten magazyn zawartości.
  • FileProperties – oznaczy plik specjalnymi flagami:
    • userconfig – ten plik jest modyfikowany przez użytkownika lub grę. Nie może on zostać nadpisany przez aktualizację i nie wywoła on błędu weryfikacji, jeśli jest inny od swojej poprzedniej wersji.
    • versionedconfig – podobny do userconfig, jednak jeżeli plik zostanie zaktualizowany w magazynie zawartości, to zostanie nadpisany lokalnie, kiedy gra użytkownika zostanie zaktualizowana. Aktualizuj plik w magazynie zawartości tylko wtedy, gdy istnieje potrzeba zmiany formatu lub poprawienia błędu.

Przykładowy skrypt kompilacyjny magazynu zawartości depot_build_1002.vdf pokazujący użycie wszystkich opcji:
"DepotBuild" { "DepotID" "1002" "ContentRoot" "C:\content\depot1002" // obejdź ContentRoot ze skryptu kompilacyjnego aplikacji "FileMapping" { // wszystkie pliki źródłowe i foldery w ".\bin" będą zmapowane do folderu ".\executables" w magazynie "LocalPath" "bin\*" "DepotPath" "executables\" "Recursive" "1" // zawuera wszystkie podfoldery } "FileMapping" { // nadpisz pliki audio w \\audio niemieckimi wersjami "LocalPath" "localization\german\audio\*" "DepotPath" "audio\" } "FileMapping" { // skopiuj skrypt instalacyjny dla wersji niemieckiej do folderu roota magazynu "LocalPath" "localization\german\german_installscript.vdf" "DepotPath" "." } "FileExclusion" "bin\server.exe" // wyklucz ten plik "FileExclusion" "*.pdb" // wyklucz wszystkie pliki .PDB wszędzie "FileExclusion" "bin\tools*" // wyklucz wszystkie pliki w bin\tools\ "InstallScript" "localization\german\german_installscript.vdf" "FileProperties" { "LocalPath" "bin\setup.cfg" "Attributes" "userconfig" // ten plik zostanie zmodyfikowany podczas działania programu } }

UWAGA: możesz nazwać te skrypty tak, jak chcesz, ale dla zachowania spójności my używamy app_build_<AppID> oraz depot_build_<DepotID>. Jeżeli masz pewność, że będziesz kompilować aplikacje na tym komputerze, to dobrym pomysłem może okazać się stworzenie podkatalogów dla każdej aplikacji w twoim folderze scripts, by lepiej zorganizować dla nich skrypty kompilacyjne.

Zarządzanie aktualizacjami

Po wydaniu aplikacji użytkownicy otrzymają kompilację oznaczoną jako domyślną. Podczas przesyłania nowej kompilacji zawsze dobrze sprawdzić ją, zanim trafi ona do klientów. Aby dowiedzieć się więcej, jak skutecznie przeprowadzić ten proces, sprawdź dział dokumentacji o testowaniu na Steam.

Debugowanie problemów z kompilacją

Jeżeli twoja kompilacja nie powiodła się, powinieneś zajrzeć do folderu z rezultatem, by znaleźć informacje o błędach, a nie do konsoli, której użyto do uruchomienia skryptu kompilującego. Większość informacji o błędach znajduje się w plikach *.log.
Możesz użyć komend klienta Steam oraz plików klienckich, by debugować te problemy:
  • "app_status [ID aplikacji]" – pokazuje obecny stan aplikacji na tym kliencie.
  • "app_info_print [ID aplikacji]" – pokazuje obecną konfigurację Steamworks dla tej gry (magazyny, opcje uruchamiania itp.).
  • "app_config_print [ID aplikacji]" – pokazuje obecną konfigurację użytkownika dla tej gry (obecny język, ścieżka instalacyjna itp.).
  • file "logs\content_log.txt" – wylistowuje wszystkie zapisane operacje oraz błędy SteamPipe.
  • file "steamapps\appmanifest_[ID aplikacji].acf" – pokazuje obecny stan instalacji tej aplikacji (wartości klucza).

Kompilowanie wydajnych magazynów zawartości dla SteamPipe

Stary system zawartości Steam dodawał łatki na poziomie pliku, co oznaczało, że zmiana nawet jednego bajta powodowała konieczność pobrania całkowicie nowego pliku ze strony wszystkich użytkowników. Było to szczególnie niewydajne w przypadku gier korzystających z plików paczek – są to kolekcje plików zawartości gry w jednym dużym pliku. Pliki paczek mogą z łatwością zajmować ponad 1 GB, więc aktualizacje często prowadziły do niepotrzebnie dużych pobrań. Typowym sposobem na ominięcie tej niedogodności było dodanie nowych plików paczek, które nadpisywały zawartość już dostarczonych plików paczek. Działało to dla aktualizacji, ale długofalowo szkodziło nowym użytkownikom, ponieważ pobierali oni nieużywaną, już załataną zawartość.

Nowy system zawartości naprawia ten problem poprzez rozdzielenie każdego pliku na ważące około 1 MB porcje. Każda porcja jest następnie kompresowana i szyfrowana, zanim trafi do dystrybucji w systemie zawartości Steam. Jeżeli zawartość gry ma duże, powtarzalne elementy, to te porcje są używane ponownie i użytkownik musi jednorazowo pobrać tylko każdą powtórzoną porcję. Mimo to prawdziwą zaletą tego systemu jest kompilowanie wydajnych aktualizacji. Gdy system kompiluje aktualizację, nowa zawartość jest skanowana pod kątem już znanych porcji. Jeżeli takowe zostaną znalezione, to są one używane ponownie. Oznacza to, że jeżeli zmienisz lub wstrzykniesz kilka bajtów do dużego pliku, to użytkownik musi pobrać tylko te zmiany.

W większości przypadków sprawdza się to dobrze, ale wciąż istnieje kilka pułapek, których należy unikać podczas projektowania rozłożenia zawartości gry. Prawdopodobnie nie będziesz chciał kompresować ani szyfrować danych twojej gry – jest to już robione przez system zawartości Steam dla pobrań w locie oraz dysków oferowanych w sprzedaży detalicznej. Jeżeli ty też się tym zajmiesz, to może to zmniejszyć skuteczność aktualizacji opartych na deltach między plikami. Zaleca się korzystać z tych rozwiązań, tylko jeśli każdy indywidualny zasób wewnątrz pliku pakietu ma być oddzielnie kompresowany i/lub szyfrowany. W przeciwnym wypadku zmiana jednego zasobu będzie zawsze wymagała pobrania wielu innych, potencjalnie niezmienionych zasobów.

Jeśli spakujesz wiele zasobów do jednego pliku paczki, upewnij się, że wraz z każdym zapakowaniem nie zajdą żadne niepotrzebne zmiany. Jedną problematyczną praktyką jest zawieranie pełnej nazwy pierwotnego źródła plików na dysku, ponieważ nazwy mogą się zmieniać w zależności od maszyny, na której dokonywana jest kompilacja. Innym złym nawykiem jest zawieranie znaczników czasowych kompilacji w każdym pliku. Jeżeli to możliwe, zawsze dodawaj nową zawartość na koniec twoich plików paczek i utrzymuj kolejność istniejących plików. Trzymaj także metadane pliku paczki (zmiany i rozmiary w indywidualnych zasobach) w jednym miejscu i nie rozpraszaj ich do danych zasobów. Używaj narzędzia do sprawdzania różnic binarnych jak BeyondCompare, by móc spojrzeć na dwie kompilacje twoich plików paczek i upewnić się, że setki niechcianych zmian nie są wyświetlane.

Jeżeli będziesz przestrzegać tych zasad, to zminimalizujesz rozmiary aktualizacji oraz sprawisz, że konieczne będzie pobranie tylko nowej zawartości. Twoi klienci będą ci za to wdzięczni, a ty będziesz w stanie zwiększyć jakość swojego produktu poprzez wydawanie większej liczby aktualizacji.

Jeżeli podejrzewasz, że pakiety twojej gry nie współgrają dobrze z procesem aktualizacji SteamPipe, prosimy o kontakt z twoim przedstawicielem Valve, abyśmy mogli rozważyć włączenie zaawansowanych funkcji, by pomóc z tym problemem.

Tworzenie płyt instalacyjnych oferowanych w sprzedaży detalicznej

Aby stworzyć kompilacje dla płyt instalacyjnych dla gier obsługujących SteamPipe oferowanych w sprzedaży detalicznej, musisz najpierw skonfigurować plik projektu kompilacji.
W tym przykładzie plik SKU nazywa się „sku_goldmaster.txt”:
"sku" { "name" "Testowy instalator gry" "appid" "202930" "disk_size_mb" "640" "included_depots" { "1" "202931" "2" "202932" } }
Kilka rad do zapamiętania:
  • Utwórz nowy folder w miejscu zapisu obrazów płyty, np. „D:\retail_disks”. Tylko magazyny zawartości wymienione w sekcjach included_depots zostaną dodane; sekcja wykluczania już nie istnieje.
  • Do stworzenia kompilacji obrazów instalacji możesz wykorzystać zarówno Steam.exe (z parametrami wiersza polecenia -dev i -console), jak i steamcmd.exe. W obydwu przypadkach użyj komendy „build_installer”.
  • Zaloguj się na konto Steam posiadające grę oraz wszystkie magazyny zawartości, jakie chcesz umieścić na płycie instalacyjnej. Poza tym nie są wymagane żadne specjalne uprawnienia, więc każdy może tworzyć takie kompilacje.
  • Jeżeli korzystasz ze Steam.exe, przerwij wszelkie inne pobierania.
  • Przejdź do strony konsoli i uruchom komendę „build_installer”:
    build_installer sku_goldmaster.txt "D:\retail_disks"
    Kompilacja może zająć trochę czasu, ponieważ za pierwszym razem wszystkie magazyny zawartości są pobierane ponownie.
  • Jeżeli tworzysz gold mastera z użyciem lokalnego serwera zawartości, to uruchom:
    @localcontentserver "webserver"
    build_installer sku_goldmaster.txt "D:\retail_disks" local
    Rezultat odwołuje się do „Backup”, ponieważ „Retail install Disk” oraz lokalne kopie zapasowe gry są w zasadzie tym samym.
  • Po tym, jak zobaczysz komunikat „Backup finished for AppID...” („Zakończono tworzenie kopii zapasowej dla ID aplikacji...”), obrazy płyty instalacyjnej będą gotowe. Więcej szczegółów odnośnie kompilacji kopii zapasowej znajdują się w pliku logs\backup_log.txt.
  • Pod ścieżką „D:\retail_disks” pojawiły się nowe foldery (Disk_1, Disk_2 itd.) o wadze nieprzekraczającej 640 MB, tak jak podano to w linijce „disk_size_mb”. Każdy folder płyty zawiera plik „sku.sis” oraz pliki .csd i .csm dla każdego magazynu zawartości. Większe magazyny zawartości są rozdzielone między wieloma płytami. Cała zawartość płyty jest zawsze szyfrowana (w przeciwieństwie do lokalnych plików kopii zapasowej). Skopiuj pliki konfiguracyjne SDK dla gold mastera (setup.exe, setup.ini itd.) do folderu twojej pierwszej płyty. Płyta instalacyjna jest gotowa.
  • Podczas tworzenia gold mastera dla systemu macOS upewnij się, by na Macu otworzyć obraz goldmaster/disk_assets/SteamRetailInstaller.dmg. Następnie znajdującą się w nim aplikację skopiuj do roota twoich mediów. Prawdopodobnie będziesz chciał zmienić nazwę aplikacji instalacyjnej, dodać markę do ikony oraz ozdobić okno tak, by pokazywało tylko instalator.
  • Podczas tworzenia wielopłytowych gold masterów na system macOS upewnij się, że nazwa woluminu jest prawidłowa dla każdej płyty. Nazwa woluminu staje się częścią ścieżki montowania, więc jeśli nazwy nie są zgodne, to instalator nie będzie w stanie znaleźć kolejnego dysku.

Opcjonalna kompilacja instalatora do sprzedaży detalicznej z gałęzi beta

Powyższy proces tworzy instalator na podstawie domyślnej gałęzi. Jednak jeżeli potrzebujesz go utworzyć na podstawie gałęzi beta, to musisz najpierw utworzyć gałąź beta o nazwie „baseline”. Następnie użyj następującej komendy, by stworzyć kompilację z tej gałęzi:
build_installer <nazwa projektu> <folder docelowy> <klucz bety> <hasło bety> steamcmd ex: build_installer sku_goldmaster.txt "D:\retail_disks" baseline superSecret script ex: steamcmd.exe +login nazwa_użytkownika hasło +build_installer "..\Build\GameDataSku.txt" c:\lokalizacja klucz_bety hasło_bety +exit

Instalacja DLC z poziomu instalatora do sprzedaży detalicznej

W niektórych okolicznościach pożądane może być stworzenie instalatora zawierającego twoje pakiety DLC. W takim przypadku proces tworzący instalator wymaga tylko kilku zmian.
W pliku „sku_goldmaster.txt” dołącz ID aplikacji DLC w sekcji „included depots”. Po zakończeniu działania procesu „build_installer” znajdź wygenerowany plik sku.sis dla instalatora i otwórz go w edytorze tekstowym.
Dodaj ID aplikacji DLC w sekcji „apps”. Przykładowo, jeśli gra ma ID aplikacji równe 1000 i ID aplikacji DLC równe 1010, to sekcja „apps” będzie wyglądała następująco:
"apps" { "0" "1000" "1" "1010" }
Pozwoli to upewnić się, że Steam sprawdzi stan posiadania DLC i poprosi użytkownika o wprowadzenie klucza, jeżeli obecnie zalogowane konto nie posiada danego DLC.

Tworzenie instalatora do sprzedaży detalicznej z wielu ID aplikacji na pojedynczej płycie lub pakiecie instalacyjnym

Aby stworzyć gold mastera zawierającego wiele aplikacji SteamPipe, stwórz instalator dla każdej aplikacji jedna po drugiej, ale wskaż im ten sam folder rezultatu. Każda kompilacja będzie łączona z już istniejącym obrazem instalacyjnym.

Dostosowywanie płyty instalacyjnej do sprzedaży detalicznej

Sprawdź dział o dostosowywaniu gold mastera, by dowiedzieć się więcej o dostosowywaniu twojej płyty instalacyjnej.

Pobieranie wstępne gier przed wydaniem

Domyślnie cała zawartość na wszystkich płytach przeznaczonych do sprzedaży detalicznych i na wszystkich serwerach zawartości jest zawsze szyfrowana. Zmiana gry na tryb pobierania wstępnego oznacza, że właściciele mogą pobrać zawartość, ale pozostaje ona zaszyfrowana na dysku użytkownika i nie może zostać uruchomiona. Po tym, jak gra zostanie oficjalnie wydana, Steam deszyfruje pobraną wstępnie zawartość i użytkownik może rozpocząć grę.

Zmiana gry na tryb pobierania wstępnego jest zalecana w następujących przypadkach:
  • Wysyłka płyt w sprzedaży detalicznej wraz z kluczami produktu przed faktyczną dostępnością gry (natychmiastowe piractwo).
  • Gry znajdujące się w przedsprzedaży i jednocześnie zajmujące więcej niż 20 GB miejsca na dysku.

Prosimy o przesłanie prośby o pomoc do Steam Publishing, jeśli wierzysz, że twoja gra wymaga skorzystania z pobierania wstępnego.

Tworzenie DLC

DLC są kompilowane jako magazyn zawartości gry bazowej. Przejdź do dokumentacji o DLC, by dowiedzieć się więcej.

Rozwiązywanie problemów ze SteamPipe

"Login Failure: Account Login Denied Failed" when logging in via steamcmd

Przyczyna: prawdopodobnie Steam Guard uniemożliwia zalogowanie się. Rozwiązanie:
  • Sprawdź adres e-mail powiązany z kontem, na które próbujesz się zalogować, i znajdź e-maila od Pomocy technicznej Steam. Skopiuj kod z tego e-maila.
  • Uruchom następującą komendę w steamcmd: set_steam_guard_code <code>.
  • Re-Attempt login from steamcmd: Steam>login <buildaccount> <password>

Ogólne rozwiązywanie problemów z pobieraniem

  • Uruchom ponownie swój komputer, modem, router itp.
  • Sprawdź ustawienia zapory sieciowej. Nowy system wymaga dostępności portu 80 (HTTP) oraz wszelkich innych portów używanych przez Steam wymienionych tutaj.
  • Tymczasowo wyłącz lokalne programy antywirusowe i antyspamowe.
  • Sprawdź region pobierania Steam w Ustawieniach->Pobieranie. Powinien on zgadzać się z twoją lokalizacją.
  • Przerwij pobieranie, odinstaluj grę, a następnie zainstaluj ją ponownie (wyczyść pamięci podręczne manifestów).
  • Wyjdź ze Steam i usuń foldery appcache oraz depotcache w swoim folderze instalacyjnym Steam.
  • Spróbuj ustawić region pobierania Steam na taki, który jest bardzo odległy. Może to zadziałać, jeśli pobliski serwer zawartości przesyła ci złe dane.

Moje kompilacje na systemy macOS i Linux nie instalują żadnych plików. Dlaczego?

Jeżeli używasz Steam do testowania instalacji twojej gry lub aplikacji na wielu platformach, możesz napotkać sytuację, w której kompilacja rozmieszcza pliki na systemie Windows, ale nie na macOS lub Linuxie, pomimo skonfigurowania procesu SteamPipe do przesyłania magazynów zawartości dla tych dwóch systemów. Istnieje pewien krok, który łatwo pominąć, a który obejmuje dodanie twoich alternatywnych magazynów zawartości do rozmieszczanego pakietu. Możesz sprawdzić, które magazyny zawartości są załączone w danym pakiecie, wykonując następujące kroki:
  1. Przejdź do strony administratora aplikacji.
  2. Z poziomu sekcji „Pokaż powiązane produkty” kliknij na Wszystkie powiązane pakiety, DLC, dema i narzędzia.
  3. Kliknij na tytuł pakietu, który próbujesz pobrać.
  4. Sprawdź sekcję załączone magazyny zawartości.
  5. Użyj przycisku Dodaj/usuń magazyny, by upewnić się, że właściwy zbiór magazynów został przydzielony danemu pakietowi.
Istnieje też kilka wątków dyskusyjnych w języku angielskim, które również mogą pomóc:

Uruchomienie steamcmd.exe skutkuje następującym błędem: „SteamUpdater: Błąd: Aplikacja Steam musi być w trybie online, by można ją było zaktualizować. Sprawdź połączenie z siecią i spróbuj ponownie”.

Rozwiązanie: przejdź do Opcji internetowych->Połączenia->Ustawienia LAN i zaznacz opcję Automatycznie wykryj ustawienia.

Uruchomienie kompilacji aplikacji skutkuje następującym błędem: „ERROR! Failed 'DepotBuild for scriptname.vdf' - status = 6”.

Możliwe przyczyny:
  • Konto nie posiada uprawnień do aplikacji.
    • Sprawdź, czy ID aplikacji jest poprawne w pliku app_build.vdf.
    • Sprawdź, czy konto używane do kompilacji ma odpowiednie uprawnienia dla danego ID aplikacji.
  • Steamcmd nie może znaleźć zawartości magazynów.
    • Sprawdź, czy wartość „contentroot” w skrypcie app_build jest właściwą ścieżką względną do lokalizacji pliku skryptu.
    • Sprawdź, czy wartość „LocalPath” w skrypcie depot_build jest właściwą ścieżką względną do ścieżki w skrypcie app_build, po czym sprawdź, czy ścieżka posiada faktyczną zawartość.

Uruchomienie kompilacji aplikacji skutkuje następującym błędem: „ERROR! Failed to get application info for app NNNNN (check login and subscription)”.

Ten błąd oznacza, że Steam nie może uzyskać informacji o aplikacji, ponieważ albo ona nie istnieje, albo użytkownik nie ma do niej dostępu.
  • Sprawdź, czy NNNNN jest ID aplikacji, które zostało ci dla niej przydzielone.
  • Sprawdź, czy ID aplikacji jest poprawne w pliku app_build.vdf.
  • Jeżeli jest to nowe ID aplikacji, sprawdź, czy konfiguracja w panelu administratora aplikacji Steamworks została opublikowana. Nowe aplikacje powinny zawierać folder instalacyjny SteamPipe w zakładce konfiguracji, magazyn zawartości w zakładce magazynów zawartości oraz wszystkie opublikowane zmiany w zakładce publikacji.
  • Jeżeli wszystko wygląda prawidłowo, upewnij się, że twoje konto posiada to ID aplikacji.

„An error occurred while installing [nazwa aplikacji] (Invalid content configuration)” podczas uruchamiania

Możliwe przyczyny:
  • Nie opublikowano kompilacji na gałęzi, z której próbujesz dokonać instalacji.
    Rozwiązanie: Opublikuj swoją gałąź, przechodząc na stronę https://partner.steamgames.com/apps/builds/<YourGameAppId> i wybierając tę gałąź w kliencie Steam (tak jak to opisano tutaj).
  • Invalid game launch options.
    Resolution: Verify the launch options on the Installation tab in the app admin for your game https://partner.steamgames.com/apps/config/<YourGameAppId>.
  • Nie posiadasz ID magazynów zawartości, które składają się na grę.
    Rozwiązanie: upewnij się, że potrzebne magazyny zawartości zostały dodane do subskrypcji rozwojowej (sprawdź artykuł o edytowaniu pakietów, by dowiedzieć się więcej).

„Error code 15” podczas uruchamiania

Oznacza to, że serwery CEG odrzucają żądanie rejestracji pliku exe. Sprawdź stan wydania na stronie gry – jeżeli nie jest ona oznaczona jako „grywalna”, to będziesz musiał przesłać żądanie kluczy Steam obchodzących stan wydania.

„Serwery Steam są w tej chwili zbyt zajęte, by obsłużyć twoje żądanie dla [nazwa gry]. Kod błędu (2).” podczas uruchamiania

Oznacza to, że serwery CEG nie są w stanie znaleźć pasującego pliku exe. Sprawdź, czy masz plik exe zgodny z CEG w zakładce CEG na stronie administratora aplikacji. Kliknij przycisk „status”, by upewnić się, że plik jest poprawny.

Nie pamiętam tej jednej komendy steamcmd lub jak ona działała

Użyj komendy „find” w steamcmd, by znaleźć dowolną inną komendę. Wykona ona częściowe dopasowanie nazwy komendy, a następnie wylistuje jej składnię.
Steam>find build_installer ConVars: Commands: build_installer : <nazwa projektu> <folder docelowy> <klucz bety> <hasło bety>