大坡3D软件开发

关注3D软件技术

用户操作
[即时聊天] [发私信] [加为好友]
蔡军生ID:caimouse
1243514次访问,排名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

原创 第二人生的源码分析(四十五)图像解压线程收藏

新一篇: 第二人生的源码分析(四十六)获取纹理图片的线程 | 旧一篇: 第二人生的源码分析(四十四)虚拟文件系统的请求处理

前面介绍虚拟文件系统的线程,其实它是单一个线程来处理所有消息的,还有类LLLFSThread也是一样。在第二人生显示的软件里,图片是占了绝大部份数据,那么从服务器上下载的数据,都是压缩的图片,这样的图片大小就比较小一些,对于网络通讯就需要不太多带宽了,看到程序显示速度明显加快。下面就来分析一下这个线程到怎么样工作的?
LLAppViewer::sImageDecodeThread = new LLWorkerThread("ImageDecode", enable_threads && true);
上面这行代码就是创建图像解码工作线程的。
 
LLImageWorker::initClass(LLAppViewer::getImageDecodeThread());
这行代码就设置图像解码工作由工作线程sImageDecodeThread来实现,由于getImageDecodeThread函数返回的线程,就是上面的sImageDecodeThread成员。
 
从创建线程里也看到是类LLWorkerThread的对象,类LLWorkerThread是继承线程类LLQueuedThread的。LLImageWorker类可以不断把需要做的工作,放到线程sImageDecodeThread里去做,这样就实现了图像解码。
 
#001 class LLImageWorker : public LLWorkerClass
#002 {
#003 public:
#004      static void initClass(LLWorkerThread* workerthread);
#005      static void cleanupClass();
#006      static LLWorkerThread* getWorkerThread() { return sWorkerThread; }
#007 
#008      // LLWorkerThread
#009 public:
#010      LLImageWorker(LLImageFormatted* image, U32 priority, S32 discard,
#011                             LLPointer<LLResponder> responder);
#012      ~LLImageWorker();
#013 
#014      // called from WORKER THREAD, returns TRUE if done
#015      /*virtual*/ bool doWork(S32 param);
#016     
#017      BOOL requestDecodedData(LLPointer<LLImageRaw>& raw, S32 discard = -1);
#018      BOOL requestDecodedAuxData(LLPointer<LLImageRaw>& raw, S32 channel, S32 discard = -1);
#019      void releaseDecodedData();
#020      void cancelDecode();
#021 
#022 private:
#023      // called from MAIN THREAD
#024      /*virtual*/ void startWork(S32 param); // called from addWork()
#025      /*virtual*/ void endWork(S32 param, bool aborted); // called from doWork()
#026 
#027 protected:
#028      LLPointer<LLImageFormatted> mFormattedImage;
#029      LLPointer<LLImageRaw> mDecodedImage;
#030      S32 mDecodedType;
#031      S32 mDiscardLevel;
#032 
#033  private:
#034      U32 mPriority;
#035      LLPointer<LLResponder> mResponder;
#036     
#037 protected:
#038      static LLWorkerThread* sWorkerThread;
#039 
#040 public:
#041      static S32 sCount;
#042 };
#043 
 
在这个类里,先调用startWork函数开始线程工作,接着就不断调用requestDecodedData、requestDecodedAuxData来发送数据给线程来解码,然后再由线程来调用doWork来做这样的工作,最后调用endWork来结束工作。
 

发表于 @ 2008年04月25日 22:09:00|评论(loading...)|编辑

新一篇: 第二人生的源码分析(四十六)获取纹理图片的线程 | 旧一篇: 第二人生的源码分析(四十四)虚拟文件系统的请求处理

评论:没有评论。

发表评论  


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