第二人生的源码分析(四十八)接收服务器回应的纹理图片头数据

前面介绍了怎么样发送纹理下载请求到服务器,那么在第二人生里又是怎么样接收纹理图片的呢?接着就来讨论这个问题,它的代码如下:
 
这是一个静态成员函数,主要为了给网络消息系统回调使用的。
#001 // static
#002 void LLViewerImageList::receiveImageHeader(LLMessageSystem *msg, void **user_data)
#003 {
#004       LLFastTimer t(LLFastTimer::FTM_PROCESS_IMAGES);
#005      
#006       // Receive image header, copy into image object and decompresses
#007       // if this is a one-packet image.
#008      
#009       LLUUID id;
#010      
#011       char ip_string[256];
 
把二进制的IP地址转换为字符串的方式。
#012       u32_to_ip_string(msg->getSenderIP(),ip_string);
#013      
 
查看这个消息是否压缩,如果压缩就有不同的数据大小。
#014       if (msg->getReceiveCompressedSize())
#015       {
#016              gImageList.sTextureBits += msg->getReceiveCompressedSize() * 8;
#017       }
#018       else
#019       {
#020              gImageList.sTextureBits += msg->getReceiveSize() * 8;
#021       }
#022       gImageList.sTexturePackets++;
#023      
#024       U8 codec;
#025       U16 packets;
#026       U32 totalbytes;
 
获取消息字段的信息。
#027       msg->getUUIDFast(_PREHASH_ImageID, _PREHASH_ID, id);
#028       msg->getU8Fast(_PREHASH_ImageID, _PREHASH_Codec, codec);
#029       msg->getU16Fast(_PREHASH_ImageID, _PREHASH_Packets, packets);
#030       msg->getU32Fast(_PREHASH_ImageID, _PREHASH_Size, totalbytes);
#031      
#032       S32 data_size = msg->getSizeFast(_PREHASH_ImageData, _PREHASH_Data);
#033       if (!data_size)
#034       {
#035              return;
#036       }
#037       if (data_size < 0)
#038       {
#039              // msg->getSizeFast() is probably trying to tell us there
#040              // was an error.
#041              llerrs << "image header chunk size was negative: "
#042              << data_size << llendl;
#043              return;
#044       }
#045      
 
获取传送回来的文件头数据。
#046       // this buffer gets saved off in the packet list
#047       U8 *data = new U8[data_size];
#048       msg->getBinaryDataFast(_PREHASH_ImageData, _PREHASH_Data, data, data_size);
#049      
 
查找图片管理列表里是否有请求下载这个纹理图片。
#050       LLViewerImage *image = gImageList.getImage(id);
#051       if (!image)
#052       {
#053              delete [] data;
#054              return;
#055       }
#056       image->mLastPacketTimer.reset();
 
这里调用函数receiveImageHeader来接收图片的文件头数据。
#057       bool res = LLAppViewer::getTextureFetch()->receiveImageHeader(msg->getSender(), id, codec, packets, totalbytes, data_size, data);
#058       if (!res)
#059       {
#060              delete[] data;
#061       }
#062 }
 
通过上面的函数,就可以接收到发送回来的纹理图片头的数据,并保存到纹理下载线程里。这样就实现了接收图片文件头的数据,当然了除了头的数据,还有图片的数据,这将在下一次里再给你介绍。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值