游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8471|回复: 25

Recv函数执行时间过长,请问大家如何解决?

[复制链接]

64

主题

856

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2004-9-27 11:18:00 | 显示全部楼层 |阅读模式
我测试了一下Recv函数的执行时间,大约要消耗有140毫秒以上的时间。导致游戏画面产生停顿感,我的代码如下:
if (SOCKET_ERROR == WSAAsyncSelect(
_socket,
_hwnd,
NETCLIENT_EVENT_MSG,
FD_CONNECT | FD_CLOSE | FD_READ))
{
...
}

...

recv(_socket, buffer,1, 0);//测试耗时100多毫秒
....

请问大家如何解决呢? [em7]

64

主题

856

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2004-9-27 11:30:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

补充:以上代码是用在客户端接收数据用的

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2004-9-27 11:31:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

难道非要等收到数据再画图吗?

另外,我不太明白“导致游戏画面产生停顿”的描述

你是指像有些网游走路一跳一跳的吗?如果是这样需要采用同步处理办法

64

主题

856

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2004-9-27 11:34:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

我是这样的结构处理没一帧画面

1。接收、处理网络数据
2。绘图
3。返回1。

因为1耗时过长,所以每帧的时间消耗增加,所以FPS会降低

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2004-9-27 11:38:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

在不同的线程处理不同的事情就好了

64

主题

856

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2004-9-27 11:56:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

但是recv函数只是一个从本地到本地的数据拷贝过程,应该是不需要这么多的开销的啊。

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-9-27 12:56:00 | 显示全部楼层

奇怪,不太可能吧。

rt

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2004-9-27 13:04:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

没什么有时候是很长的,我也分析过了

64

主题

856

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
 楼主| 发表于 2004-9-27 13:26:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

我的关键代码:
wVersionRequested = MAKEWORD ( 2, 2 );
err = WSAStartup ( wVersionRequested, &wsaData );
...
_socket = socket(AF_INET, SOCK_STREAM, 0);
sockAddr.sin_family=AF_INET;
sockAddr.sin_addr.s_addr= inet_addr(server);
sockAddr.sin_port= htons( port );

if (SOCKET_ERROR == WSAAsyncSelect(
_socket,_hwnd,NETCLIENT_EVENT_MSG,
FD_CONNECT | FD_CLOSE | FD_READ))
{
  closesocket( _socket );
  _socket = INVALID_SOCKET;
  return false;
}

.....

result = connect(_socket, (const struct sockaddr FAR*)&sockAddr, sizeof (sockAddr));
if (result == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK )
{
  closesocket( _socket );
  _socket = INVALID_SOCKET;
  return false;
}

....

消息处理:
switch( WSAGETSELECTEVENT(lParam) )
{
  case FD_READ:
  {
     WSAAsyncSelect(_socket, _hwnd, NETCLIENT_EVENT_MSG, 0);
     int iMode = 0;
     ioctlsocket(_socket, FIONBIO, (u_long FAR*) &iMode);
                               
     char datatype = 0;
     if (!socket_recv(&datatype, 1, wParam, lParam))
        return true;
     switch(datatype)
     {
         case NETSHORTMSG:
        {
             char datalen = 0;
             if (!socket_recv(&datalen, 1, wParam, lParam))//测试消耗140多毫秒
              return true;
........

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-9-27 13:29:00 | 显示全部楼层

Re:Recv函数执行时间过长,请问大家如何解决?

     WSAAsyncSelect(_socket, _hwnd, NETCLIENT_EVENT_MSG, 0);
     int iMode = 0;
     ioctlsocket(_socket, FIONBIO, (u_long FAR*) &iMode);

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-18 20:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表