当前搜索:

第二人生的源码分析(四十八)接收服务器回应的纹理图片头数据

前面介绍了怎么样发送纹理下载请求到服务器,那么在第二人生里又是怎么样接收纹理图片的呢?接着就来讨论这个问题,它的代码如下: 这是一个静态成员函数,主要为了给网络消息系统回调使用的。#001 // static#002 void LLViewerImageList::receiveImageHeader(LLMessageSystem *msg, void **user_data)...
阅读(2892) 评论(0)

第二人生的源码分析(四十七)发送下载纹理图片请求

这里接着上一次获取纹理图片线程,继续分析发送纹理图片请求到服务器。代码如下:#001 void LLTextureFetch::sendRequestListToSimulators()#002 {#003      const S32 IMAGES_PER_REQUEST = 50;#004      const F32 LAZY_FLUSH_TIMEOUT = 15.f; //...
阅读(2676) 评论(0)

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

纹理图片对于3D程序来说比较重要的数据,如果没有纹理图片,就没有亮丽的外表,就没有丰富多彩的世界。在第二人生里,纹理图片不是随着程序一起发布的,而是不断地从服务器上下载的,这点是不像其它游戏,把所有图片全部预先下载好。下面就来分析一下纹理下载线程的工作过程。先从程序:LLAppViewer::getTextureFetch()->createRequest(getID(),getTarge...
阅读(1811) 评论(0)

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

前面介绍虚拟文件系统的线程,其实它是单一个线程来处理所有消息的,还有类LLLFSThread也是一样。在第二人生显示的软件里,图片是占了绝大部份数据,那么从服务器上下载的数据,都是压缩的图片,这样的图片大小就比较小一些,对于网络通讯就需要不太多带宽了,看到程序显示速度明显加快。下面就来分析一下这个线程到怎么样工作的?LLAppViewer::sImageDecodeThread = new L...
阅读(2046) 评论(0)

第二人生的源码分析(四十四)虚拟文件系统的请求处理

在虚拟文件系统的消息队列里,主要就是LLVFSThread::Request类的请求,Request类是嵌套类,定义在LLVFSThread类里面。它主要实现对类LLVFS的封装访问,让操作更加方便一些,当然它是继续QueuedRequest类的,这样才可以添加到消息队列里去,否则不能添加到这个消息队列容器,也不能实现请求处理的多态了。 下面是类Request的构造函数。#001 LL...
阅读(4155) 评论(3)

第二人生的源码分析(四十三)虚拟文件系统线程

由于第二人生是一个3D显示的软件,因此它就需要不断地从服务器下载大量数据,比如纹理图片,不同的角色是使用不同的纹理图片来实现不同的衣服外表的。当显示这些角色时,就使用从服务器下载的纹理图片。如果显示的人物角色比较多,比如有30个人时,这些纹理图片就需要保存到磁盘里。那么怎么样保存到磁盘里呢?保存到磁盘里就需要一个好的文件系统来保存,以及读取数据出来。读写磁盘是一项比较慢的工作,因此需要使用一个线程...
阅读(3126) 评论(5)

第二人生的源码分析(四十二)实现消息处理的线程类

第二人生里使用线程循环来处理消息,这样的结构就比较清晰。比如有一个写文件的请求,就可以把这个请求放到线程队列里,然后唤醒线程,让线程处理这个请求。那么在第二人生里是怎么样构造消息循环呢?又是怎么样执行其它线程发过来的请求呢?带着这两个问题来分析下面这几段代码。#001 void LLQueuedThread::run()#002 { 下面实现消息循环。#003      whi...
阅读(3095) 评论(1)

第二人生的源码分析(四十一)使用Apache运行库线程

对于跨平台的应用程序设计,考虑的东西一般都需要比较多,比如线程的设计,在Windows平台和Linux平台就是不一样的API,要适应这两种平台,就需要把这两种API接口通过封装成统一的编程接口,做这样工作的任务也是比较艰难的,因为需要不断地在两个系统上测试。由于Apache基金软件里有这样的共享库,就不必自己再去开发一套,使用现成的Apache软件既提高了开发效率,又可以保证跨平台运行。下面就来分...
阅读(2637) 评论(0)

第二人生的源码分析(四十)创建多个工作线程

多线程的程序是比较常见的,更何况是网络程序。随着多核CPU的发展,想提高程序的性能,只能靠多线程工作了。下面就带你看看第二人生是怎么创建多线程工作的,每个线程又是做什么样的工作。由于线程类是主动类,线程的工作结构就是程序的工作结构了,写一个好的程序,往往就是线程类的结构安排,也就是整个程序的架构实现。并且每个线程之间的交互,都需要小心地进行着,一着不慎就全盘皆输,造成多个线程之间死锁的出现,因此写...
阅读(2399) 评论(0)

第二人生的源码分析(三十九)关闭WinXP的错误报告功能

在Windows XP系统里,如果一个程序出错了,就会产生一个程序错误报告,并且可以发送到微软去。对于用户自己开发的程序出错,并不需要发送到微软去,因为那样做是没有什么作用的,毕竟微软不会帮我们改正程序的,那么怎么样来修改出错时不发送到弹出程序出错报告呢?现在就来看看第二人生里是怎么样实现的吧。它的代码如下:#001 void LLAppViewerWin32::disableWinError...
阅读(3912) 评论(2)

第二人生的源码分析(三十八)构造一个消息包并发送

消息解包已经看得比较多了,现在就来分析一下怎么样打包一个消息包。上面已经介绍了通过UDP发送消息包给服务器,这里主要介绍打包的过程,它的代码如下:#001 void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_group,#002                           S...
阅读(3565) 评论(0)

第二人生的源码分析(三十七)消息处理的完整流程

虽然上面介绍了这么多消息处理:从网络接收到数据,再从数据解释到数据获取,但没有一个清晰的流程,下面就来详细地分析这个数据流程是怎么样调用的。具体调用流程如下:1.        LLAppViewer::idle()      空闲时处理函数。2.        LLAppViewer::idleNetwork()空闲时处理网络事件。3.        LLMessageSyste...
阅读(3290) 评论(0)

第二人生的源码分析(三十六)获取消息包里每一个字段

上面介绍了怎么样构造消息模板,并用它来灵活地生成各种各样需要传送数据的数据结构,现在就来分析一下使用模板怎么样去分析缓冲区里的数据,然后获取消息各个字段数据,这样才可以让别的程序使用起来。#001 BOOL LLTemplateMessageReader::readMessage(const U8* buffer, #002                                 ...
阅读(2955) 评论(0)

第二人生的源码分析(三十五)分析消息模板文件

这种灵活的通讯消息结构到底是怎么样实现的呢?下面就来仔细地分析它实现的代码,如下:#001 // Read file and build message templates#002 void LLMessageSystem::loadTemplateFile(const char* filename)#003 { 首先判断文件名称是否合法。#004      if(!fil...
阅读(3098) 评论(2)

第二人生的源码分析(三十四)读取通讯的消息模板

在开发通讯的软件里,要让通讯的两端程序相互对话,其实就跟人与人的交流是一样的,要使用共同语言,而不能一个人说英语,一个人说汉语。由于通讯两端是分别在不同的程序里,那么就需要定出一套相互认同的语言—协议定义。而定义协议的办法有很多种,比如直接写成C结构,这样的方式最直接了,但它有点不灵活。又有采用XML的方式,这样虽然灵活了,但它的通讯消息大小又太大了,不便于传送,对于中国慢慢网络来说,又太不现实。...
阅读(2404) 评论(0)
21条 共2页1 2 下一页 尾页
    个人资料
    • 访问:5898513次
    • 积分:76237
    • 等级:
    • 排名:第22名
    • 原创:1624篇
    • 转载:61篇
    • 译文:11篇
    • 评论:2102条
    文章存档