第二人生
caimouse
在IT行业有20多年的经验。拥有20多年的C和C++开发经验,5年以上Python开发经验,资深数据库开发、上百G数据库优化经验。曾经任职嵌入式工程师、P2P开发工程师、银行信用卡交易系统工程师、全自动化电池测试部门经理。
展开
-
第二人生的源码分析(四十二)实现消息处理的线程类
第二人生里使用线程循环来处理消息,这样的结构就比较清晰。比如有一个写文件的请求,就可以把这个请求放到线程队列里,然后唤醒线程,让线程处理这个请求。那么在第二人生里是怎么样构造消息循环呢?又是怎么样执行其它线程发过来的请求呢?带着这两个问题来分析下面这几段代码。#001 void LLQueuedThread::run()#002 { 下面实现消息循环。#003 whi原创 2008-04-21 21:43:00 · 3440 阅读 · 0 评论 -
第二人生的源码分析(四十三)虚拟文件系统线程
由于第二人生是一个3D显示的软件,因此它就需要不断地从服务器下载大量数据,比如纹理图片,不同的角色是使用不同的纹理图片来实现不同的衣服外表的。当显示这些角色时,就使用从服务器下载的纹理图片。如果显示的人物角色比较多,比如有30个人时,这些纹理图片就需要保存到磁盘里。那么怎么样保存到磁盘里呢?保存到磁盘里就需要一个好的文件系统来保存,以及读取数据出来。读写磁盘是一项比较慢的工作,因此需要使用一个线程原创 2008-04-22 21:19:00 · 3523 阅读 · 5 评论 -
第二人生的源码分析(四十四)虚拟文件系统的请求处理
在虚拟文件系统的消息队列里,主要就是LLVFSThread::Request类的请求,Request类是嵌套类,定义在LLVFSThread类里面。它主要实现对类LLVFS的封装访问,让操作更加方便一些,当然它是继续QueuedRequest类的,这样才可以添加到消息队列里去,否则不能添加到这个消息队列容器,也不能实现请求处理的多态了。 下面是类Request的构造函数。#001 LL原创 2008-04-23 22:32:00 · 4489 阅读 · 2 评论 -
第二人生的源码分析(四十五)图像解压线程
前面介绍虚拟文件系统的线程,其实它是单一个线程来处理所有消息的,还有类LLLFSThread也是一样。在第二人生显示的软件里,图片是占了绝大部份数据,那么从服务器上下载的数据,都是压缩的图片,这样的图片大小就比较小一些,对于网络通讯就需要不太多带宽了,看到程序显示速度明显加快。下面就来分析一下这个线程到怎么样工作的?LLAppViewer::sImageDecodeThread = new L原创 2008-04-25 22:09:00 · 2349 阅读 · 0 评论 -
第二人生的源码分析(四十九)接收服务器回应的纹理图片数据
上面已经介绍怎么样接收纹理图片头的数据,但真正的图片数据是怎么样传送回来的呢?#001 // static#002 void LLViewerImageList::receiveImagePacket(LLMessageSystem *msg, void **user_data)#003 {#004 LLMemType mt1(LLMemType::MTYPE_APPFM原创 2008-05-01 10:59:00 · 1873 阅读 · 0 评论 -
第二人生的源码分析(四十六)获取纹理图片的线程
纹理图片对于3D程序来说比较重要的数据,如果没有纹理图片,就没有亮丽的外表,就没有丰富多彩的世界。在第二人生里,纹理图片不是随着程序一起发布的,而是不断地从服务器上下载的,这点是不像其它游戏,把所有图片全部预先下载好。下面就来分析一下纹理下载线程的工作过程。先从程序:LLAppViewer::getTextureFetch()->createRequest(getID(),getTarge原创 2008-04-26 22:56:00 · 2111 阅读 · 0 评论 -
第二人生的源码分析(五十)纹理图片的格式之引用类
从前面已经看到可以从服务器下载纹理图片,那么下载这些纹理图片,又是什么样的格式呢?在第二人生里,主要有三种格式:JPEG2000、TGA、RAW。虽然对应只有三种格式,但OpenGL里只能使用RAW的格式作为纹理,而JPEG2000和TGA并不能直接作纹理数据使用,因而就需要对这两种格式进行转换和管理。下面就来了解这方面的内容,看看第二人生里是怎么样把JPEG2000和TGA转换为可以使用的纹理格原创 2008-05-02 14:13:00 · 2080 阅读 · 0 评论 -
第二人生的源码分析(四十七)发送下载纹理图片请求
这里接着上一次获取纹理图片线程,继续分析发送纹理图片请求到服务器。代码如下:#001 void LLTextureFetch::sendRequestListToSimulators()#002 {#003 const S32 IMAGES_PER_REQUEST = 50;#004 const F32 LAZY_FLUSH_TIMEOUT = 15.f; //原创 2008-04-27 22:33:00 · 3042 阅读 · 0 评论 -
第二人生的源码分析(四十八)接收服务器回应的纹理图片头数据
前面介绍了怎么样发送纹理下载请求到服务器,那么在第二人生里又是怎么样接收纹理图片的呢?接着就来讨论这个问题,它的代码如下: 这是一个静态成员函数,主要为了给网络消息系统回调使用的。#001 // static#002 void LLViewerImageList::receiveImageHeader(LLMessageSystem *msg, void **user_data)原创 2008-04-29 22:11:00 · 3184 阅读 · 0 评论 -
Second life的源码销售方式
主要提供给一些想快速入门的开发人员或公司。 第二人生开发包提供,价格198元/套(含邮费,不开发票)。包括内容如下:1. 第二人生客户端源程序。2. 《第二人生的源码分析》PDF文档。3. 2G U盘一个,主要用来拷贝源程序以及相关开发工具。 联系方式:QQ: 9073204MSN:原创 2008-05-02 14:35:00 · 3332 阅读 · 4 评论 -
第二人生的源码分析(五十一)纹理图片的格式之LLImageBase类
这次来讨论一下图片的基类LLImageBase,从前一篇里已经看到它的继承关系,仅在引用类LLThreadSafeRefCount之后,而在JPEG2000和TGA类之前。那么为什么需要设计有这个基类LLImageBase呢?这个得从面向对象来说起,由于JPEG2000和TGA都有共同的图像属性,那么就需要一个公共的基类,这样达到代码复用,减少代码编写和维护。下面仔细查看这个类的声明:#001原创 2008-05-03 20:37:00 · 3012 阅读 · 0 评论 -
第二人生的源码分析(五十二) 纹理图片的格式之LLImageFormatted类
前面介绍了图片的基类,现在来介绍一下图片的格式化表示LLImageFormatted类。那么为什么需要设计这个格式化类呢?而不是直接从图片的基类继承到JPEG2000或者TGA呢?其实,这个类LLImageFormatted只是一个接口,让不同压缩方式的图片数据转换为中间表示方式,也就是原始数据表示方式。它的类声明如下:#001 class LLImageFormatted : public原创 2008-05-04 21:25:00 · 2439 阅读 · 3 评论 -
第二人生的源码分析(五十三) 纹理图片的格式之LLImageJ2C类
目前网络带宽比起以前是快了很多,但对于3D这样大型程序来说,还是远远不够的。特别像第二人生这样逼真的画面,需要实时传送更多真实细节的图片,既然网络的带宽不够,又需要显示这么逼真的画面,那么只有采用更加先进的技术了。在这里就介绍一下第二人生采用比较新的JPEG2000图片格式。它的类声明如下:#001 class LLImageJ2C : public LLImageFormatted#原创 2008-05-05 20:58:00 · 2982 阅读 · 0 评论 -
第二人生的源码分析(101)脚本的初步知识
哲学里说,世界是永远在运动的。那么在现实中人们对软件的需求是永远在变化的,为了对付这种不断变化的需求,有什么好方法吗?难道还是像过去一样,每一个需求都是发布一个版本来解决?随着市场竞争的激烈化,满足每一个用户个性化需求,就需要考虑一种办法让用户自己去改变的游戏世界里的东西了。在第二人生里,就引入了脚本语言来解决不同用户的需求的变化,而不必重新发布新程序。有了脚本系统之后,用户想创建一个飞机在游戏里原创 2008-07-04 20:00:00 · 3257 阅读 · 0 评论 -
第二人生的源码分析(102)脚本的构造
前面我们学习怎么样打开窗口来创建脚本,接着下来就需要知道这些脚本是做什么用的,这样最终才会按它的语义来正确地执行起来。现在我们能够查看脚本的内容: default{ state_entry() { llSay(0, “Hello, Avatar!”); }原创 2008-07-07 22:10:00 · 3548 阅读 · 0 评论 -
第二人生的源码分析(五十四)纹理图片的格式之LLImageTGA类
前面介绍了JPEG2000的图片格式,下面介绍LLImageTGA类的格式。TGA(Tagged Graphics)文件是由美国Truevision公司为其显示卡开发的一种图像文件格式,已被国际上的图形、图像工业所接受。现在已成为数字化图像,以及运用光线跟踪算法所产生的高质量图像的常用格式。TGA文件的扩展名为.tga。TGA的结构比较简单,属于一种图形、图像数据的通用格式,目前大部分文件为24位原创 2008-05-06 20:46:00 · 2325 阅读 · 0 评论 -
第二人生的源码分析(103)脚本的词法分析(1)
从前面的脚本可以看到它的代码,也理解它的意思了,但是它是怎么样执行的呢?又是怎么样变成可执行的脚本呢?下面就来分析这部份相关的代码。要了解脚本执行,就得把脚本中的每一个单词识别出来,如下: default { state_entry() { llSay(0, “Hello, Avatar!”);原创 2008-07-10 22:32:00 · 4216 阅读 · 0 评论 -
第二人生的源码分析(104)脚本的词法分析(2)
接着上一次,再来分析flex文件的下一部份:规则部份。它们由一连串带有代码的正则表达式组成,当匹配相对应的正则表达式时,这些代码就会被运行。下面就一段规则的代码:#001 %%这行表示规则代码开始。 #002 "//" { gInternalLine++; gInternalColumn = 0; comment(); }这里使用“//”来表原创 2008-07-11 22:25:00 · 3126 阅读 · 0 评论 -
第二人生的源码分析(五十五)OpenGL的API函数管理
对于高性能的3D游戏显示,目前在世界上流行的就两套API,一套是OpenGL,一套是微软的D3D。由于OpenGL跨平台的特性,对于第二人生来说,是没有别的选择了。那么在第二人生里渲染管道到底是怎么样调用OpenGL函数的呢?又有什么特别的方式可以让调用OpenGL更加方便呢?由于OpenGL并不是基于C++的接口,所以在第二人生里就肯定先把这些API组织成类的方式,才会更方便使用。下面就来仔细地原创 2008-05-07 22:26:00 · 3360 阅读 · 0 评论 -
第二人生的源码分析(106)脚本的词法分析(4)
前面介绍了flex文件的格式,那么flex程序又把这个文件生成怎么样的文件呢?下面就来仔细分析这个文件,由于flex程序生成C++的文件格式,那么就需要C++的编译器才可以编译了。它的代码如下:#001 #line 2 "lex_yy.cpp"这行是行号同步使用。 #002 /* A lexical scanner generated by flex */#003原创 2008-07-15 23:35:00 · 3208 阅读 · 0 评论 -
第二人生的源码分析(五十六)OpenGL离屏渲染的实现
我们都知道显示卡有一片内存叫做显存,顾名思义,显存就是显示内容的存储器。意思就是说所有显示到显示器的内容都需要放到这片内存里,然后显示卡再作DAC的动作,最后才能从屏幕里看到输出的内容。现在的显示内存都比较大了,在屏幕里显示一帧图片,已经只占很小一块内存空间了。那也许你会问为什么厂家还在不断推出大显示内存的显示卡呢?难道厂商只是想多挣几块钱吗?呵呵,下面就带你来了解一下大显示内存的优势所在,其实由原创 2008-05-08 21:30:00 · 6518 阅读 · 3 评论 -
第二人生的源码分析(五十七)OpenGL离屏渲染的相关函数
前面介绍了类LLRenderTarget的声明,并且大体地说明了每个函数的作用,但没有仔细地看到它是怎么样实现的,现在就来分析具体的实现细节。它的实现代码如下:#001 BOOL LLRenderTarget::sUseFBO = FALSE;#002 下面是构造函数初始化成员变量。#003 LLRenderTarget::LLRenderTarget()#004原创 2008-05-09 21:12:00 · 4295 阅读 · 0 评论 -
第二人生的源码分析(109)脚本的语法分析(3)
下面来详细地分析语法分析相关的类,以便了解整个语法分析的过程和细节,这样也方便地复用第二人生里的脚本编译器,达到源码复用的目标。先来分析类LLScriptFilePosition,它的声明代码如下:#001 class LLScriptFilePosition#002 {#003 public: 构造函数,保存脚本所在的行号和列号。#004 LLScr原创 2008-07-24 21:52:00 · 3619 阅读 · 2 评论 -
第二人生的源码分析(五十八)使用FreeType字体
对于第二人生来说是跨平台运行的,那么显示文字就成为一个问题了。特别在3D环境里显示文字,更加是比较困难的问题。因为在图形界面里显示的字体,都是图片,并且每个字是一个图片,可以随着不同的字体大小而改变的。第二人生里是使用FreeType来实现文字显示的,而不是基于WINDOWS平台的显示字体技术。下面就来看看FreeType的字体管理器类,如下:#001 class LLFontManager原创 2008-05-10 23:59:00 · 3274 阅读 · 0 评论 -
第二人生的源码分析(五十九)字体类LLFont的实现
上面已经介绍到第二人生里是使用FreeType来显示字体的,因此需要使用一个类来封装这些操作,这类就叫做LLFont。在这个类里基本的任务,就是:1)初始化FreeType的库。2)打开字体文件。3)设置字体每点或者每个像素的大小。4)加载一个字符的笔画,并生成位图。5)把位图数据生成RAW图片的格式。6)最后变成纹理贴图让OpenGL输出。 在类LLFontMan原创 2008-05-11 10:07:00 · 2832 阅读 · 0 评论 -
第二人生的源码分析(110)脚本的语法分析(5)
在脚本里有很多语句组成的,那么对于语句又是怎么进行语法分析的呢?下面就来分析for语句的分析过程,它的声明代码如下:#001 class LLScriptFor : public LLScriptStatement#002 {#003 public: 构造函数,输入保存的值。#004 LLScriptFor(S32 line, S32 col, LLSc原创 2008-07-27 19:52:00 · 3547 阅读 · 0 评论 -
第二人生的源码分析(六十)多协议文件传送库libcurl的介绍
网络发展得很快,越来越多网络传送协议出现,不管是什么样的开发人员面对这些协议都是比较困难的工作,往往在一个程序里就有多种不同协议的需求。像WEB流行的今天,如果没有使用HTTP协议好像已经很落后了。当然是HTTP协议比较流行和通用,只要能上网,就能传送数据,这种环境对于应用程序的适用性真是太好了。虽然HTTP协议是比较简单的,但让你从头来开发它,还是需要比较长的时间,那么有没有比较快速的方法呢?回原创 2008-05-12 21:45:00 · 4939 阅读 · 0 评论 -
第二人生的源码分析(六十一)LLCurl类实现libcurl库封装
通过上面介绍了libcurl库的功能,那么在第二人生里到底是怎么样使用它的呢?又是怎么样封装它,才会更好用呢?下面就来分析一下它的类声明:#001 // For whatever reason, this is not typedefd in curl.h#002 typedef size_t (*curl_header_callback)(void *ptr, size_t size,原创 2008-05-13 20:44:00 · 4401 阅读 · 1 评论 -
第二人生的源码分析(111)脚本的综合分析(1)
当语法分析一个脚本完成时,那么就会把整个脚本的分析结果保存起来,在第二人生里把脚本的结果保存到那里呢?现在就来分析这个问题,先来看看语法分析的文件里,有如下的代码:#001 case 3:#002 #line 277 "indra.y"#003 {#004 (yyval.script) = new LLScriptScript(NULL, (原创 2008-07-29 21:37:00 · 3964 阅读 · 0 评论 -
第二人生的源码分析(六十二)类Easy实现多协议文件传送
从上一节里可以看到,在类LLCurl声明里主要声明嵌套类Easy,最后通过嵌套类Easy来实现libcurl功能,下面就来仔细地分析它。它的类声明如下:#001 class LLCurl::Easy#002 {#003 LOG_CLASS(Easy);#004 #005 private:#006 Easy();#007 #008 public:原创 2008-05-14 20:42:00 · 5729 阅读 · 3 评论 -
第二人生的源码分析(六十三)类Multi实现多请求
从前面看到类Easy是封装了一个请求,但往往需要传送多个请求的情况,这样就需要实现多个请求能同时工作的类,在第二人生里是把这部份功能放在类Multi里的,同样它也是LLCurl类的嵌套类。它的声明如下:#001 class LLCurl::Multi#002 {#003 LOG_CLASS(Multi);#004 public:#005 #006 Mult原创 2008-05-15 21:04:00 · 2285 阅读 · 0 评论 -
第二人生的源码分析(六十四)类LLCurlEasyRequest实现Http请求
当第二人生登录时,它是通过HTTP请求来发送数据到服务器的,为了方便使用前面介绍的libcurl库,那么再提供一个HTTP特别请求类来实现这个功能。通过这个类LLCurlEasyRequest就可以与HTTP服务器进行交流数据了,具体声明代码如下:#001 class LLCurlEasyRequest#002 {#003 public: 在构造函数里创建类Multi和类Eas原创 2008-05-16 21:06:00 · 2417 阅读 · 0 评论 -
第二人生的源码分析(六十五)Expat XML解析器的介绍
互联网发展得很快,都是源自于使用了超文本的表达方式。比如你查看一篇文章,看到不懂的关键字,就可以通过链接去查看它的内容,看完之后再回来接着看原来的东西,这样比较适合学习的方式。使用HTML标记的文本,是结构化储存的,这样的表达方式才可以实现超级连接。由于HTML具有超强的表达能力,也就在互联网上生存下来,那么人们就会想到能不能使用这种方式来保存所有需要保存的内容呢?慢慢地就开发XML标记语言,用来原创 2008-05-18 11:00:00 · 6310 阅读 · 2 评论 -
第二人生的源码分析(六十八)LLXMLNode使用Expat库分析XML文件
在前面看到怎么打开XML文件,在那个函数的后面调用parseBuffer函数来分析XML数据,那么在这个函数是怎么样进行XML数据分析的呢?现在就仔细地分析这个函数的代码,它的代码如下:#001 // static#002 bool LLXMLNode::parseBuffer(#003 U8* buffer,#004 U32 length,#005 LLXM原创 2008-05-21 21:03:00 · 3692 阅读 · 2 评论 -
第二人生的源码分析(112)脚本的综合分析(2)
前面介绍了分析脚本类的声明,下面来仔细地分析它的实现代码,理解它的实现过程,也就理解了脚本代码的编译过程,如下: 返回生成的代码大小为0.#001 S32 LLScriptScript::getSize()#002 {#003 return 0;#004 }#005 脚本类的构造函数,主要进行初始化的工作。#006 LLScript原创 2008-08-03 17:42:00 · 3775 阅读 · 1 评论 -
第二人生的源码分析(六十七)LLXMLNode使用Expat库打开文件
前面介绍了什么是expat库,也介绍怎么使用它来打开XML文件进行分析,接着下来就来分析第二人生里是怎么样使用它。详细的函数代码如下:#001 // static#002 bool LLXMLNode::parseFile(#003 LLString filename,#004 LLXMLNodePtr& node,#005 LLXMLNode* defaul原创 2008-05-20 21:04:00 · 3451 阅读 · 1 评论 -
第二人生的源码分析(六十六)使用Expat XML解析器的例子
要了解第二人生里使用expat XML解析器之前,先来仔细地分析一下怎么样使用expat库的小例子,看看具体调用了那些接口函数,是否会很复杂的呢?‘它的例子程序如下:#001 /*****************************************************************#002 * outline.c#003 *#004 * Cop原创 2008-05-19 22:12:00 · 8002 阅读 · 4 评论 -
第二人生的源码分析(六十九)使用LLXmlTree类来分析XML配置文件
前面已经介绍使用expat库来分析XML数据,那么在第二人生里是怎么样分析XML配置文件的呢?现在就来分析这方面的问题,先来看看第二人生分析配置文件调用关系,如下:1. LLAppViewerWin32::init()2. LLAppViewer::init()3. LLControlGroup::loadFromFile()4. L原创 2008-05-22 22:25:00 · 4035 阅读 · 1 评论 -
第二人生的源码分析(七十)LLXmlTreeParser类生成XML树
LLXmlTreeParser类是继承类LLXmlParser,主要实现创建树节点,并且把树节点保存起来,这样就可以方便外面查找XML里的数据。下面先来分析这个类的声明:#001 class LLXmlTreeParser : public LLXmlParser#002 {#003 public: 类的构造函数和析构函数。#004 LLXmlTreeParser(L原创 2008-05-23 21:31:00 · 2354 阅读 · 2 评论 -
第二人生的源码分析(七十一)实现闪屏窗口
现在的电子信息技术发展得很快,特别像CPU这样的硬件,已经进入到多核时代,运行程序的速度比以前快了很多,但人类的需求是无止境的,因此写的程序也越来越大,越来越复杂,导致程序的初始化时,就变得比原来更加漫长。在人机交互理论里,让人等待超过10秒的时间,心情就会变得急躁,感觉这个程序不好用。那么有什么方法解决这个问题呢?在我们的社会里,到处都有排队等待的现象,比如让你去银行办理业务,如果让你站在那里等原创 2008-05-24 21:19:00 · 2826 阅读 · 0 评论