2008年05月
随着多任务系统的流行,可以轻易地把同一个程序同时运行多个实例,这对于一般的应用程序来说,是非常有用的,也大大地提高电脑的使用率。但是对于像第二人生这样的游戏来说,运行多个实例,是不需要的,也是不现实的。因为它需要非常多的CPU计算,独占CPU还不够用,别说运行多个实例了,并且它是全屏运行的游戏,多个程序运行也不必要。那么第二人生里是使用什么方法来实现跨平台的多个实例运行的检测呢?下面就来看看这段代码:阅读全文>
发表于 @ 2008年05月30日 21:16:00|评论(loading...)|编辑
前面介绍中说到启动状态有22种,那么这些状态是什么呢?现在就来分析这些状态,它的定义如下:阅读全文>
发表于 @ 2008年05月29日 20:22:00|评论(loading...)|编辑
像第二人生这么复杂的大型程序,从你双击程序开始,直到它运行到真正的图形界面出来为止,经历的过程是漫长而复杂的,总共经历的状态就有22个,意思就是说每个状态里只会做一件事情,如果做那件事情不成功就会运行失败。那么第二人生采用这种状态机有什么好处呢?在我看来采用状态机的好处是利于把复杂的过程分解,利于把漫长的状态提示给用户,利于开发人员调试和分析,利于程序跳转到不同的状态。下面就来先看这个类的声明代码:阅读全文>
发表于 @ 2008年05月28日 21:33:00|评论(loading...)|编辑
前面介绍类LLFeatureManager的声明部分,现在继续前面的内容进行分析,来看看它的实现代码,到底是怎么获取文本文件里的内容。先来看看它需要分析显示特性文件的内容是怎么样的,如下:阅读全文>
发表于 @ 2008年05月27日 21:39:00|评论(loading...)|编辑
由于显示卡技术发展迅猛,不同的渲染技术层出不穷。要对付这种市场的变化,就不能固定一种特定的显示特性,那么就需要一个配置文件来定义这种特性。第二人生这个游戏,是需要特定显示特性才能运行的,如果不符合这种最低要求的环境就不能运行它。下面就来分析类LLFeatureManager,看看第二人生是怎么样实现这个功能的。阅读全文>
发表于 @ 2008年05月26日 20:30:00|评论(loading...)|编辑
现在的电子信息技术发展得很快,特别像CPU这样的硬件,已经进入到多核时代,运行程序的速度比以前快了很多,但人类的需求是无止境的,因此写的程序也越来越大,越来越复杂,导致程序的初始化时,就变得比原来更加漫长。在人机交互理论里,让人等待超过10秒的时间,心情就会变得急躁,感觉这个程序不好用。那么有什么方法解决这个问题呢?在我们的社会里,到处都有排队等待的现象,比如让你去银行办理业务,如果让你站在那里等着,没有任何电视或报纸看,感觉时间需要很长。这里通过看电视和报纸,让人感觉到时间不长。其实还有一个更好的办法,当大家在银行排队时,银行的服务员应立即送上茶、可乐、冰棒等等,让大家一边吃着一边等着,这样排队更加感觉不到时间长了。所以在我们设计程序里,也需要给用户一些“茶、可乐、冰棒”,这就是闪屏窗口。
阅读全文>
发表于 @ 2008年05月24日 21:19:00|评论(loading...)|编辑
LLXmlTreeParser类是继承类LLXmlParser,主要实现创建树节点,并且把树节点保存起来,这样就可以方便外面查找XML里的数据。下面先来分析这个类的声明:阅读全文>
发表于 @ 2008年05月23日 21:31:00|评论(loading...)|编辑
前面已经介绍使用expat库来分析XML数据,那么在第二人生里是怎么样分析XML配置文件的呢?现在就来分析这方面的问题,先来看看第二人生分析配置文件调用关系,如下:阅读全文>
发表于 @ 2008年05月22日 22:25:00|评论(loading...)|编辑
在前面看到怎么打开XML文件,在那个函数的后面调用parseBuffer函数来分析XML数据,那么在这个函数是怎么样进行XML数据分析的呢?现在就仔细地分析这个函数的代码,它的代码如下:阅读全文>
发表于 @ 2008年05月21日 21:03:00|评论(loading...)|编辑
前面介绍了什么是expat库,也介绍怎么使用它来打开XML文件进行分析,接着下来就来分析第二人生里是怎么样使用它。详细的函数代码如下:阅读全文>
发表于 @ 2008年05月20日 21:04:00|评论(loading...)|编辑
要了解第二人生里使用expat XML解析器之前,先来仔细地分析一下怎么样使用expat库的小例子,看看具体调用了那些接口函数,是否会很复杂的呢?‘它的例子程序如下:阅读全文>
发表于 @ 2008年05月19日 22:12:00|评论(loading...)|编辑
互联网发得展很快,都是源自于使用了超文本的表达方式。比如你查看一篇文章,看到不懂的关键字,就可以通过链接去查看它的内容,看完之后再回来接着看原来的东西,这样比较适合学习的方式。使用HTML标记的文本,是结构化储存的,这样的表达方式才可以实现超级连接。由于HTML具有超强的表达能力,也就在互联网上生存下来,那么人们就会想到能不能使用这种方式来保存所有需要保存的内容呢?慢慢地就开发XML标记语言,用来保存任意想保存的内容。由于XML具有HTML同样的功能,并且不限定标记,这样就可以表达所有的东西了。并且XML是基于树形结构的,想表达的信息就可以采用归类树的方式来组织内容了,这样能产生灵活可变的内容管理方式。比如在第二人生里采用参数配置文件,也是选择XML来保存的,并且使用expat的XML解析器来实现这方面的内容。接着下来,我们就来了解一下expat是什么东东,又是怎么样调用它来解析XML文件的。阅读全文>
发表于 @ 2008年05月18日 11:00:00|评论(loading...)|编辑
当第二人生登录时,它是通过HTTP请求来发送数据到服务器的,为了方便使用前面介绍的libcurl库,那么再提供一个HTTP特别请求类来实现这个功能。通过这个类LLCurlEasyRequest就可以与HTTP服务器进行交流数据了,具体声明代码如下:阅读全文>
发表于 @ 2008年05月16日 21:06:00|评论(loading...)|编辑
从前面看到类Easy是封装了一个请求,但往往需要传送多个请求的情况,这样就需要实现多个请求能同时工作的类,在第二人生里是把这部份功能放在类Multi里的,同样它也是LLCurl类的嵌套类。它的声明如下:阅读全文>
发表于 @ 2008年05月15日 21:04:00|评论(loading...)|编辑
从上一节里可以看到,在类LLCurl声明里主要声明嵌套类Easy,最后通过嵌套类Easy来实现libcurl功能,下面就来仔细地分析它。它的类声明如下:阅读全文>
发表于 @ 2008年05月14日 20:42:00|评论(loading...)|编辑
通过上面介绍了libcurl库的功能,那么在第二人生里到底是怎么样使用它的呢?又是怎么样封装它,才会更好用呢?下面就来分析一下它的类声明:阅读全文>
发表于 @ 2008年05月13日 20:44:00|评论(loading...)|编辑
网络发展得很快,越来越多网络传送协议出现,不管是什么样的开发人员面对这些协议都是比较困难的工作,往往在一个程序里就有多种不同协议的需求。像WEB流行的今天,如果没有使用HTTP协议好像已经很落后了。当然是HTTP协议比较流行和通用,只要能上网,就能传送数据,这种环境对于应用程序的适用性真是太好了。虽然HTTP协议是比较简单的,但让你从头来开发它,还是需要比较长的时间,那么有没有比较快速的方法呢?回答是肯定的阅读全文>
发表于 @ 2008年05月12日 21:45:00|评论(loading...)|编辑
上面已经介绍到第二人生里是使用FreeType来显示字体的,因此需要使用一个类来封装这些操作,这类就叫做LLFont。在这个类里基本的任务,就是:
1)初始化FreeType的库。
2)打开字体文件。
3)设置字体每点或者每个像素的大小。
4)加载一个字符的笔画,并生成位图。
5)把位图数据生成RAW图片的格式。
6)最后变成纹理贴图让OpenGL输出。阅读全文>
发表于 @ 2008年05月11日 10:07:00|评论(loading...)|编辑
对于第二人生来说是跨平台运行的,那么显示文字就成为一个问题了。特别在3D环境里显示文字,更加是比较困难的问题。因为在图形界面里显示的字体,都是图片,并且每个字是一个图片,可以随着不同的字体大小而改变的。第二人生里是使用FreeType来实现文字显示的,而不是基于WINDOWS平台的显示字体技术。阅读全文>
发表于 @ 2008年05月10日 23:59:00|评论(loading...)|编辑
使用glGenFramebuffersEXT函数来创建离屏对象,glDeleteFramebuffersEXT函数来删除对象,使用glBindFramebufferEXT绑定当前使用的FrameBuffer对象。使用glFramebufferTexture2DEXT函数来指定纹理。使用函数glRenderbufferStorageEXT来指定离屏的大小。这些函数都是OPENGL比较新的API扩展,因此使用这些功能就需要检查OPENGL是否支持这些功能,才能使用它,否则会出错的。阅读全文>
发表于 @ 2008年05月09日 21:12:00|评论(loading...)|编辑
我们都知道显示卡有一片内存叫做显存,顾名思义,显存就是显示内容的存储器。意思就是说所有显示到显示器的内容都需要放到这片内存里,然后显示卡再作DAC的动作,最后才能从屏幕里看到输出的内容。现在的显示内存都比较大了,在屏幕里显示一帧图片,已经只占很小一块内存空间了。那也许你会问为什么厂家还在不断推出大显示内存的显示卡呢?难道厂商只是想多挣几块钱吗?呵呵,下面就带你来了解一下大显示内存的优势所在,其实由于显示卡与内存之间,还需要通过数据总线来连接的,其实越多显示内容放在显示卡里面,就会加速显示速度。并且现在的显示卡,还可以一边显示小部份内存,一边让剩余的显示内存就让给CPU在后台操作,生成下一帧的数据,这样显示内存越大,就可以后台生成越多的图片帧数据,这样就可以加速显示。那么在后台生成的显示数据,就叫做离屏渲染。阅读全文>
发表于 @ 2008年05月08日 21:30:00|评论(loading...)|编辑
对于高性能的3D游戏显示,目前在世界上流行的就两套API,一套是OpenGL,一套是微软的D3D。由于OpenGL跨平台的特性,对于第二人生来说,是没有别的选择了。那么在第二人生里渲染管道到底是怎么样调用OpenGL函数的呢?又有什么特别的方式可以让调用OpenGL更加方便呢?由于OpenGL并不是基于C++的接口,所以在第二人生里就肯定先把这些API组织成类的方式,才会更方便使用。下面就来仔细地分析类LLGLImmediate,它的声明如下:阅读全文>
发表于 @ 2008年05月07日 22:26:00|评论(loading...)|编辑
前面介绍了JPEG2000的图片格式,下面介绍LLImageTGA类的格式。TGA(Tagged Graphics)文件是由美国Truevision公司为其显示卡开发的一种图像文件格式,已被国际上的图形、图像工业所接受。现在已成为数字化图像,以及运用光线跟踪算法所产生的高质量图像的常用格式。TGA文件的扩展名为.tga。TGA的结构比较简单,属于一种图形、图像数据的通用格式,目前大部分文件为24位或32位真彩色,在多媒体领域有着很大影响。由于Truevision公司推出TGA的目的是为了采集、输出电视图像,所以TGA文件总是按行存储、按行进行压缩的,这使得它同时也成为计算机生成图像向电视转换的一种首选格式。阅读全文>
发表于 @ 2008年05月06日 20:46:00|评论(loading...)|编辑
目前网络带宽比起以前是快了很多,但对于3D这样大型程序来说,还是远远不够的。特别像第二人生这样逼真的画面,需要实时传送更多真实细节的图片,既然网络的带宽不够,又需要显示这么逼真的画面,那么只有采用更加先进的技术了。在这里就介绍一下第二人生采用比较新的JPEG2000图片格式。
它的类声明如下:阅读全文>
发表于 @ 2008年05月05日 20:58:00|评论(loading...)|编辑
前面介绍了图片的基类,现在来介绍一下图片的格式化表示LLImageFormatted类。那么为什么需要设计这个格式化类呢?而不是直接从图片的基类继承到JPEG2000或者TGA呢?其实,这个类LLImageFormatted只是一个接口,让不同压缩方式的图片数据转换为中间表示方式,也就是原始数据表示方式。阅读全文>
发表于 @ 2008年05月04日 21:25:00|评论(loading...)|编辑
这次来讨论一下图片的基类LLImageBase,从前一篇里已经看到它的继承关系,仅在引用类LLThreadSafeRefCount之后,而在JPEG2000和TGA类之前。那么为什么需要设计有这个基类LLImageBase呢?这个得从面向对象来说起,由于JPEG2000和TGA都有共同的图像属性,那么就需要一个公共的基类,这样达到代码复用,减少代码编写和维护。阅读全文>
发表于 @ 2008年05月03日 20:37:00|评论(loading...)|编辑
主要提供给一些想快速入门的开发人员或公司。
第二人生开发包提供,价格198元/套(含邮费,不开发票)。
包括内容如下:
1. 第二人生客户端源程序。
2. 《第二人生的源码分析》PDF文档。
3. 2G U盘一个,主要用来拷贝源程序以及相关开发工具。
联系方式:
QQ: 9073204
MSN: caimouse1976@sina.com
EMAIL: ccaimouse@gmail.com阅读全文>
发表于 @ 2008年05月02日 14:35:00|评论(loading...)|编辑
从前面已经看到可以从服务器下载纹理图片,那么下载这些纹理图片,又是什么样的格式呢?在第二人生里,主要有三种格式:JPEG2000、TGA、RAW。虽然对应只有三种格式,但OpenGL里只能使用RAW的格式作为纹理,而JPEG2000和TGA并不能直接作纹理数据使用,因而就需要对这两种格式进行转换和管理。下面就来了解这方面的内容,看看第二人生里是怎么样把JPEG2000和TGA转换为可以使用的纹理格式的。阅读全文>
发表于 @ 2008年05月02日 14:13:00|评论(loading...)|编辑