大坡3D软件开发

关注3D软件技术

用户操作
[即时聊天] [发私信] [加为好友]
蔡军生ID:caimouse
1243929次访问,排名17好友253人,关注者423
C++,3D,VC++软件开发,写技术文章,操作系统开发
caimouse的文章
原创 604 篇
翻译 0 篇
转载 41 篇
评论 942 篇
蔡军生的公告

点击这里给我发消息

MSN: caimouse1976 at sina.com

最近评论
holon:不错,支持一下。

------------------------------
www.arraylist.cn cn域名免费送
IT人的酒吧式交流平台
-----------------------------
tunnel115:lz生日快乐啊
加油写,我是粉条
maray:这个做量的生意还是不错哈~
雇几个C++比较好的大学生做兼职,负责回答问题,哈哈~very nice~
xavierye:发现另外一个源码分析blog:
http://www.cnblogs.com/duguguiyu/archive/2008/10/02/1303095.html
shada:前面两个混帐,没资格评论开源。
用着盗版的Word写文章批评开源的人真不少。
文章分类
收藏
相册
3D引擎
第二人生
谷歌浏览器
开发板
历史回忆
常用连接
人生历程
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky

原创 第二人生的源码分析(四十六)获取纹理图片的线程收藏

新一篇: 第二人生的源码分析(四十七)发送下载纹理图片请求 | 旧一篇: 第二人生的源码分析(四十五)图像解压线程

纹理图片对于3D程序来说比较重要的数据,如果没有纹理图片,就没有亮丽的外表,就没有丰富多彩的世界。在第二人生里,纹理图片不是随着程序一起发布的,而是不断地从服务器上下载的,这点是不像其它游戏,把所有图片全部预先下载好。下面就来分析一下纹理下载线程的工作过程。
先从程序:
LLAppViewer::getTextureFetch()->createRequest(getID(),getTargetHost(), decode_priority, w, h, c, desired_discard, needsAux())
里调用createRequest函数来创建一个纹理图片下载。然后就在纹理下载线程里调用LLTextureFetch::update函数来更新这个请求,这时就启动纹理线程LLTextureFetch来获取纹理图片,而线程类LLTextureFetch是继承LLWorkerThread线程类的,因此这也是调用工作线程来运行。
 
如果从网络下载一个纹理图片,又是怎么执行的呢?先看下面的代码:
#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 }
 
上面的代码就是把这个纹理图片添加网络下载队列mNetworkQueue,然后再由网络层向服务器发送下载图片的请求。
 
#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 }
 
上面这段代码就是不断地把向网络请求下载纹理的ID向服务器发送,主要是通过函数sendRequestListToSimulators来实现的,这个函数的代码比较长,下次再分析它。

 

发表于 @ 2008年04月26日 22:55:32|评论(loading...)|编辑

新一篇: 第二人生的源码分析(四十七)发送下载纹理图片请求 | 旧一篇: 第二人生的源码分析(四十五)图像解压线程

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 蔡军生