紋理圖片對于3D程序來說比較重要的數(shù)據(jù),如果沒有紋理圖片,就沒有亮麗的外表,就沒有豐富多彩的世界。在第二人生里,紋理圖片不是隨著程序一起發(fā)布的,而是不斷地從服務(wù)器上下載的,這點是不像其它游戲,把所有圖片全部預先下載好。下面就來分析一下紋理下載線程的工作過程。
先從程序:
LLAppViewer::getTextureFetch()->createRequest(getID(),getTargetHost(), decode_priority, w, h, c, desired_discard, needsAux())
里調(diào)用createRequest函數(shù)來創(chuàng)建一個紋理圖片下載。然后就在紋理下載線程里調(diào)用LLTextureFetch::update函數(shù)來更新這個請求,這時就啟動紋理線程LLTextureFetch來獲取紋理圖片,而線程類LLTextureFetch是繼承LLWorkerThread線程類的,因此這也是調(diào)用工作線程來運行。
?
如果從網(wǎng)絡(luò)下載一個紋理圖片,又是怎么執(zhí)行的呢?先看下面的代碼:
#001?void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker)
#002?{
#003?
???? if (mRequestMap.find(worker->mID) != mRequestMap.end())
#004?
???? {
#005?
??????????? // only add to the queue if in the request map
#006?
??????????? // i.e. a delete has not been requested
#007?
??????????? mNetworkQueue.insert(worker->mID);
#008?
???? }
#009?
???? for (cancel_queue_t::iterator iter1 = mCancelQueue.begin();
#010?
??????????? ?iter1 != mCancelQueue.end(); ++iter1)
#011?
???? {
#012?
??????????? iter1->second.erase(worker->mID);
#013?
???? }
#014?}
?
上面的代碼就是把這個紋理圖片添加網(wǎng)絡(luò)下載隊列mNetworkQueue,然后再由網(wǎng)絡(luò)層向服務(wù)器發(fā)送下載圖片的請求。
?
#001?S32 LLTextureFetch::update(U32 max_time_ms)
#002?{
#003?
???? S32 res;
#004?
???? res = LLWorkerThread::update(max_time_ms);
#005?
????
#006?
???? const F32 REQUEST_TIME = 1.f;
#007?
#008?
???? // Periodically, gather the list of textures that need data from the network
#009?
???? // And send the requests out to the simulators
#010?
???? if (mNetworkTimer.getElapsedTimeF32() >= REQUEST_TIME)
#011?
???? {
#012?
??????????? mNetworkTimer.reset();
#013?
??????????? sendRequestListToSimulators();
#014?
???? }
#015?
????
#016?
???? return res;
#017?}
?
上面這段代碼就是不斷地把向網(wǎng)絡(luò)請求下載紋理的ID向服務(wù)器發(fā)送,主要是通過函數(shù)sendRequestListToSimulators來實現(xiàn)的,這個函數(shù)的代碼比較長,下次再分析它。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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