互联网的概念中会有 服务器端、客户端 两种对象。
游戏中有 单人游戏、局域网游戏、专用服务器 等情况,
下面列出各种情况中 谁扮演客户端、谁扮演服务器端
-
单人游戏:玩家即是客户端,也是服务器端
-
局域网游戏:所有玩家都是客户端,其中开房的玩家既是客户端也是服务器端
-
专用服务器:所有玩家都是客户端,而服务器端是一个专用开服程序。
不管是 单人、多人 游戏都会出现服务器端,所谓“服务端”是专门用来处理游戏主要元素;
而“客户端”接收服务端信息来同步、或向服务器发出一些请求;
游戏可以没有客户端,比如:纯粹开着一个专用服务器 没人进去。
客户端可自行处理一些内容,例如:HUD、特效 等局部效果没必要同步处理,
可以在客户端单独执行。
游戏中的任何物体都是对象,插件在地图中也是一个对象。
由于插件的所有权在服务器端,默认情况下 插件的代码只能在服务器端执行,
执行结果再“远程同步”到客户端上。
插件中关于所有权的属性有两个
Role:角色,默认设置为 ROLE_Authority
RemoteRole:远程角色,默认设置为 ROLE_None
默认情况下,插件的 RemoteRole=ROLE_None 表示客户端不执行。
如果想要插件在客户端可执行,请这样设置:
defaultattributes
{
Role=ROLE_Authority
RemoteRole=ROLE_SimulatedProxy
}
属性 Role 保持默认值即可,只需要修改 RemoteRole 远程角色为“可模拟代理”;
所谓“可模拟”就表示客户端可以进行执行,而非单纯的接收同步结果信息。
比如怪物的移动过程 是在服务器端执行,如果客户端不模拟而只接受同步结果 怪物行走将变得卡顿。
因为网络同步会有延迟,在延迟的空隙时间中 可在客户端模拟轨迹,从而提高流畅体验。
除了通过 RemoteRole 来配置远程所有权,还有一个相关性问题。
个人电脑的 CPU、宽带 都是有限的资源,游戏中的内容可能非常庞大;
如果地图中全部内容 都同时参与执行、网络同步,很容易导致 卡顿、掉帧等问题。
为了优化游戏体验,人们想出了一个相关性的概念,即:玩家看不到的内容 也就没必要参与执行。
不参与执行的内容 当然也不会进行客户端的网络同步。
实际上在客户端中 永远看不到插件对象,导致插件被排除在了“可执行范围内”。
所以需要一个属性 强制插件对象 不被客户端所忽视。
目前介绍了三个网络属性 其中 Role 用默认值,就变成了只用改两个属性;
以下写法将确保 插件在客户端的基本执行
RemoteRole = ROLE_SimulatedProxy
bAlwaysRelevant = true
bAddToServerPackages = true
这里多出了一个 bAddToServerPackages 翻译为“添加到服务器包中”;
实际表示 客户端在进入房间时 会下载当前插件类。
解释:插件类被打包进了 MOD包中,这里的服务器包一般指 房间的缓存文件。
目前只是介绍几个网络属性的概念,真正执行的代码是在函数中;
下一节将开始讨论 如何写网络同步相关的函数。