[UE4]如何编译部署独立专用服务端(Standalone Dedicated Server)
这是论坛上对UE服务端功能的回答,意思是UE4提供了网游服务端所具备的特性,包括位移修正、物理碰撞检测。这些特性不是UE4才加入,早期UE版本就有了。
UE4自带的同步机制Reliable
这种自带的同步机制(也就是说常说的UFUNCTION(Server, Reliable, WithValidation))的网络通信数据量很大,有点类似moba类游戏的帧同步,适合开房间类型的多人联机游戏,但适不适合MMO类的大规模网络通信,我没测试过,也没看到官方的确切解释,可能看实际项目的同步需求,如果你的服务端不需要物理检测,那么承载肯定可以提升很多。
从v4.4版本开始数个版本,shipping模式关掉了网络同步,据说这只是一个bug,并不是epic有意为之。
如果是要写MMO等通信性能较高的服务端,建议将ACE、libuv、RakNet等高性能网络库加入UE4的C++工程,绕开UE4自身的tcp socket API。
===============================================
2016-11-20记:感谢网友“molixiaogemao”的回答,当前版本的UE4已经可以在shipping模式下打开replication同步机制。一年前的UE4版本确实是在shipping模式下关闭了replication。
===============================================
如何编译构建独立专用服务端
下面步骤假设是以development模式来构建,步骤和shipping模式没差异。
下面步骤中假设我们自己的UE4工程名叫:MyProject
1,下载源码及编译
https://github.com/EpicGames/UnrealEngine/tags
需要现在unrealengine官网上注册并加入github开发组才有权限看到上面的地址。
打开页面后下载一个最新的release版本,解压出来后先运行Setup.bat,会自动下载资源文件,大概有几个G,下载完以后,然后再运行GenerateProjectFiles.bat,会生成VS工程文件,这里假设你已经安装好了VS,我用的vs2015旗舰版,生成完以后打开VS,build类型选择debuggame editor或者development editor,并编译。
2,切换工程的UE4版本
右键点击你的UE4工程文件MyProject.uproject -》 Switch Unreal Engine version,选择刚刚编译出来的UE4,切换版本以后,再右击*.uproject并选择:Generate Visual Studio project files,最后启动VS,启动VS之后再选择一种build类型来编译工程并启动,这里测试用的是development editor类型。
3,cook client content
上面第二步编译并启动运行工程后,这一步来打包客户端(官方文档上叫cook client content),方法和正常客户端版本打包的步骤一样:
Package Project -》 Windows -》 Windows x64。

有人可能会问,安装版本的UE4为什么有没PS4、Xbox等打包选项?是的,只有源码编译的UE4才有这些选项。
这里我们假设打包时选择的输出目录为:D:/PackageTest/,那么输出的客户端exe文件就在D:/PackageTest/WindowsNoEditor/MyProject/Binariesk/Win64/MyProject.exe
这个目录位置会在后面步骤中用到。
如果不cook client content,则后面启动服务端时会报错:
Error: The global shader cache file 'F:/EpicGames/UnrealEngine/Engine/GlobalShaderCache-PCD3D_SM5.bin' is missing.
还有一个纯蓝图UE4工程的构建bug问题:
这个问题v4.7版本时还存在,当前最新版本不知道解决没有。
问题现象是:如果用VS构建之前不添加一个自定义的C++代码,那么构建出来的版本会有问题。
解决办法:在VS构建server版本之前,在UE4 Editor中添加一个C++代码,这个代码随意,只要是C++代码就行(比如添加一个自定义HUD的class),内容默认,不需要编辑。
添加C++方法是:File -》 Add Code to Project。
由于我这里演示的是C++工程,所以不需要添加再添加C++ class。
打包之前记得GameMode和Map是否设置正确了,如果不使用默认的话。

4,添加Server.target.cs配置文件
这一步是关键步骤。
从官网教学项目ShooterGame中拷贝一个文件:\Epic Games\Launcher\VaultCache\ShooterGame_‘版本号’\data\Source\ShooterGameServer.Target.cs
没有安装的话拷贝下面代码新建一个文本文件,并命名为MyProjectServer.Target.cs。位置放在\MyProject\Source\目录下(与其他Target.cs文件同一目录)。
// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved. using UnrealBuildTool;
using System.Collections.Generic; public class ShooterGameServerTarget : TargetRules
{
public ShooterGameServerTarget(TargetInfo Target)
{
Type = TargetType.Server;
bUsesSteam = true;
} //
// TargetRules interface.
// public override bool GetSupportedPlatforms(ref List<UnrealTargetPlatform> OutPlatforms)
{
// It is valid for only server platforms
return UnrealBuildTool.UnrealBuildTool.GetAllServerPlatforms(ref OutPlatforms, false);
} public override void SetupBinaries(
TargetInfo Target,
ref List<UEBuildBinaryConfiguration> OutBuildBinaryConfigurations,
ref List<string> OutExtraModuleNames
)
{
OutExtraModuleNames.Add("ShooterGame");
}
public override List<UnrealTargetPlatform> GUBP_GetPlatforms_MonolithicOnly(UnrealTargetPlatform HostPlatform)
{
List<UnrealTargetPlatform> Platforms = null; switch (HostPlatform)
{
case UnrealTargetPlatform.Linux:
Platforms = new List<UnrealTargetPlatform> { HostPlatform };
break; case UnrealTargetPlatform.Win64:
Platforms = new List<UnrealTargetPlatform> { HostPlatform, UnrealTargetPlatform.Linux };
break; default:
Platforms = new List<UnrealTargetPlatform>();
break;
} return Platforms;
} public override List<UnrealTargetConfiguration> GUBP_GetConfigs_MonolithicOnly(UnrealTargetPlatform HostPlatform, UnrealTargetPlatform Platform)
{
return new List<UnrealTargetConfiguration> { UnrealTargetConfiguration.Test };
}
public override List<GUBPFormalBuild> GUBP_GetConfigsForFormalBuilds_MonolithicOnly(UnrealTargetPlatform HostPlatform)
{
return new List<GUBPFormalBuild>();
}
}
在此基础上需要修改的地方三个地方:
1,类名修改MyProjectServerTarget ;
2,构造方法修改MyProjectServerTarget;
3,OutExtraModuleNames.Add("ShooterGame");修改为OutExtraModuleNames.Add("MyProject");
5,构建Server版本
首先,关掉VS,然后右击工程文件*.uproject-》Generate Visual Studio project files,之所以要重新生成VS工程文件,是因为要确保上一步添加的Target.cs文件能够在编译中生效。
打开VS后,选择build类型Development Server,然后构建。

构建之前,检查下Server端的Map和GameMode是否设置了,默认是空的,这样编出的服务端,客户端进来时是一片漆黑。。。(但是客户端确实登陆成功)

构建完毕以后,输出的server.exe文件位置在:/MyProject/Binaries/Win64/MyProjectServer.exe。
然后拷贝这个MyProjectServer.exe文件到上面第3步中提到的目录位置:D:/PackageTest/WindowsNoEditor/MyProject/Binariesk/Win64/目录下。
此时,该目录就会同时存在两个exe文件:MyProject.exe和MyProjectServer.exe。
如果MyProjectServer.exe不和MyProject.exe放在一起,则启动server时会报错(下面只是其众多错误信息中的一条):
default Property warning and errors:
Error: CDO Constructor (WidgetComponent): Failed to find /Engine/EngineMaterials/Widget3DPassThrough_Translucent
6,启动Server
到此为止,已经从构建UE4服务端这个深坑中爬出来了。。。
命令行启动:MyProjectServer.exe -log
执行后会看到弹出一个新的CMD窗口,并看到相关打印信息。
如果不带-log参数,则不会显示命令行窗口,只有一个后台进程。

7,client连接server
这一步很简单,启动客户端游戏后(双击打包生成的MyProject.exe或者从UE4 Editor中启动游戏均可),按~键,输入:open 127.0.0.1:7777,即可连接上服务端,7777是端口号。如果是shipping模式,是没有这种命令行的,连接服务端需要手动写相关的逻辑代码。
这样UFUNCTION(Server, Reliable, WithValidation)函数就可以与客户端独实现同步了。
注意的是:按~键打开游戏的命令行只对development和debug模式有效,shipping模式无效,另外shipping下也会关闭自带的同步机制(开头提到的)。
shipping模式下同步默认可以开启,具体参考 GitHub上pull request.
https://github.com/EpicGames/UnrealEngine/pull/2273
其他参考:
Client-Server Model
https://docs.unrealengine.com/latest/INT/Gameplay/Networking/Server/
官方文档v4.4.3:Dedicated Server Guide (Windows & Linux)(必读)
https://wiki.unrealengine.com/Dedicated_Server_Guide_(Windows_%26_Linux)
Networking and Multiplayer
https://docs.unrealengine.com/latest/INT/Gameplay/Networking/index.html
Build Standalone Dedicated Server - Unreal Engine 4.7.2(推荐)
https://www.youtube.com/watch?v=3j72KCPUdog
Unreal Engine 4 - Setting up a dedicated server on Windows x64 platform
https://www.youtube.com/watch?v=zSA8zUo8oCg
Unreal Engine 4 Dedicated Server Multiplayer Tutorial Unreal Engine Pt1 UE4
https://www.youtube.com/watch?v=BvurHyjI_sY
Unreal Engine 4 Dedicated Server Multiplayer Tutorial Unreal Engine Pt2 UE4
https://www.youtube.com/watch?v=c2Ao4esX4UY
11111111
[UE4]如何编译部署独立专用服务端(Standalone Dedicated Server)的更多相关文章
- 通过 DynamicLinq 简单实现 N-Tier 部署下的服务端数据库通用分页
通过 DynamicLinq 简单实现 N-Tier 部署下的服务端数据库通用分页 YbSoftwareFactory 的 YbRapidSolution for WinForm 插件使用CSLA.N ...
- [并发并行]_[线程模型]_[Pthread线程使用模型之三 客户端/服务端模型(Client/Server]
Pthread线程使用模型之三 客户端/服务端模型(Client/Server) 场景 1.在客户端/服务端模型时,客户端向服务端请求一些数据集的操作. 服务端执行执行操作独立的(多进程或跨网络)– ...
- centos6.5安装部署zabbix监控服务端和客户端
部署zabbix服务端需要LNMP环境(nginx,mysql,php),其它数据库也可以,我这里使用mysql,关于LNMP环境部署,可以参考我的另一遍文章:http://www.cnblogs.c ...
- docker下编译mangoszero WOW60级服务端(二)
开始搭建基于docker的mangoszero WOW服务端,我自己的操作系统是mac os,其他平台操作可以等价替换 1.准备工作 (1) 安装docker,参考docker官方文档,https:/ ...
- docker下编译mangoszero WOW60级服务端(一)
这几天看到暴雪准备开放怀旧服的新闻,突然想到几年前用大芒果window一键服务端自己搭建过服务,就想着在Linux环境下重新编译一套,毕竟Linux作为服务端,性能和稳定性都会高一些,于是在mac虚拟 ...
- docker下编译mangoszero WOW60级服务端(三)
开始构建WOW服务端通用镜像 第二篇文章中准备工作环节已经从github拉取了mangosd源代码,这里我们就可以直接开始编写dockerfile并进行编译 (1) 进入mangos/wow60/ma ...
- docker-compose 快速部署Prometheus之服务端并监控ceph cluster 使用钉钉webhook 报警
现在环境是这样: ceph 4台: 192.168.100.21 ceph-node1 192.168.100.22 ceph-node2 192.168.100.23 ceph-node3 1 ...
- zabbix 服务端安装(server)
zabbix版本:Zabbix 2.2 LTS 备注:Linux下安装zabbix需要有LAMP或者LNMP运行环境 准备篇: 一.Web环境:Nginx+MySQL+PHP CentOS 7.0编译 ...
- CentOS6.5下安装远程桌面服务端软件VNC Server
VNC 使您能够远程訪问和控制您的计算机从还有一计算机或移动设备上,不管你在世界的不论什么地方. 常见的使用情形,包含给同事和朋友提供桌面支持.远程管理您的服务器. 将 VNC Server部署到您想 ...
随机推荐
- LinkedList(实现了queue,deque接口,List接口)实现栈和队列的功能
LinkedList是用双向链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢. 底层是一个双向链表,链表擅长插入和删除操作,队列和栈最常用的2种操作都设计到插入和删除 impo ...
- UWA 转载
性能优化,进无止境-内存篇 https://blog.uwa4d.com/archives/optimzation_memory_1.html https://blog.uwa4d.com/archi ...
- Linux服务器定位CPU高占用率代码位置经历
http://blog.csdn.net/zhu19774279/article/details/51303000
- 利用 groupby apply list 分组合并字符
利用 groupby apply list 分组合并字符 因为需要对数据进行分组和合并字符,找到了以下方法. 有点类似 SQL 的 Group BY. import pandas as pd impo ...
- 20165308 学习基础和C语言基础调查
学习基础和C语言基础调查 技能学习 我认为给学生具体的, 能实践的, 能马上看到因果关系的教材和练习, 是激发学生兴趣, 好奇心, 求知欲的好方法. -- 引用自<做中学> 老师博客中注重 ...
- MongoDB之 的Rollback讲解及避免
首先,rollback到底是什么意思呢?在关系型数据库中因为有事务的概念,操作数据后在没有commit之前是可以执行rollback命令进行数据回退的. 而在单实例mongodb中,写入就写入了,删除 ...
- zookeeper 相关
zookeeper是什么: zk 是 一个注册机,提供分布式锁. zookerper可以做什么: 利用上面这两个特性.zookeeper 可以 为分布式提供 集群 的 一些管理 比如 高可用,名字服务 ...
- 五、springboot(二)配置数据源oracle
1.添加依赖 <!-- jpa --> <dependency> <groupId>org.springframework.boot</groupId> ...
- dojo:如何用MultiSelect实现类似ListBox风格的FromTo功能
欲实现的功能如下图: 主要要解决的问题包括两个方面: 一个是MultiSelet初始化的工作,一个是FromTo功能按钮的实现.这主要是因为MultiSelect控件是存储无关的,并不像Select或 ...
- kafka重复数据问题排查记录
问题 向kafka写数据,然后读kafka数据,生产的数据量和消费的数据量对不上. 开始怀疑人生,以前奠定的基础受到挑战... 原来的测试为什么没有覆盖生产量和消费量的对比? 消费者写的有问题?反复检 ...