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

前面介绍虚拟文件系统的线程,其实它是单一个线程来处理所有消息的,还有类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来结束工作。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值