1
0
mirror of https://github.com/skywind3000/kcp.git synced 2025-04-28 16:10:14 +08:00

Created KCP Best Practice (markdown)

Linwei 2015-05-29 10:35:44 +08:00
parent 370b135d70
commit 76a541ccc3

43
KCP-Best-Practice.md Normal file

@ -0,0 +1,43 @@
# 最佳实践
#### 内存分配器
默认KCP协议使用 malloc/free进行内存分配释放如果应用层接管了内存分配可以
用ikcp_allocator来设置新的内存分配器注意要在一开始设置
> ikcp_allocator(my_new_malloc, my_new_free);
#### 前向纠错注意
为了进一步提高传输速度,下层协议也许会使用前向纠错技术。需要注意,前向纠错会根
据冗余信息解出原始数据包。相同的原始数据包不要两次input到KCP否则将会导致kcp
以为对方重发了这样会产生更多的ack占用额外带宽。
比如下层协议使用最简单的冗余包:单个数据包除了自己外,还会重复存储一次上一个数
据包,以及上上一个数据包的内容:
```cpp
Fn = (Pn, Pn-1, Pn-2)
P0 = (0, X, X)
P1 = (1, 0, X)
P2 = (2, 1, 0)
P3 = (3, 2, 1)
```
这样几个包发送出去接收方对于单个原始包都可能被解出3次来后面两个包任然会重
复该包内容那么这里需要记录一下一个下层数据包只会input给kcp一次避免过
多重复ack带来的浪费。
#### 管理大规模连接
如果需要同时管理大规模的 KCP连接比如大于3000个比如你正在实现一套类 epoll
的机制,那么为了避免每秒钟对每个连接调用大量的调用 ikcp_update我们可以使用
ikcp_check来大大减少 ikcp_update调用的次数。 ikcp_check返回值会告诉你需要
在什么时间点再次调用 ikcp_update如果中途没有 ikcp_send, ikcp_input的话
否则中途调用了 ikcp_send, ikcp_input的话需要在下一次interval时调用 update
标准顺序是每次调用了 ikcp_update后使用 ikcp_check决定下次什么时间点再次调用
ikcp_update而如果中途发生了 ikcp_send, ikcp_input的话在下一轮 interval
立马调用 ikcp_update和 ikcp_check。 使用该方法原来在处理2000个 kcp连接且每
个连接每10ms调用一次update改为 check机制后cpu从 60%降低到 15%。