เอกสาร Steamworks
การอัปโหลดไปยัง Steam

เวอร์ชันใหม่กว่าพร้อมดูในภาษาอังกฤษ

หน้านี้ในเวอร์ชันภาษาอังกฤษได้รับการอัปเดตแล้วนับตั้งแต่เผยแพร่การแปลนี้
คลิกที่นี่ เพื่อดูหน้านี้ในเวอร์ชันภาษาอังกฤษ
ต่อไปนี้เป็นคำแนะนำในการใช้ SteamPipe ซึ่งเป็นเครื่องมือของ Valve เพื่อนำส่งเนื้อหาไปยัง Steam หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับแนวทางปฏิบัติที่ดีที่สุดในการอัปเดตเกมของคุณ กรุณาอ่าน Updating Your Game - Best Practices

ระบบเนื้อหา SteamPipe เบื้องต้น

SteamPipe คือ ระบบเนื้อหาของเกม/แอปพลิเคชันที่เป็นขุมพลังให้ Steam SteamPipe มีคุณสมบัติดังต่อไปนี้:
  • การนำส่งเนื้อหาที่มีความรวดเร็วและมีประสิทธิภาพ
  • การเพิ่มแบรนช์เวอร์ชัน "เบต้า" ทั้งแบบที่เปิดต่อสาธารณะและส่วนบุคคลที่ไม่จำกัด ทำให้สามารถทดสอบได้หลายบิลด์
  • การจัดการบิลด์ด้วยรูปแบบเว็บไซต์ที่เรียบง่าย - จะส่งบิลด์ใหม่ออกหรือดึงบิลด์เก่ากลับก็ง่าย ใช้เพียงแค่ไม่กี่คลิก
  • สามารถมองเห็นขนาดอัปเดตของบิลด์ก่อนที่จะส่งออกไปให้ใช้งานจริง
  • สามารถแบ่งปันเนื้อหาระหว่างแอปพลิเคชันหลาย ๆ ตัวได้
  • สามารถ สร้างดิสต์ตัวติดตั้ง จากเนื้อหาสาธารณะหรือเนื้อหาเบต้าได้
  • เกม/แอปจะพร้อมใช้งานแบบออฟไลน์ได้เสมอ แม้ว่าจะได้เริ่มการดาวน์โหลดตัวอัปเดตไปแล้วก็ตาม
  • เนื้อหาทั้งหมดจะได้รับการเข้ารหัสเสมอ และลูกค้าจะไม่สามารถมองเห็นเวอร์ชันที่ไม่ได้ใช้งานอยู่
  • เซิร์ฟเวอร์เนื้อหาภายในเครื่อง SteamPipe ที่สามารถใช้งานได้ในระหว่างการพัฒนา
หมายเหตุ: มีแนวคิดใหม่ ๆ ที่สำคัญต่อ SteamPipe เพราะฉะนั้น ก่อนที่จะเริ่มใช้งาน ขอแนะนำให้คุณทำความคุ้นเคยกับแนวคิดทั้งหมดที่ได้ระบุไว้ในเอกสารประกอบการใช้งาน แอปพลิเคชัน เพราะการมีความเข้าใจขั้นพื้นฐานว่าสิ่งเหล่านี้ทำงานประสานกันอย่างไรนั้นจะมีประโยชน์อย่างมากเวลาที่คุณอัปโหลดผลิตภัณฑ์ของคุณไปยัง Steam

วิดีโอฝึกสอน Steamworks - การสร้างเกมของคุณใน Steampipe

การฝึกสอนนี้จะแนะนำ SteamPipe และขั้นตอนต่าง ๆ ผ่านทางการสร้างแอปพลิเคชันตัวอย่างสำหรับ Steam ด้วยเครื่องมือ Steamworks
https://www.youtube.com/watch?v=SoNH-v6aU9Q

วิดีโอฝึกสอน Steamworks - การเพิ่มแพลตฟอร์มและภาษาใหม่

การฝึกสอนนี้จะอธิบายวิธีการเพิ่มแพลตฟอร์มและภาษาใหม่ไปยังเกมของคุณด้วยการเพิ่มดีโปไปยังแอปของคุณ
https://www.youtube.com/watch?v=PShS32hcing

รายละเอียดทางเทคนิคของ SteamPipe

SteamPipe จะใช้โปรโตคอล HTTP ในการนำส่งเนื้อหา Since downloads are regular web traffic, any third-party HTTP cache between the customer and Steam servers will increase download speed. Content can be hosted by external CDN providers, which can be easily added to our content network. Most consumer firewalls allow HTTP traffic and won't block downloads.

SteamPipe has an efficient patching algorithm based on binary deltas, only changing the modified portions of existing content files. When this content is updated, only these deltas need be sent. This means both developer and user transfers are smaller and faster. Most partners will find that using a เซิร์ฟเวอร์เนื้อหาภายในเครื่อง SteamPipe not necessary since they can efficiently patch builds on private branches.

บัญชีบิลด์ Steam

Before you can create any builds on Steam, you must have a Steam account in your Steamworks account with the "Edit App Metadata" and "Publish App Changes To Steam" permissions granted. For security reasons it's recommended that you have a dedicated build account with just those permissions, you may create a new Steam account for this purpose at https://store.steampowered.com/join.

Any administrator of your Steamworks account can add a Steam account and grant the necessary permissions. More information on this process can be found in the การจัดการบัญชี Steamworks ของคุณ documentation. An example of what this account might look like is:

create_build_account.png

การติดตั้งครั้งแรกสำหรับแอป SteamPipe ใหม่

Follow these steps to set up new SteamPipe apps:
  1. หาไอดีแอปของแอปพลิเคชันของคุณ (ซึ่งสามารถหาได้ด้วยการเลือกแอปพลิเคชันดังกล่าวที่หน้าหลักใน Steamworks ของคุณ)
  2. ไปที่หน้า การตั้งค่าการติดตั้งทั่วไป ของแอปของคุณ
  3. กำหนดตัวเลือกการเริ่มใช้งานอย่างน้อย 1 ตัวเลือก (เส้นทาง และหากเป็นไปได้ ให้ใส่อาร์กิวเมนต์ที่จำเป็นต้องใช้ในการเปิดใช้เกมด้วย) เลื่อนเมาส์ไปค้างไว้เหนือ (?) เพื่อรับทราบข้อมูลเพิ่มเติมเกี่ยวกับช่องข้อมูลแต่ละช่อง

    ตัวอย่างด้านล่างนี้แสดงตัวเลือกการเริ่มใช้งาน 4 ตัวเลือก โดยแบ่งเป็น 2 ตัวเลือกสำหรับระบบ Windows และอย่างละ 1 ตัวเลือกสำหรับระบบ MacOS และ Linux ตัวเลือกการเริ่มที่ 3 จะแสดงบนระบบ Windows เมื่อผู้ใช้เป็นเจ้าของเนื้อหาดาวน์โหลดที่ระบุไว้เท่านั้น

    updatedlaunchoptions.png
  4. ไปที่หน้า ดีโป และเพิ่มดีโปให้แก่แอปนี้ตามที่จำเป็น ซึ่งตามค่าเริ่มต้นแล้ว ดีโปอาจจะได้รับการกำหนดค่าสำหรับแอปพลิเคชันของคุณเรียบร้อยแล้วก็เป็นได้
    1. คลิกที่ดีโปเริ่มต้นแล้วเปลี่ยนชื่อของดีโปให้เป็นชื่อที่หมาะสมและจดจำได้ง่าย (เช่น "เนื้อหาฐาน" หรือ "เนื้อหาสำหรับ Windows")
    2. Leave the language set to [All languages] unless this is a language-specific depot.
    3. ปล่อยการตั้งค่า OS ให้เป็น [All OSes] เอาไว้ เว้นแต่ว่านี่จะเป็นดีโปที่มีการระบุ OS เฉพาะ (หากแอปเป็นประเภท all-in-one หรือใช้สำหรับ PC หรือ Mac อย่างเดียว ควรจะปล่อยไว้เป็น [All OSes] ให้ระบุเฉพาะกับดีโปเกมที่มีการระบุ OS เฉพาะเท่านั้น
    4. คลิก เพิ่มดีโปใหม่ เพื่อสร้างดีโปเพิ่มเติม
    5. คลิก บันทึกการเปลี่ยนแปลง เพื่อบันทึกการเปลี่ยนแปลงที่ได้ทำไป
  5. เมื่อคุณตั้งค่าดีโปของคุณเสร็จแล้ว ให้เผยแพร่การเปลี่ยนแปลงที่คุณได้ดำเนินการจากหน้า เผยแพร่
  6. ดีโปที่เพิ่งได้รับการกำหนดค่าใหม่ของคุณจะต้องถูกบรรจุไว้ในแพ็กเกจเพื่อมอบสิทธิ์การเป็นเจ้าของดีโปดังกล่าวแก่คุณได้ เกมแต่ละเกมบน Steam ควรจะมีแพ็กเกจ Developer Comp ที่จะถูกมอบให้กับบัญชีที่ได้ระบุรายการไว้ในกลุ่มผู้จัดจำหน่ายของคุณโดยอัตโนมัติ
    คุณสามารถเพิ่มดีโปใหม่เหล่านี้ไปยังแพ็กเกจดังกล่าวได้ (และ/หรือแพ็กเกจอื่น ๆ ที่ควรจะมีดีโปเหล่านี้) ได้ที่หน้า แพ็จเกจ & เนื้อหาดาวน์โหลดที่เกี่ยวข้อง
หมายเหตุ: หากตัวโปรแกรมที่สั่งใช้งานได้ของคุณอยู่ในโฟลเดอร์ย่อยของโฟลเดอร์การติดตั้งหลัก ให้เพิ่มชื่อโฟลเดอร์ย่อยในช่องข้อมูลตัวโปรแกรมที่สั่งใช้งานได้ อย่าใช้เครื่องหมายทับหรือจุดนำหน้า

การเริ่มตั้งค่า SDK สำหรับการอัปโหลด SteamPipe

Download and unzip the latest version of the Steamworks SDK on the machine you will be uploading builds on.

The SteamPipe tools can be found within the SDK in the tools folder which contains 2 relevant sub-directories.

The ContentBuilder directory is where your game content and SteamPipe build tools will live. This directory contains the following sub-directories:
  • builder - ไดเรกทอรีนี้เริ่มแรกจะบรรจุเพียง steamcmd.exe ที่เป็น Steam เวอร์ชันคอมมานด์ไลน์อยู่เพียงเท่านั้น
  • builder_linux - steamcmd เวอร์ชัน Linux
  • builder_osx - steamcmd เวอร์ชัน macOS
  • content - ไดเรกทอรีนี้จะบรรจุไฟล์เกมทั้งหมดที่จะถูกบิลด์ลงไปในดีโป
  • output - ไดเรกทอรีนี้จะเป็นตำแหน่งที่ตั้งสำหรับเก็บบันทึกของบิลด์ กลุ่มแคช และเอาต์พุตระดับกลาง หมายเหตุ: สามารถลบหรือล้างโฟลเดอร์นี้ให้ว่างได้ตามต้องการ แต่หากลบไปแล้ว การอัปโหลดครั้งต่อไปจะใช้เวลานานขึ้น
  • scripts - ไดเรกทอรีนี้จะเป็นที่ที่คุณเอาไว้วางสคริปต์บิลด์ทั้งหมดสำหรับสร้างดีโปเกมของคุณ
steampipebuilddir.png

It's recommended that you run steamcmd.exe directly in the builder folder for your platform once to bootstrap your build system. This should populate your builder directory with all the files it needs to build depots.

The ContentServer directory contains the tools for running your own เซิร์ฟเวอร์เนื้อหาภายในเครื่อง SteamPipe if you choose to do so.

SteamCmd บน macOS

To enable SteamCmd on macOS you must complete the following steps:
  1. จากเทอร์มินัล ให้ไปที่โฟลเดอร์ tools\\ContentBuilder\\\\osx32
  2. เรียกใช้ chmod +x steamcmd
  3. ไปที่โฟลเดอร์หลัก (tools\ContentBuilder\builder_osx)
  4. พิมพ์ bash ./steamcmd.sh
  5. SteamCmd จะทำงานและอัปเดตให้เป็นบิลด์ล่าสุด แล้วจะนำคุณไปอยู่ในพร้อมท์ SteamCmd
  6. พิมพ์ exit และกด return เพื่อออกจากพร้อมท์
You can then follow the rest of this documentation (substituting paths as appropriate) to create depot and app config files for uploading your content to Steam.

การสร้างไฟล์การกำหนดค่าบิลด์ SteamPipe

To upload files for your app with SteamPipe, you must create scripts which describe your build and each depot that will be included in it. The example scripts shown here are in the Tools\ContentBuilder\scripts folder in the Steamworks SDK.

เครื่องมือ SteamPipe GUI

If you're running on Windows and would prefer a GUI tool to help create these config files and upload your builds you can use the SteamPipeGUI which is available in the tools folder of the Steamworks SDK. Included in the zip are additional instructions to get you started.

If you choose to use the GUI tool then reading the following sections is still recommended to help you become more familiar with how the SteamPipe system works.

สคริปต์สำหรับบิลด์แบบง่าย


Let's start with the most basic build script possible. In our example we have a game (AppID 1000) that has one depot (DepotID 1001) and want to upload all files from a content folder and it's subfolders. We just need a single build script for that, take a look at "simple_app_build.vdf" included in the SDK :

"AppBuild" { "AppID" "1000" // your AppID "Desc" "This is a simple build script" // internal description for this build "ContentRoot" "..\content\" // root content folder, relative to location of this file "BuildOutput" "..\output\" // build output folder for build logs and build cache files "Depots" { "1001" // your DepotID { "FileMapping" { "LocalPath" "*" // all files from contentroot folder "DepotPath" "." // mapped into the root of the depot "recursive" "1" // include all subfolders } } } }

Adjust the AppID and DepotID for your game as needed. To kick off a build you need to run steamcmd and pass a couple of parameters :
tools\ContentBuilder\builder\steamcmd.exe +login +run_app_build ..\scripts\simple_app_build.vdf +quit

หมายเหตุ: Your first attempt at running a build may fail due to 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 ", and try again. After logging in with Steam Guard once, a sentry file is used to verify the login is genuine.

If you are using steamcmd from a machine or VM that gets re-imaged frequently, you should include the sentry and config file in your image so you won't be prompted for a Steam Guard every time. The sentry file is located in \ssfn, and the config file is located in \config\config.vdf.

The following steps occur during a SteamPipe build:
[olist]
[*] Steamcmd.exe จะอัปเดตเป็นเวอร์ชันล่าสุดด้วยตัวเอง
[*] Steamcmd.exe จะเข้าสู่ระบบเบื้องหลังของ Steam โดยใช้บัญชี Steam ของตัวบิลด์
[*] ตัวเริ่มบิลด์แอปจะได้รับการลงทะเบียนด้วย MDS (Master Depot Server) ซึ่งจะตรวจสอบให้มั่นใจว่าผู้ใช้มีระดับสิทธิ์อนุญาตที่ถูกต้องในการแก้ไขแอปนี้
[*] แต่ละดีโปที่รวมอยู่ในบิลด์แอปนั้น จะมีรายการไฟล์ที่สร้างขึ้นตามไฟล์ในโฟลเดอร์เนื้อหาและกฎการกรองตามที่กำหนดไว้ในไฟล์การกำหนดค่าบิลด์ดีโป
[*] Each file is scanned and divided into small chunks of about 1MB. หากเคยบิลด์ดีโปมาก่อนแล้ว การแบ่งชิ้นส่วนไฟล์นี้จะถูกเก็บไว้เป็นชิ้นส่วนที่ไม่ได้รับการเปลี่ยนแปลงมากที่สุดเท่าที่เป็นไปได้
[*] ชิ้นส่วนไฟล์ใหม่จะได้รับการบีบอัด เข้ารหัส และอัปโหลดไปยัง MDS
[*] มานิเฟสต์สุดท้ายจะได้รับการสร้างขึ้นมาให้แก่ดีโปเวอร์ชันนี้ โดยที่จะระบุแต่ละมานิเฟสต์ด้วยไอดีมานิเฟสต์แบบ 64 บิตที่ไม่ซ้ำกัน
[*] เมื่อดีโปทั้งหมดได้รับการประมวลผลแล้ว MDS จะสิ้นสุดการบิลด์แอปนี้ และจะกำหนดไอดีบิลด์ส่วนกลาง
[*] หลังจากที่สร้างบิลด์เสร็จแล้ว อาจมีไฟล์ *.csm และ *.csd อยู่ในโฟลเดอร์บิลด์เอาต์พุต ไฟล์เหล่านี้เป็นไฟล์ชั่วคราวและสามารถลบทิ้งได้ แต่ไฟล์เหล่านี้สามารถช่วยเร่งให้การบิลด์ครั้งถัดไปเร็วขึ้นได้[/olist]


Once the build is complete you can see it on your app builds page, in this case it would be https://partner.steamgames.com/apps/builds/1000. There you can set that build live for the default branch or any beta branch and users will be able to download this update with a couple of minutes.

สคริปต์สำหรับบิลด์ขั้นสูง


If your app has a lot of depots with complex file mapping rules, you can create a depot build script for each depot which will be referenced by the app build script. First let's take a look at available parameters in the app build script:

  • AppID - ไอดีแอปของเกมคุณ บัญชีพันธมิตร Steam ที่อัปโหลดจำเป็นต้องมีสิทธิ์ 'แก้ไขเมทาเดตาของแอป'
  • Desc - คำอธิบายจะแสดงให้คุณเห็นเฉพาะในหมวด 'บิลด์ของคุณ' ในแผงควบคุมผู้ดูแลแอป ซึ่งอาจเปลี่ยนได้ทุกเมื่อ หลังจากที่อัปโหลดบิลด์บนหน้า 'บิลด์ของคุณ'
  • ContentRoot - The root folder of your game files, can be an absolute path or relative to the build script file.
  • BuildOutput - ไดเรกทอรีนี้จะเป็นตำแหน่งที่ตั้งสำหรับรายการบันทึกบิลด์ มานิเฟสต์ดีโป กลุ่มแคช และเอาต์พุตระดับกลาง กรุณาใช้แผ่นดิสก์ที่แยกต่างหากกันสำหรับเอาต์พุตบิลด์ของคุณ เพื่อให้มีประสิทธิภาพสูงสุด วิธีนี้จะแยกปริมาณงาน IO ของดิสก์ เพื่อให้ดิสก์รากเนื้อหาของคุณจัดการกับคำร้องขอการอ่านข้อมูลและดิสก์เอาต์พุตของคุณจัดการกับคำร้องขอการเขียนข้อมูล
  • Preview - บิลด์ประเภทนี้จะส่งเอาต์พุตเฉพาะที่เป็นรายการบันทึกและมานิเฟสต์ไฟล์เข้าไปในโฟลเดอร์เอาต์พุตบิลด์ Building preview builds is a good way to iterate on your upload scripts and make sure your file mappings, filters and properties work as intended.
  • Local - กำหนดไปที่ตำแหน่ง htdocs สำหรับ เซิร์ฟเวอร์เนื้อหาภายในเครื่อง SteamPipe (LCS) ของคุณ บิลด์ LCS จะบรรจุเนื้อหาเข้าไปเฉพาะในเซิร์ฟเวอร์ HTTP ของคุณเองเท่านั้น และจะอนุญาตให้คุณทดสอบการติดตั้งเกมของคุณโดยใช้ไคลเอนต์ Steam ได้
  • SetLive - ชื่อแบรนช์เบต้าที่จะกำหนดให้ใช้งานจริงโดยอัตโนมัติหลังจากที่บิลด์ประสบผลสำเร็จ ไม่มีถ้าว่างเปล่า โปรดทราบว่า ไม่สามารถกำหนดให้แบรนช์ 'เริ่มต้น' ใช้งานจริงได้โดยอัตโนมัติ ซึ่งต้องดำเนินการผ่านแผงผู้ดูแลแอป
  • Depots - This section contains all file mappings, filters and file properties for each depot or references a separate script file for each depot

Example app build script "app_build_1000.vdf" is using all options:
"AppBuild" { "AppID" "1000" // Your AppID "Desc" "Your build description here" // internal description for this build "Preview" "1" // make this a preview build only, nothing is uploaded "Local" "..\..\ContentServer\htdocs" // put content on local content server instead of uploading to Steam "SetLive" "AlphaTest" // set this build live on a beta branch "ContentRoot" "..\content\" // content root folder relative to this script file "BuildOutput" "D:\build_output\" // put build cache and log files on different drive for better performance "Depots" { // file mapping instructions for each depot are in separate script files "1001" "depot_build_1001.vdf" "1002" "depot_build_1002.vdf" } }

This app build script references two depot build script files that specify all file mappings and file properties. The following instructions are available in a depot build script ( and also if the section is included directly into the app build script).

  • DepotID - The DepotID for this section
  • ContentRoot - Lets you optionally override the ContentRoot folder from the app build script on a per depot basis
  • FileMapping - This maps a single file or a set of files from the local content root into your depot. There can be multiple file mappings that add files to the depot. The LocalPath parameter is a relative path to the content root folder and may contain wildcards like '?' or '*'. It will also apply to matching files in subfolders if Recursive is enabled. The DepotPath parameter specifies where the selected files should appear in the depot (use just '.' for no special mapping)
  • FileExclusion - will excluded mapped files again and can also contain wildcards like '?' or '*'
  • InstallScript - will mark a file as install scripts and will sign the file during the build process. The Steam client knows to run them for any application which mounts this depot.
  • FileProperties - will mark a file with special flags:
    • userconfig - This file is modified by the user or game. It cannot be overridden by an update, and it won't trigger a verification error if it's different from the previous version of the file.
    • versionedconfig - Similar to userconfig, however if the file is updated in the depot, it will be overwritten locally when the user's game updates. Only update the file in the depot when there is a necessary format change or bug fix.

Example depot build script depot_build_1002.vdf showing use of all options:
"DepotBuild" { "DepotID" "1002" "ContentRoot" "C:\content\depot1002" // override ContentRoot from app build script "FileMapping" { // all source files and folders in ".\bin" will be mapped into folder ".\executables" in depot "LocalPath" "bin\*" "DepotPath" "executables\" "Recursive" "1" // include all subfolders } "FileMapping" { // override audio files in \\audio with German versions "LocalPath" "localization\german\audio\*" "DepotPath" "audio\" } "FileMapping" { // copy install script for german version into depot root folder "LocalPath" "localization\german\german_installscript.vdf" "DepotPath" "." } "FileExclusion" "bin\server.exe" // exclude this file "FileExclusion" "*.pdb" // exclude all .PDB files everywhere "FileExclusion" "bin\tools*" // exclude all files under bin\tools\ "InstallScript" "localization\german\german_installscript.vdf" "FileProperties" { "LocalPath" "bin\setup.cfg" "Attributes" "userconfig" // this file will be modified during runtime } }

หมายเหตุ: You can name these scripts what ever you want, but we use the names app_build_ and depot_build_ for consistency. If you know that you'll be building apps on this machine, it might be a good idea to create sub-directories in your scripts directory for each application, to help organize each application's build scripts.

Managing Updates

After your app releases to customers, your customers will be receiving the build marked as the Default build. When uploading a new build it's always a good idea to test it before shipping it to your customers, for more information on how to successfully do this see การทดสอบบน Steam.

Debugging Build Issues

If your build wasn't successful, you should look in your output directory for error information, not the console where the build script was run. Most error information can be found in the *.log files.
You can use these Steam client commands and client-side files to debug issues:
  • "app_status [appid]" - แสดงสถานะปัจจุบันของแอปที่อยู่บนไคลเอนต์นี้
  • "app_info_print [appid]" - แสดงการกำหนดค่า Steamworks ในปัจจุบันสำหรับเกมนี้ (ดีโป ตัวเลือกการเรียกเปิดใช้ ฯลฯ)
  • "app_config_print [appid]" - แสดงการกำหนดค่าของผู้ใช้ปัจจุบันสำหรับเกมนี้ (ภาษาที่ใช้งานอยู่ ไดเรกทอรีการติดตั้ง ฯลฯ)
  • file "logs\content_log.txt" - Lists all logged SteamPipe operations and errors.
  • file "steamapps\appmanifest_[appid].acf" - แสดงสถานะการติดตั้งปัจจุบันของแอปนี้ (KeyValues)

Building Efficient Depots for SteamPipe

The old Steam content system would patch updates on a file level, which meant that if a single byte in a file changed, the entire new file would be downloaded by all users. This was especially inefficient if the game used pack files, which are collections of game content files in a single big file. Pack files can easily exceed 1 GB, so updates often led to unnecessarily large downloads. A common way to avoid these large downloads was to add new pack files that overrode content of already shipped pack files. That worked for updates, but it hurt new users long-term, since they ended up downloading unused, already-patched content.

The new content system fixes this problem by splitting each file into roughly 1-MB chunks. Each chunk is then compressed and encrypted before being distributed by the Steam content system. If the game content has large redundant parts, these chunks are reused and the user only has to download each repeated chunk once. However, the real strength of this system is building efficient update patches. While the system is building a patch, the new content is scanned for already known chunks. If it finds them, it reuses them. This means if you change or inject a few bytes in a big file, the user only has to download the changes.

This works well in most cases, but there are still a few pitfalls that need to be avoided when designing the content layout of a game. You may not want to compress or encrypt your game data. This is already done for in-flight downloads and retail discs by the Steam content system. If you do it too, it can reduce the effectiveness of delta patching. Compression and encryption are only advised if each individual asset within a package file is separately compressed and/or encrypted. Otherwise, a change to one asset will always require downloading several other potentially unchanged assets.

If you package multiple assets in a single pack file, make sure that with each re-packaging, no unnecessary changes are made. One problematic practice is including the full name of the original source files on disk, because the names may change, depending on the build machine. Another bad pattern is including build time stamps for each file. If possible, always add new content to the end of your pack files and keep the order of existing files. Also, keep your pack file’s metadata (offset and sizes to individual assets) in one place and don’t intersperse it with the asset data. Use a binary difference tool like BeyondCompare to look at two builds of your pack files to make sure that hundreds of unwanted changes don’t show up.

If you follow these rules you will minimize patch sizes and only new content will need to be downloaded. Your customers will thank you for that and you will be able to increase the quality of your product by shipping more updates.

If you suspect that your game packaging is not interacting well with the SteamPipe update process, please contact your Valve representative and we can look into enabling advanced features to help with this.

Building Retail Install Discs

To build retail install disc for SteamPipe games, you must first setup a build project file.
In this example, the SKU file is called "sku_goldmaster.txt":
"sku" { "name" "Test Game Installer" "appid" "202930" "disk_size_mb" "640" "included_depots" { "1" "202931" "2" "202932" } }
Some tips to keep in mind:
  • สร้างโฟลเดอร์ใหม่สำหรับการเขียนดิสก์อิมเมจขายปลีกลงไป เช่น "D:\retail_disks" จะเพิ่มเฉพาะดีโปในส่วน included_depots เข้าไปเท่านั้น จะไม่มีส่วนที่ถูกละเว้นอีกต่อไป
  • คุณสามารถใช้ Steam.exe (ที่มีพารามิเตอร์คอมมานด์ไลน์ -dev และ -console) หรือ steamcmd.exe เพื่อสร้างอิมเมจตัวติดตั้งได้ โดยในทั้งสองกรณี กรุณาใช้คำสั่ง "build_installer"
  • เข้าสู่ระบบด้วยบัญชี Steam ที่เป็นเจ้าของเกมดังกล่าวและดีโปทั้งหมดที่คุณต้องการจะใส่ลงไปในดิสก์ขายปลีก มิฉะนั้น บัญชีดังกล่าวจะไม่จำเป็นจะต้องใช้สิทธิ์พิเศษ ทำให้ทุกคนสามารถสร้างดิสก์ตัวติดตั้งได้
  • หากคุณใช้ Steam.exe ให้หยุดการดาวน์โหลดอื่น ๆ ทั้งหมด
  • ไปยังหน้าคอนโซล แล้วเรียกใช้คำสั่ง build_installer:
    build_installer sku_goldmaster.txt "D:\retail_disks"
    บิลด์จะต้องใช้เวลาสักครู่เพราะว่าดีโปทั้งหมดจะต้องถูกดาวน์โหลดซ้ำในครั้งแรก
  • หากคุณจะสร้าง GM (โกลด์มาสเตอร์) โดยการใช้เซิร์ฟเวอร์เนื้อหาภายในเครื่อง ให้เรียกใช้:
    @localcontentserver "webserver"
    build_installer sku_goldmaster.txt "D:\retail_disks" local
    ส่วนที่เกิน หมายถึง 'Backup' เนื่องจากส่วนสำรองของทั้ง 'ดิสก์การติดตั้งประเภทขายปลีก' และเกมภายในเครื่องโดยทั่วไปแล้วจะเหมือนกัน
  • เมื่อคุณเห็น "Backup AppID..." แสดงว่าอิมเมจดิสก์การติดตั้งพร้อมใช้งานแล้ว คุณสามารถอ่านรายละเอียดเพิ่มเติมเกี่ยวกับบิลด์สำรองได้ใน logs\backup_log.txt
  • มีโฟลเดอร์ใหม่ (Disk_1, Disk_2, และต่อไป) in "D:\retail_disks" ซึ่งแต่ละโฟลเดอร์จะมีขนาดไม่เกิน 640 เมกะไบต์ ตามที่ได้ระบุไว้ด้วย "disk_size_mb" โฟลเดอร์ของดิสก์แต่ละโฟลเดอร์จะบรรจุไฟล์ "sku.sis" และ .csd และ .csm สำหรับแต่ละดีโป ดีโปที่มีขนาดใหญ่จะต้องใช้หลายดิสก์ เนื้อหาดิสก์การติดตั้งขายปลีกทั้งหมดจะถูกเข้ารหัสเสมอ (ซึ่งไม่เหมือนกับไฟล์สำรองเกมภายในเครื่อง) ให้คัดลอกไฟล์การติดตั้ง SDK GM (setup.exe, setup.ini ฯลฯ) ลงไปในโฟลเดอร์ของดิสก์แรกของคุณ และตัวติดตั้งสำหรับดิสก์ประเภทขายปลีกก็จะเสร็จสมบูรณ์
  • When creating a GM for macOS be sure to open the goldmaster/disk_assets/SteamRetailInstaller.dmg image on a Mac. จากนั้นให้หาแอปที่อยู่ในนั้นแล้วคัดลอกไปยังรากของสื่อของคุณ ขอแนะนำให้คุณเปลี่ยนชื่อของแอปการติดตั้ง ติดแบรนด์ของคุณให้กับไอคอน แล้วตกแต่งหน้าต่างให้แสดงเฉพาะตัวติดตั้งอย่างเดียว
  • When creating a multi-disc GM for macOS, be sure the volume name for each disc matches. เนื่องจากชื่อไดรฟ์ข้อมูลจะกลายเป็นส่วนหนึ่งของเส้นทางการเชื่อมต่อ และหากชื่อไม่ตรงกัน ตัวติดตั้งจะไม่สามารถหาดิสก์ถัดไปได้

คุณสามารถเลือกที่จะสร้างตัวติดตั้งประเภทขายปลีกจากแบรนช์เบต้าได้

The process above will create a retail installer based on the default branch. If you need to create an installer based on a beta branch, you must first create a beta branch named "baseline". Then use the following command to build from the baseline branch:
build_installer steamcmd ex: build_installer sku_goldmaster.txt "D:\retail_disks" baseline superSecret script ex: steamcmd.exe +login user_name password +build_installer "..\Build\GameDataSku.txt" c:\destination beta_key beta_password +exit

การติดตั้งเนื้อหาดาวน์โหลดจากตัวติดตั้งประเภทขายปลีก

In some circumstances, you may wish to create a retail installer that includes your DLC packages. In such cases, the process to create the installer requires only a few changes.
In "sku_goldmaster.txt", include the DLC AppIDs under the "included_depots" section. Once you have run the "build_installer" process, find the generated sku.sis file for the installer and open it with a text editor.
Add the DLC AppID in the "apps" section. For example, if I had a game with AppID 1000 and DLC AppID 1010, I would adjust the "apps" section as follows:
"apps" { "0" "1000" "1" "1010" }
This will ensure that Steam checks for ownership of the DLC and prompt the user for a key if the DLC is not owned by the account that they are logging into on Steam.

การสร้างตัวติดตั้งประเภทขายปลีกสำหรับหลายไอดีแอปบนดิสก์/แพ็กเกจตัวติดตั้งเดียว

To build a GM containing multiple Steam Pipe apps. Build each app installer one by one but point them all to the same output folder. Each build will merge itself with the already existing install image.

การปรับแต่งดิสก์การติดตั้งประเภทขายปลีก

See Customizing a gold master for more details on customizing your retail install disk.

Preloading Games before Release

By default, all content is always encrypted, on all retail discs and on all content servers. Switching a game to preload mode means owners can download the content, but it stays encrypted on the users' disk and can't be played. Once the game becomes officially released, Steam will decrypt the preloaded content and the user can play the game.

Switching a game to preload mode is recommended in these cases:
  • ในเวลาที่นำส่งดิสก์ประเภทขายปลีกพร้อมรหัสผลิตภัณฑ์ก่อนที่เกมจะพร้อมใช้งานจริง (ป้องกันการละเมิดลิขสิทธิ์ตั้งแต่วันที่ 0)
  • เกมเวอร์ชันสั่งซื้อล่วงหน้าและมีขนาดใหญ่กว่า 20 GB

Please submit a ticket to Steam Publishing if you believe your game requires preloading.

Building DLC

DLC is built as a depot of the base game. See the เนื้อหาดาวน์โหลด (DLC) documentation for more information.

Troubleshooting SteamPipe

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

Cause: Probably SteamGuard is preventing login. Resolution:
  • ตรวจสอบอีเมลที่เชื่อมโยงกับบัญชีที่คุณพยายามจะใช้เข้าสู่ระบบ แล้วมองหาอีเมลที่ส่งมาจากฝ่ายสนับสนุน Steam คัดลอกรหัสจากอีเมลฉบับนั้น
  • เรียกใช้ steamcmd ต่อไปนี้: set_steam_guard_code
    [*] Re-Attempt login from steamcmd: [code-inline]Steam>login
[/list]

การแก้ปัญหาทั่วไปเกี่ยวกับการดาวน์โหลด

  • รีสตาร์ทเครื่องคอมพิวเตอร์ โมเด็ม เราเตอร์ ฯลฯ
  • ตรวจสอบการตั้งค่าไฟร์วอลล์ ระบบใหม่นี้จะจำเป็นต้องใช้พอร์ต 80 (HTTP) และพอร์ต Steam อื่น ๆ ทั้งหมดตามที่ระบุไว้ ที่นี่
  • ปิดการใช้งานโปรแกรมต่อต้านไวรัสและโปรแกรมบล็อกสแปมเป็นการชั่วคราว
  • Check the Steam download region under Settings->Downloads. ภูมิภาคดาวน์โหลดควรจะต้องมีค่าตรงกับตำแหน่งที่ตั้งของคุณ
  • หยุดการดาวน์โหลด ถอนการติดตั้ง แล้วติดตั้งเกมใหม่อีกครั้ง (เป็นการล้างแคชของมานิเฟสต์)
  • ออกจาก Steam ลบสองโฟลเดอร์ ได้แก่ appcache และ depotcache ในโฟลเดอร์การติดตั้ง Steam ของคุณ
  • ลองตั้งค่าภูมิภาคดาวน์โหลด Steam ของคุณให้เป็นภูมิภาคอื่นที่อยู่ไกลออกไป อาจจะช่วยแก้ปัญหาได้ หากเซิร์ฟเวอร์เนื้อหาที่อยู่ใกล้กับคุณนั้นมีการส่งข้อมูลไม่ดี

บิลด์ของ Mac และ/หรือ Linux ของฉันไม่ยอมติดตั้งไฟล์ใด ๆ เลย เกิดอะไรขึ้น?

If you're testing via Steam the installation of your game or application across multiple platforms, you may run into a situation where the build deploys on Windows but doesn't deploy any files on Mac or Linux despite your SteamPipe process being setup to upload Mac and/or Linux depots. There is a step that is easily missed which involves adding your alternate Depots to the Package being deployed. You can check what depots are included in a package via the following steps:
  1. ไปที่หน้า ผู้ดูแลแอป
  2. From the View Associated Items section, click All Associated Packages, DLC, Demos and Tools.
  3. คลิกที่ชื่อของแพ็กเกจที่คุณต้องการจะดาวน์โหลด
  4. ตรวจสอบหมวด ดีโปที่บรรจุอยู่
  5. ใช้ เพิ่ม/ถอนดีโป เพื่อตรวจสอบให้มั่นใจว่าได้บรรจุดีโปชุดที่ถูกต้องไปยังแพ็กเกจแล้ว
There are a number of discussion threads about this that may also assist:

การเรียกใช้ steamcmd.exe ทำให้เกิดข้อผิดพลาดดังต่อไปนี้: "SteamUpdater: ข้อผิดพลาด: Steam จะต้องออนไลน์จึงจะอัปเดตได้ กรุณายืนยันการเชื่อมต่อของเครือข่ายของคุณ แล้วลองใหม่อีกครั้ง"

Resolution: Go to Internet Options->Connections->Lan Settings and check Automatically detect settings.

การเรียกใช้บิลด์แอปทำให้เกิดข้อผิดพลาดต่อไปนี้:: "ข้อผิดพลาด! 'DepotBuild for scriptname.vdf' ล้มเหลว - สถานะ = 6."

Possible Causes:
  • บัญชีไม่ได้มีสิทธิ์อนุญาตให้ใช้งานแอปนั้นได้
    • ตรวจสอบว่าไอดีแอปที่อยู่ใน app_build.vdf ถูกต้อง
    • ตรวจสอบว่าบัญชีบิลด์ดังกล่าวมี สิทธิ์ที่เหมาะสม ในการเข้าถึงไอดีแอปดังกล่าว
  • Steamcmd หาเนื้อหาดีโปไม่พบ
    • ตรวจสอบว่าค่า "contentroot" ที่อยู่ในสคริปต์ app_build มีเส้นทางที่ถูกต้องสัมพันธ์กับตำแหน่งของไฟล์สคริปต์
    • ตรวจสอบว่าค่า "LocalPath" ที่อยู่ในสคริปต์ depot_build มีเส้นทางที่ถูกต้องสัมพันธ์กับเส้นทางในสคริปต์ app_build ตรวจสอบว่าเส้นทางได้บรรจุเนื้อหาจริง ๆ

การเรียกใช้บิลด์แอปทำให้เกิดข้อผิดพลาดต่อไปนี้:: "ข้อผิดพลาด! ล้มเหลวในการรับข้อมูลแอปพลิเคชันสำหรับแอป NNNNN (ตรวจสอบการเข้าสู่ระบบและการสมัคร)"

This means that Steam can't retrieve information about the app, either because it doesn't exist or the user doesn't have access to the app.
  • ตรวจสอบว่า NNNNN เป็นไอดีแอปสำหรับแอปที่กำหนดไว้ให้กับคุณ
  • ตรวจสอบว่าไอดีแอปที่อยู่ใน app_build.vdf ถูกต้อง
  • หากเป็นไอดีแอปใหม่ ให้ตรวจสอบว่าได้เผยแพร่การกำหนดค่าผู้ดูแลแอปของ Steamworks แล้ว แอปใหม่ควรจะมีไดเรกทอรีการติดตั้ง SteamPipe อยู่ในแท็บการกำหนค่า มีดีโปอยู่ในแท็บดีโป และเผยแพร่การเปลี่ยนแปลงทั้งหมดในแท็บเผยแพร่
  • หากทุกอย่างดูเป็นปกติไม่มีปัญหา กรุณาตรวจสอบให้มั่นใจว่าบัญชีของคุณเป็นเจ้าของไอดีแอปดังกล่าว

"เกิดข้อผิดพลาดขณะติดตั้ง [AppName] (การกำหนดค่าเนื้อหาไม่ถูกต้อง)" ขณะเปิดใช้งาน

Possible Causes:
  • ไม่มีบิลด์ที่ถูกตั้งค่าเปิดใช้งานจริงอยู่ในแบรนช์ที่คุณพยายามจะใช้ติดตั้ง
    วิธีการแก้ปัญหา: ตั้งค่าบิลด์ของคุณให้เป็นเปิดใช้งานจริงในแบรนช์โดยการไปที่ https://partner.steamgames.com/apps/builds/ แล้วเลือกแบรนช์ในไคลเอนต์ Steam (ตามที่ได้อธิบายไว้ ที่นี่)
  • ตัวเลือกการเปิดใช้งานเกมไม่ถูกต้อง
    วิธีการแก้ปัญหา: ตรวจสอบตัวเลือกการเริ่มในแท็บการติดตั้งในส่วนผู้ดูแลแอปเกมของคุณ https://partner.steamgames.com/apps/config/
  • คุณไม่ได้เป็นเจ้าของไอดีดีโปสำหรับเกมดังกล่าว
    วิธีการแก้ปัญหา: ตรวจสอบให้มั่นใจว่าได้เพิ่มดีโปที่จำเป็นไปยังการสมัครสมัครเพื่อการพัฒนาแล้ว (กรุณาดู การแก้ไขแพ็กเกจ สำหรับรายละเอียดเพิ่มเติม)

"รหัสข้อผิดพลาด 15" ขณะเปิดใช้งาน

This is the CEG servers rejecting the request to CEG the exe. Check the release state on the game page. If it is not 'playable', you will need to request Steam keys that override the release state.

"เซิร์ฟเวอร์ Steam ไม่พร้อมที่จะจัดการคำร้องขอของคุณ... รหัสข้อผิดพลาด (2)" ขณะเปิดใช้งาน

This is the CEG servers failing to find a matching CEG exe. Double check that you have a working CEG executable on the CEG tab of your app admin. Click the 'status' button to make sure that it's propped.

ฉันจำไม่ได้ว่าคำสั่ง steamcmd คืออะไรหรือทำงานอย่างไร

Use the 'find' command in steamcmd to search for any steamcmd command. It will do partial matching on the command name and it will list out the command syntax.
Steam>find build_installer ConVars: Commands: build_installer :
[/code-inline]