您的位置:首页 > 其它

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

2008-04-29 22:11 691 查看
前面介绍了怎么样发送纹理下载请求到服务器,那么在第二人生里又是怎么样接收纹理图片的呢?接着就来讨论这个问题,它的代码如下:

这是一个静态成员函数,主要为了给网络消息系统回调使用的。
#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 }

通过上面的函数,就可以接收到发送回来的纹理图片头的数据,并保存到纹理下载线程里。这样就实现了接收图片文件头的数据,当然了除了头的数据,还有图片的数据,这将在下一次里再给你介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐