Source engine 是由 Valve 开发的一款3D游戏引擎。Source engine 以其在物理、AI 和图形方面的进步而闻名,这使得游戏在当时看起来非常真实,同时还能在较旧、性能较弱的硬件上良好运行。Source engine 的服务器是托管的游戏服务,允许玩家连接并在服务器的世界中一起游玩。Source engine 中的服务器可以通过mod进行自定义,从而为所有连接到服务器的玩家带来独特且往往充满乐趣的游戏体验。
基于 Source engine 运行的游戏包括 Team Fortress 2、Counter-Strike: Source、Garry's Mod 以及许多其他游戏!
一个常见的问题是运行 Source engine 服务器需要什么样的硬件和网络要求,以及它与其他游戏(例如 Minecraft 和 Rust)的服务器相比如何。这个问题的答案是,要看情况。
虽然 Source engine 服务器在 RAM 使用上比 Minecraft 和 Rust 等其他游戏轻很多,但它们大多数是单线程的。这意味着对于 Source engine 服务器来说,一个核心数较少但单线程性能较高的处理器,会比一个核心数多但单线程性能较低的处理器表现更好。如果你打算运行高强度的游戏模式或希望有大量玩家同时连接到服务器,这一点尤为重要。
话虽如此,以下是在决定硬件和网络要求时需要考虑的一些额外因素。
如果你想要绝对最佳的性能并且有足够的预算,我个人建议寻找一台配备了在类似Passmark单线程性能评测榜单中排名靠前的CPU的服务器。
同时在线玩家数
同时连接到服务器的玩家越多,每个客户端之间交换的网络数据就越多,通常游戏和服务器本身的运算量也会增加,从而导致更高的CPU占用。
虽然由于存在太多其他变量,没有关于单线程速度与玩家数量之间的通用准则或经验法则,但如果你打算让大量玩家同时连接到服务器,你应该尽量选购单线程性能更高的较新CPU。
游戏模式、Mod数量及地图类型
这些是在决定所需服务器要求时非常重要的因素。例如,一台运行像 Counter-Strike: Source 中死斗(Deathmatch)这种玩家不断互相射击、复活并四处奔跑的游戏模式的服务器,很可能比运行玩家死亡后要等到下一回合才能复活的游戏模式的服务器消耗更多资源。
话虽如此,近身战地图或大量使用物理道具的地图,很可能比更大、更开放的地图消耗更多的CPU性能。
服务器的Tickrate
tickrate是服务器模拟游戏的频率。默认情况下,服务器的tickrate设置为66.66...(每15ms一次)。如果游戏或mod允许服务器管理员更改该值,则可以在服务器启动命令中使用-tickrate命令行参数来更改此值。
服务器的tickrate越高,所需的CPU性能和带宽也越多。这也会导致服务器与客户端之间发送和接收更多的更新,从而改善客户端延迟、命中判定等方面!
Garry's Mod 中有许多服务器可以容纳多达128名玩家同时连接。它们能做到这一点,是因为它们运行较低的tickrate值,例如33或22,这在大多数情况下(当然取决于具体服务器)足够低,使CPU能够处理一般的服务器负载。
服务器的性能相关ConVar值
有一些与服务器性能相关的ConVar,你可以在服务器上修改这些值,从而影响服务器消耗的CPU和带宽。话虽如此,这些设置也会影响客户端的延迟、丢包数量、卡顿(choke)等。
以下是我发现的一些最有益的性能相关ConVar列表。
sv_maxrate- 服务器上允许客户端每秒使用的最大带宽速率(包括上传和下载),单位为“字节”。将此值设置为0表示无限制,如果你的网络和硬件条件允许,推荐这样设置。sv_minrate- 服务器上允许客户端每秒使用的最小带宽速率(包括上传和下载),单位为“字节”。sv_maxupdaterate- 服务器每秒能发送给客户端的更新数据包的最大数量。这个值通常等于你服务器的 tickrate 值。但在某些情况下,可以适当降低以减少 CPU 负载或降低带宽使用。sv_minupdaterate- 服务器每秒能发送给客户端的更新数据包的最小数量。通常范围在0到服务器 tickrate 值的一半之间(例如33)。sv_maxcmdrate- 服务器每秒能发送给客户端的命令数据包的最大数量。这个值通常等于你服务器的 tickrate 值。但在某些情况下,可以适当降低以减少 CPU 负载或降低带宽使用。sv_mincmdrate- 服务器每秒能发送给客户端的命令数据包的最小数量。通常范围在0到服务器 tickrate 值的一半之间(例如33)。net_splitpacket_maxrate- 服务器每秒能发送给客户端的分包(split packets)的最大字节数。将此值设置得更高,例如128000,可以在大量网络数据同时传输导致 choke(阻塞)的情况下有所帮助。net_maxcleartime- 服务器在单个tick中处理和发送网络数据所花费的最大时间(以秒为单位)。将此值设置得较低,例如0.001,可以在某些情况下减少 choke(阻塞),但会需要更多的 CPU 性能。sv_parallel_sendsnapshot- 当设置为1时,将允许服务器使用独立的线程来为每个客户端准备游戏状态快照(snapshot)。这可以在高玩家数量的环境下大幅提升服务器性能。
我建议阅读 Source Multiplayer Networking 以更好地理解这些数值应该如何设置。我还发现来自 NFOservers.com 的这个主题非常有帮助,信息量很大!
如果你使用的是专用主机托管服务商(dedicated hosting provider),你很可能有足够的网络容量将这些 ConVar 值设置为较高的数值/无限制。在这种情况下,以下数值在大多数情况下应该都能正常工作。
sv_maxrate 0
sv_minrate 75000
sv_maxupdaterate 66
sv_minupdaterate 20
sv_maxcmdrate 66
sv_mincmdrate 20
net_splitpacket_maxrate 128000
net_maxcleartime 0.001
sv_parallel_sendsnapshot 1
如果你仍然不确定应该将这些性能相关的 ConVar 设置为什么数值,我建议使用类似这个的工具来计算数值。此外,建议你使用像 SpeedTest.net 或 CloudFlare 这样的工具进行网速测试,以获取你服务器的上传和下载网速。这些网速在决定你的服务器能同时容纳多少玩家而不出现网络相关问题(例如丢包等)方面起着重要作用(尤其是你的上传速度,因为这决定了你能同时向所有玩家在互联网上发送的带宽量)。
监控服务器性能
在 Source 引擎游戏中,用于监控服务器性能的最佳游戏内工具是内置的 Net Graph。你可以通过在开发者控制台中将 net_graph 的值从 0 调整到 4 来显示 net graph。
这个工具会显示你与所连接服务器之间发送和接收的带宽量、服务器的 FPS、你和服务器之间发送/接收的更新数量,以及更多信息!
关于 Net Graph 更深入的说明可以在这里找到。
以下是来自前面链接的 Wiki 页面的一些信息:
![]()
Area 1
此区域是图中 payload(负载)部分所使用颜色的图例。如果一部分 payload 到达但不符合任何预定的分类桶,则会以最后一种颜色和代表完整数据包大小的小白点之间的空白区域来表示(见图中的指示符 a)
Area 2
对于超过 300 字节且处于第 95 百分位的数据包,数据包的大小会以文本形式显示在 payload 区域的顶部(见标记 2)。请注意,Orange Box 技术对数据包使用了压缩,但
net_graphpayload 中报告的大小是基于解压后的 payload 大小。
Area 3
本地连接的每秒帧数(FPS)以及到服务器的往返 ping 值显示在区域 3 中。
Area 4
此区域显示当前的带宽使用情况。in/out 显示最后一个进站和出站数据包的字节大小。k/s 显示最近在每个方向上看到的每秒千字节数(滚动平均值)。
Area 5
此区域显示客户端所连接服务器的性能。
sv标签显示的是截至最新一次传送给客户端的网络更新时服务器的 FPS。var显示的是服务器在最近记录的 50 帧中,帧时间(frametime)的标准差(其中server fps = 1.0 / frametime)。如果服务器的帧率低于 20 fps,此行会以黄色绘制。如果服务器的帧率低于 10 fps,此行会以红色绘制。
Area 6
lerp指示器显示的是客户端所使用的插值(interpolation)毫秒数。关于 lerp 数值的一些说明如下。
Area 7
此区域显示用户当前的
cl_updaterate设置、实际从服务器接收到的每秒更新数、实际发送到服务器的每秒数据包数,以及用户的cl_cmdrate设置(即用户希望发送到服务器的每秒数据包数)。
Area 8
当
net_graphshowlatency为 1 时,此区域会显示连接延迟的历史视图。高度(由标记 d 表示)对应net_graphmsecs的时间(实际上在顶部net_graphmsecs之后会留出一些余量以容纳文本字段)。红色竖线表示从服务器到客户端丢失的数据包。如果图表显示黄色标记(例如标记 c 处),表示服务器在向客户端发送更新之前必须阻塞一个或多个数据包。
Area 9
当
net_graphshowinterp为 1 时,此区域会显示每个客户端帧所需的插值量。如果数据包之间存在较大间隔(丢包、服务器帧率过低等),客户端将没有足够的数据用于插值,并会开始使用外插。外插会以橙色条形显示在白线上方(在标记 9 左侧可以看到一段外插)。此外,最底部的像素表示该渲染帧上是否发送了CUserCmd(usercmd)数据包,或是由客户端保留并根据用户的cl_cmdrate设置进行聚合。
专用主机 VS 局域网服务器
虽然你可以在自己家庭网络(局域网)上托管一个公共服务器,但这不推荐。相反,你应该从专用主机提供商处购买一台服务器。
虽然专用主机通常伴随的订阅费常被视为一个很大的缺点,但使用专用主机的理由包括:
- 由于更高的网络容量以及专门设计用于应对攻击的缓解系统,能更好地防御 (D)DoS 攻击。
- 更好的客户端路由和延迟。
- 更稳定(例如,如果家里发生断电,服务器不会因此下线)。
另外,以下是几个不建议在家中托管服务器的理由。
- 一些 ISP 反对在家庭网络上托管公共游戏服务器。
- 根据运行的服务器数量、服务器负载、服务器处理器等因素,家庭电费和网络带宽成本会更高。
另请参阅
https://moddingcommunity.com/blog/how-to-download-run-steamcmd/
结语
本篇指南/知识库主题到此结束。现在,你应该对运行 Source 引擎服务器所需的硬件和网络有了更好的理解。
如果你对本指南有任何疑问或反馈,请在其论坛主题这里回复!本指南会随着时间不断完善和改进。
加入我们的 Discord 服务器!

