前面介紹了怎么樣發(fā)送紋理下載請求到服務(wù)器,那么在第二人生里又是怎么樣接收紋理圖片的呢?接著就來討論這個(gè)問題,它的代碼如下:
?
這是一個(gè)靜態(tài)成員函數(shù),主要為了給網(wǎng)絡(luò)消息系統(tǒng)回調(diào)使用的。
#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];
?
把二進(jìn)制的IP地址轉(zhuǎn)換為字符串的方式。
#012?
???? u32_to_ip_string(msg->getSenderIP(),ip_string);
#013?
????
?
查看這個(gè)消息是否壓縮,如果壓縮就有不同的數(shù)據(jù)大小。
#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?
????
?
獲取傳送回來的文件頭數(shù)據(jù)。
#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?
????
?
查找圖片管理列表里是否有請求下載這個(gè)紋理圖片。
#050?
???? LLViewerImage *image = gImageList.getImage(id);
#051?
???? if (!image)
#052?
???? {
#053?
??????????? delete [] data;
#054?
??????????? return;
#055?
???? }
#056?
???? image->mLastPacketTimer.reset();
?
這里調(diào)用函數(shù)receiveImageHeader來接收圖片的文件頭數(shù)據(jù)。
#057?
???? bool res = LLAppViewer::getTextureFetch()->receiveImageHeader(msg->getSender(), id, codec, packets, totalbytes, data_size, data);
#058?
???? if (!res)
#059?
???? {
#060?
??????????? delete[] data;
#061?
???? }
#062?}
?
通過上面的函數(shù),就可以接收到發(fā)送回來的紋理圖片頭的數(shù)據(jù),并保存到紋理下載線程里。這樣就實(shí)現(xiàn)了接收圖片文件頭的數(shù)據(jù),當(dāng)然了除了頭的數(shù)據(jù),還有圖片的數(shù)據(jù),這將在下一次里再給你介紹。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
