mirror of
https://github.com/skywind3000/kcp.git
synced 2025-03-22 07:22:59 +08:00
【优化】1.优化buffer大小 2.优化interval 3. 增加wait_rcv api
This commit is contained in:
parent
bf616efb43
commit
d16b9e3802
26
ikcp.c
26
ikcp.c
@ -141,7 +141,6 @@ static inline long _itimediff(IUINT32 later, IUINT32 earlier)
|
|||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// manage segment
|
// manage segment
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
typedef struct IKCPSEG IKCPSEG;
|
|
||||||
|
|
||||||
static void* (*ikcp_malloc_hook)(size_t) = NULL;
|
static void* (*ikcp_malloc_hook)(size_t) = NULL;
|
||||||
static void (*ikcp_free_hook)(void *) = NULL;
|
static void (*ikcp_free_hook)(void *) = NULL;
|
||||||
@ -254,7 +253,7 @@ ikcpcb* ikcp_create(IUINT32 conv, void *user)
|
|||||||
kcp->mss = kcp->mtu - IKCP_OVERHEAD;
|
kcp->mss = kcp->mtu - IKCP_OVERHEAD;
|
||||||
kcp->stream = 0;
|
kcp->stream = 0;
|
||||||
|
|
||||||
kcp->buffer = (char*)ikcp_malloc((kcp->mtu + IKCP_OVERHEAD) * 3);
|
kcp->buffer = (char*)ikcp_malloc(kcp->mtu);
|
||||||
if (kcp->buffer == NULL) {
|
if (kcp->buffer == NULL) {
|
||||||
ikcp_free(kcp);
|
ikcp_free(kcp);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -1186,6 +1185,7 @@ IUINT32 ikcp_check(const ikcpcb *kcp, IUINT32 current)
|
|||||||
IINT32 tm_flush = 0x7fffffff;
|
IINT32 tm_flush = 0x7fffffff;
|
||||||
IINT32 tm_packet = 0x7fffffff;
|
IINT32 tm_packet = 0x7fffffff;
|
||||||
IUINT32 minimal = 0;
|
IUINT32 minimal = 0;
|
||||||
|
IUINT32 resent;
|
||||||
struct IQUEUEHEAD *p;
|
struct IQUEUEHEAD *p;
|
||||||
|
|
||||||
if (kcp->updated == 0) {
|
if (kcp->updated == 0) {
|
||||||
@ -1202,18 +1202,27 @@ IUINT32 ikcp_check(const ikcpcb *kcp, IUINT32 current)
|
|||||||
}
|
}
|
||||||
|
|
||||||
tm_flush = _itimediff(ts_flush, current);
|
tm_flush = _itimediff(ts_flush, current);
|
||||||
|
resent = (kcp->fastresend > 0)? (IUINT32)kcp->fastresend : 0xffffffff;
|
||||||
|
|
||||||
for (p = kcp->snd_buf.next; p != &kcp->snd_buf; p = p->next) {
|
for (p = kcp->snd_buf.next; p != &kcp->snd_buf; p = p->next) {
|
||||||
const IKCPSEG *seg = iqueue_entry(p, const IKCPSEG, node);
|
const IKCPSEG *segment = iqueue_entry(p, const IKCPSEG, node);
|
||||||
IINT32 diff = _itimediff(seg->resendts, current);
|
IINT32 diff = _itimediff(segment->resendts, current);
|
||||||
if (diff <= 0) {
|
if (diff <= 0) {
|
||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
else if (segment->fastack >= resent) {
|
||||||
|
if ((int)segment->xmit <= kcp->fastlimit ||
|
||||||
|
kcp->fastlimit <= 0) {
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (diff < tm_packet) tm_packet = diff;
|
if (diff < tm_packet) tm_packet = diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
minimal = (IUINT32)(tm_packet < tm_flush ? tm_packet : tm_flush);
|
minimal = (IUINT32)(tm_packet < tm_flush ? tm_packet : tm_flush);
|
||||||
if (minimal >= kcp->interval) minimal = kcp->interval;
|
IUINT32 interval = (kcp->probe != 0 || kcp->nsnd_que > 0 || kcp->nrcv_que > 0 || kcp->nrcv_buf > 0)
|
||||||
|
? kcp->interval : 5000;
|
||||||
|
if (minimal >= interval) minimal = interval;
|
||||||
|
|
||||||
return current + minimal;
|
return current + minimal;
|
||||||
}
|
}
|
||||||
@ -1225,7 +1234,8 @@ int ikcp_setmtu(ikcpcb *kcp, int mtu)
|
|||||||
char *buffer;
|
char *buffer;
|
||||||
if (mtu < 50 || mtu < (int)IKCP_OVERHEAD)
|
if (mtu < 50 || mtu < (int)IKCP_OVERHEAD)
|
||||||
return -1;
|
return -1;
|
||||||
buffer = (char*)ikcp_malloc((mtu + IKCP_OVERHEAD) * 3);
|
if(mtu == kcp->mtu) return 0;
|
||||||
|
buffer = (char*)ikcp_malloc(mtu);
|
||||||
if (buffer == NULL)
|
if (buffer == NULL)
|
||||||
return -2;
|
return -2;
|
||||||
kcp->mtu = mtu;
|
kcp->mtu = mtu;
|
||||||
@ -1287,6 +1297,10 @@ int ikcp_waitsnd(const ikcpcb *kcp)
|
|||||||
return kcp->nsnd_buf + kcp->nsnd_que;
|
return kcp->nsnd_buf + kcp->nsnd_que;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ikcp_waitrcv(const ikcpcb *kcp)
|
||||||
|
{
|
||||||
|
return kcp->nrcv_buf + kcp->nrcv_que;
|
||||||
|
}
|
||||||
|
|
||||||
// read conv
|
// read conv
|
||||||
IUINT32 ikcp_getconv(const void *ptr)
|
IUINT32 ikcp_getconv(const void *ptr)
|
||||||
|
5
ikcp.h
5
ikcp.h
@ -316,7 +316,7 @@ struct IKCPCB
|
|||||||
void (*writelog)(const char *log, struct IKCPCB *kcp, void *user);
|
void (*writelog)(const char *log, struct IKCPCB *kcp, void *user);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct IKCPSEG IKCPSEG;
|
||||||
typedef struct IKCPCB ikcpcb;
|
typedef struct IKCPCB ikcpcb;
|
||||||
|
|
||||||
#define IKCP_LOG_OUTPUT 1
|
#define IKCP_LOG_OUTPUT 1
|
||||||
@ -390,6 +390,9 @@ int ikcp_wndsize(ikcpcb *kcp, int sndwnd, int rcvwnd);
|
|||||||
// get how many packet is waiting to be sent
|
// get how many packet is waiting to be sent
|
||||||
int ikcp_waitsnd(const ikcpcb *kcp);
|
int ikcp_waitsnd(const ikcpcb *kcp);
|
||||||
|
|
||||||
|
// get how many packet is waiting to be receive
|
||||||
|
int ikcp_waitrcv(const ikcpcb *kcp);
|
||||||
|
|
||||||
// fastest: ikcp_nodelay(kcp, 1, 20, 2, 1)
|
// fastest: ikcp_nodelay(kcp, 1, 20, 2, 1)
|
||||||
// nodelay: 0:disable(default), 1:enable
|
// nodelay: 0:disable(default), 1:enable
|
||||||
// interval: internal update timer interval in millisec, default is 100ms
|
// interval: internal update timer interval in millisec, default is 100ms
|
||||||
|
Loading…
Reference in New Issue
Block a user