常见问题

Q1: 如何判断网络断开的原因?

主动断开: 客户端主动调用 disconnect 接口, 自己知道

被动断开: status=disconnect, last-error = 0

原因: 另一方主动断开, 立即知道

超时断开: status=disconnect, last-error = 501

原因: timeout1 参数时间内没有收到对方协议指令

空闲断开: status=disconnect, last-error = 502

原因: timeout2 参数时间内没有收到对方协议指令

Q2: 如何判断超时断开是哪一方网络原因?

status =disconnect, 错误代码=501

获得客户端自己的last-time (getInt (“last-time”, -2)), 该客户端最后收到服务器协议指令的时间(多少毫秒之前)

如果该时间在较短时间内(例如小于2000ms), 基本可以推断不是当前客户端的网络原因导致中断

Q3: 如何判断玩家是否恶意断开?

status=connected,可以认为网络正常(可以配合客户端 last-time判断)

如果玩家频繁在网络正常时退到后台(onPause), 可以识别为恶意退出(可以结合玩家比分)

Q4: 如何克服1对1联网时, 主机优势?

1对1 联网时, 有些竞争的资源将由其中一台机器来裁决(主机)

同样一个事件, 主机和客户端如果几乎同时发生, 由于网络延迟的原因, 看起来主机发生更早, 导致主机有 "主场优势"

可以用延迟来修正, 主机发生的竞争性事件, 加上当时的延迟时间 ( getInt ("latency")/2 ), 延迟发生

Q5: 客户端如何选择分区服务器?

自动选择分区服务器:

客户端自动测试与分区服务器之间的网络延迟, 选择延迟最低的作为分区服务器

指定分区服务器:

config (“server-id”, “分区服务器id”)

分区服务器可以通过 getString (“server-id”) 获得

Q6: 发送数据的频率与大小?

带宽/流量是实时对战的主要成本, 在确保游戏正常进行的情况下, 发送频率越低, 数据长度越小越有利

例如, 每秒发送30次以下(可以设法优化到10次/秒), 每次数据发送100字节以内

同个瞬间(2ms内)多次 send 会做合并优化, 减少数据包数量

每秒发送量越低越好(实际发送量最好在4K以内, 2K 更好), 传输越少, 网络越稳定, 并且除了带宽流量成本考虑, 还可以更容易集成 Nanolink 的回放与实时观战特性

Q7: 多人游戏时, 避免新玩家继续加入已经开始游戏的房间

config ("room-atime", "1")

服务器可以设置房间的入场时间和最大人数, 当没有达到入场时间和最大人数时, 玩家可以加入该房间。

有时游戏需要实现玩家点击 "开始" 按钮 开始游戏战斗, 不再允许新玩家进入, 可以通过: config ("room-atime", "1") 来关闭入场

建议 config ("room-atime", "1") 在客户端主机调用

Q8: 多人游戏时, 实现 "退出" / "解散", 所有玩家同同时结束游戏

config ("room-players", "0")

服务器可以设置最大战斗时间, 到时会自动解散, 或者房间长时间没有收到客户端的数据指令, 也会自动解散。

如果游戏已经完成, 可以直接调用 config ("room-players", "0") 通知所有人断开连接。

Q9: 获得房间已经开始多长时间

getInt ("uptime") 可以获得房间已经开始多少时间, 单位毫秒。

Q10: 获得房间的玩家数量

getInt ("players") 获得房间的玩家连接数量(有的玩家可能已经离开)。

getInt ("players", timeout) 获得在线玩家数量, 根据 timeout 参数判断在线还是离线。

例如: getInt ("players", 5000) 将获得 5000ms 内有发送数据指令的玩家数量, 可以用于作为在线玩家数量。

注意, getInt ("players", 5000) 这种方式是通过玩家的最后发送数据时间判断, 所以需要确保玩家在这个时间内有数据发送, 如果没有数据需要发送, 可以构造一个空指令。

Q11: 如何支持区域广播

Nanolink SDK 支持区域广播, 通过 send 配合 update 接口可以实现区域广播。

Q12: 一个房间支持多少玩家?

可以支持2-64人, 如果需要支持更多人请联系我们。

Nanolink 对2个人(1对1模式)进行特殊优化, 强烈建议 用 init (appKey, 2) 这种形式初始化。

人数超过2人, 用 init (appKey, 3) 这种形式初始化。

当人数在 12人内(最大不超过16人)的时候, 用全局广播方式。

大地图, 且人数超过16人以上时, 建议用区域广播方式, 节约流量。

Q13: Unity Windows版本运行 Demo 报错 DllNotFoundException: nanolink
// 类似报错
DllNotFoundException: nanolink
Nanolink.NanoClient.getString (System.String name) (at Assets/Plugins/Nanolink/NanoClient.cs:73)
Nanolink.NanoClient.getStatus () (at Assets/Plugins/Nanolink/NanoClient.cs:87)

解决:

在Unity编辑器检查 /Plugins/Nanolink/Windows 下 nanolink.dll 和 pthreadVC2.dll 两个文件的平台是否勾选,如图:

Windows 平台设置

服务价格

基本价格

流量: 1 RMB/G

并发: 1 RMB/天/100用户(超过100并发)

流量使用到一定阶段有相应折扣。初始用户并发用户费用可以免除。

折扣价格
价格 流量 赠送
1 RMB/G 1000G以内 100并发
0.8 RMB/G 1000G - 100000G 1000并发
0.75 RMB/G 100000G以上 1000并发