第二人生
caimouse
在IT行业有20多年的经验。拥有20多年的C和C++开发经验,5年以上Python开发经验,资深数据库开发、上百G数据库优化经验。曾经任职嵌入式工程师、P2P开发工程师、银行信用卡交易系统工程师、全自动化电池测试部门经理。
展开
-
第二人生的源码分析(七十二)LLFeatureManager类加载显示特性
由于显示卡技术发展迅猛,不同的渲染技术层出不穷。要对付这种市场的变化,就不能固定一种特定的显示特性,那么就需要一个配置文件来定义这种特性。第二人生这个游戏,是需要特定显示特性才能运行的,如果不符合这种最低要求的环境就不能运行它。下面就来分析类LLFeatureManager,看看第二人生是怎么样实现这个功能的。类LLFeatureManager的声明代码如下:#001 class LLFe原创 2008-05-26 20:30:00 · 3138 阅读 · 0 评论 -
第二人生的源码分析(七十四)LLStartUp类维护启动状态机
像第二人生这么复杂的大型程序,从你双击程序开始,直到它运行到真正的图形界面出来为止,经历的过程是漫长而复杂的,总共经历的状态就有22个,意思就是说每个状态里只会做一件事情,如果做那件事情不成功就会运行失败。那么第二人生采用这种状态机有什么好处呢?在我看来采用状态机的好处是利于把复杂的过程分解,利于把漫长的状态提示给用户,利于开发人员调试和分析,利于程序跳转到不同的状态。下面就来先看这个类的声明代码原创 2008-05-28 21:33:00 · 2798 阅读 · 0 评论 -
第二人生的源码分析(七十五)启动状态详细说明
前面介绍中说到启动状态有22种,那么这些状态是什么呢?现在就来分析这些状态,它的定义如下:#001 enum EStartupState{#002 STATE_FIRST, // Initial startup启动开始状态。 #003 STATE_MEDIA_INIT, // Initialzie m原创 2008-05-29 20:22:00 · 3656 阅读 · 0 评论 -
第二人生的源码分析(七十三)LLFeatureManager类分析特性文件
前面介绍类LLFeatureManager的声明部分,现在继续前面的内容进行分析,来看看它的实现代码,到底是怎么获取文本文件里的内容。先来看看它需要分析显示特性文件的内容是怎么样的,如下:version 10 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences// Shou原创 2008-05-27 21:39:00 · 2539 阅读 · 0 评论 -
第二人生的源码分析(七十八)LLOSInfo类实现获取操作系统信息
由于信息产业在不断地发展,特别像电脑里的操作系统更是更新不断。比如Windows系统,就有WIN NT、Win2000、WIN XP、WIN SERVER等等。下面就来分析这个类的声明代码:#001 class LLOSInfo#002 {#003 public: 构造函数。#004 LLOSInfo(); 把操作系统信息写到流对象。#005 voi原创 2008-06-02 20:57:00 · 3123 阅读 · 1 评论 -
第二人生的源码分析(七十六)判断程序运行多个实例
随着多任务系统的流行,可以轻易地把同一个程序同时运行多个实例,这对于一般的应用程序来说,是非常有用的,也大大地提高电脑的使用率。但是对于像第二人生这样的游戏来说,运行多个实例,是不需要的,也是不现实的。因为它需要非常多的CPU计算,独占CPU还不够用,别说运行多个实例了,并且它是全屏运行的游戏,多个程序运行也不必要。那么第二人生里是使用什么方法来实现跨平台的多个实例运行的检测呢?下面就来看看这段代原创 2008-05-30 21:16:00 · 2564 阅读 · 0 评论 -
第二人生的源码分析(七十七)CProcessor类实现获取CPU信息
在这个世界上,是多姿多彩的好,还是单一简单的好呢?做事情当然是越简单越好,但在我们去买商品时,又想越多选择越好。如果某种产品只有一家选择时,这显然是垄断性的产品,其售价也必然是高高在上的。在IT信息领域里,最重要的CPU芯片厂家就有两家:Intel和AMD。因此,我们需要获取CPU的信息,用来区分这两家CPU的技术差别,就算是同一家的CPU也存在不同版本的技术区别。只要在存在差别,软件就要比较复杂原创 2008-06-01 10:20:00 · 3382 阅读 · 4 评论 -
第二人生的源码分析(七十九)UI控制的类工厂
在游戏的程序里,界面的实现往往是比较复杂的。因为在游戏里,没有WINDOWS的组件可以使用,也没有其合适的组件可以使用,所有界面的显示都需要从最原始的方式来实现,这样工作量非常庞大。下面就来分析第二生里实现UI的类厂,它的声明代码如下:#001 class LLUICtrlFactory#002 {#003 public: 构造函数。#004 LLUICtrlFact原创 2008-06-03 21:15:00 · 2603 阅读 · 0 评论 -
第二人生的源码分析(八十)界面语言的选择
随着全球化的发展,地球变得平坦了。我有一个同事现在还在美国ORACLE进行学习,说明软件是真正的无国界产品。那么在第二人生里,到底是怎么样实现多语言的支持呢?带着这个问题来分析下面一段代码,如下:#001 void LLUICtrlFactory::setupPaths()#002 { 获取UI资源所在目录路径,比如:F:/secondlife/linden/indra/newvi原创 2008-06-04 20:51:00 · 3511 阅读 · 0 评论 -
第二人生的源码分析(八十二)创建UI的浮动窗口(floater)
上一次介绍了显示板的创建,这里来介绍创建浮动窗口。浮动的窗口可以显示在显示板之上,并且可以放在显示窗口不同的位置,也就是方便用户布局这个窗口在那里显示,比如聊天窗口,就可以放大,并且调整到合适的位置。下面就来分析创建浮动窗口的代码,如下:#001 void LLUICtrlFactory::buildFloater(LLFloater* floaterp, const LLString &fi原创 2008-06-06 21:00:00 · 2320 阅读 · 1 评论 -
第二人生的源码分析(八十一)创建UI的显示板(Panel)
在第二人生里,UI部分主要有三种大组件组成:显示板、浮动窗口、菜单。显示板是固定在窗口里面,上面可以放浮动的窗口。像登录的界面,就是一个显示板组成,那么它是怎么样实现的呢?现在就分析下面这段代码,如下:#001 BOOL LLUICtrlFactory::buildPanel(LLPanel* panelp, const LLString &filename,#002原创 2008-06-05 21:09:00 · 3574 阅读 · 0 评论 -
第二人生的源码分析(八十三)创建UI的菜单
从前面看到,不但窗口和显示板可以通过XML定制,而菜单也可以通过XML文件来定制的,那么菜单的定制又是怎样读取XML文件的呢?到底它又会产生什么样的对象来执行菜单呢?下面就来解决这两个问题,代码如下:#001 LLMenuGL *LLUICtrlFactory::buildMenu(const LLString &filename, LLView* parentp)#002 {#003原创 2008-06-07 18:13:00 · 2890 阅读 · 1 评论 -
第二人生的源码分析(八十四)保存UI的界面布局
前面介绍都是怎么样创建UI界面,这显然是在程序启动时需要做的工作,但是当用户改变了界面的布局之后,或者添加一些显示界面之后,就需要把它们保存起来,以便用户所有的变化在程序关闭之后仍然保存起来,然后在程序再次启动之后再从XML文件加载出来。下面就来看看第二人生里这段代码的实现,如下:#001 S32 LLUICtrlFactory::saveToXML(LLView* viewp, const原创 2008-06-08 11:24:00 · 2806 阅读 · 0 评论 -
第二人生的源码分析(八十八)LLButton类显示按钮的名称
前面介绍按钮可以显示在窗口里,以及这个类的声明,现在来仔细地分析一下它是怎么样实现名称显示的。在构造函数里先保存传送入来的名称,如下:#001 mUnselectedLabel = unselected_label;#002 mSelectedLabel = selected_label;#003 从类声明里可以看到mSelectedLabel和mUnsele原创 2008-06-12 22:31:00 · 4358 阅读 · 0 评论 -
第二人生的源码分析(八十五)LLView实现OpenGL窗口显示
由于OpenGL只是负责显示3D的内容,并没有相应的UI实现,因此第二人生里就采用类LLView来实现一个窗口的显示,在这个窗口里可以显示任何其它的窗口,达到递归显示窗口的内容。下面就来仔细地分析它的显示函数,如下:#001 void LLView::draw()#002 { 如果设置调试窗口显示,就显示调试窗口。#003 if (sDebugRects)#004原创 2008-06-09 20:48:00 · 3659 阅读 · 1 评论 -
第二人生的源码分析(八十六)LLView类添加子窗口显示
前面已经介绍怎么样遍历子窗口显示,那么它的子窗口是怎么样添加到列表里的呢?下面就来仔细地分析这方面的代码,如下:#001 void LLView::addChild(LLView* child, S32 tab_group)#002 { 如果添加自己到子窗口里提示出错。#003 if (mParentView == child) #004 {#005原创 2008-06-10 21:20:00 · 2551 阅读 · 0 评论 -
第二人生的源码分析(八十七)LLButton类实现按钮功能
在前面介绍了登录过程的界面里有一个退出按钮,如果当用户不想登录时,就可以随时按这个按钮退出登录的过程,它的界面如下面,那么这个按钮是怎么样实现的呢? 从上图右下角可以看到Quit按钮,它的功能实现是由类LLButton来实现的,这个类的声明如下:#001 class LLButton#002 : public LLUICtrl#003 {#004 public: 按原创 2008-06-11 20:47:00 · 3032 阅读 · 1 评论 -
第二人生的源码分析(九十)LLScrollListCtrl实现列表显示
在第二人生的UI显示里,滚动列表也使用比较多的,由于多项列表选择的情况下,使用滚动列表往往使用界面使用起来更方便实用。如下面的登录界面,就有使用到滚动列表的控件: 从上图里可以看到最右边使用到一个滚动列表来显示不同的服务器,这样方便用户选择不同的服务器登录。那这个滚动列表是怎么样实现的呢?接着下来就分析这个类的代码,类的继承关系如下:#001 class LLScrollListCtr原创 2008-06-14 21:41:00 · 2590 阅读 · 0 评论 -
第二人生的源码分析(八十九)从XML里创建LLButton
在第二人生里,很多界面的创建是基于XML文件来创建,比如前面提到的登录界面。在一个界面里由很多类型组件组成的,这里就介绍其中最常用的组件是按钮组件了。比如登录界面的连接或者退出按钮,都是从XML里分析出按钮的类型,然后创建按钮的。下面就来分析一下LLButton的XML处理代码,如下:#001 LLView* LLButton::fromXML(LLXMLNodePtr node, LLVie原创 2008-06-13 22:25:00 · 2379 阅读 · 0 评论 -
第二人生的源码分析(九十一)LLScrollListCtrl列表的详细绘制
从前面可以看到怎么样绘制滚动列表框的代码,但在那个函数里面还调用一个函数drawItems来详细地绘制列表项的,现在就来分析这个函数的代码,如下:#001 void LLScrollListCtrl::drawItems()#002 { 计算左上角显示的位置。#003 S32 x = mItemListRect.mLeft;#004 S32 y = mIte原创 2008-06-15 21:04:00 · 3147 阅读 · 0 评论 -
第二人生的源码分析(九十二)LLLineEditor实现编辑框
在基于GUI界面的软件交互时,最基本的输入就是编辑框了,比如下图里输入的用户名称和密码,在游戏界面的编辑框里输入文字是一个高技术难度的问题,因为Windows输入法调用,也是难点之一。 那么在第二人生里的用户名称和密码的编辑框是怎么样实现的呢?现在就来分析这部份的代码,它的类继承关系如下:class LLLineEditor: public LLUICtrl, public LLE原创 2008-06-16 21:57:00 · 4233 阅读 · 0 评论 -
第二人生的源码分析(九十四)LLTextBox类实现文本显示
在登录的画面里,可以看到程序的版本显示,那么它是怎么样显示出来的呢?现在就来分析显示这个版本号的代码,其实它是由静态文本显示框LLTextBox来显示的。比如在登录时创建版本显示的代码如下: 这里就是创建静态文本框。#001 LLTextBox* version_text = LLUICtrlFactory::getTextBoxByName(this, "version_text")原创 2008-06-18 23:04:00 · 3586 阅读 · 0 评论 -
第二人生的源码分析(九十七)LLSlider实现音量滑动条
由于第二人生是多媒体的程序,因此它有音乐播放和语言聊天,那么就得使用到一种滑动条来调整音量的大小,如下图所示: 那么这个音量滑动条是怎么样实现的呢?下面就来详细地分析它的实现代码,先来看看它的类继承关系,如下:class LLSlider : public LLUICtrlLLSlider类只继承LLUICtrl类,那么说明它拥有控件类的功能,能在界面上面显示出来。它的详细显示代码原创 2008-06-22 23:16:00 · 5981 阅读 · 2 评论 -
第二人生的源码分析(九十五)LLCheckBoxCtrl类实现复选按钮
在第二人生的登录界面里,可以看到输入密码的下面有一个复选按钮,如下图所示:这个按钮在这里主要用来设置是否帮助用户保存密码在磁盘里的,这样可以使用户每次不用输入密码,就可以登录进去。那么这个按钮是怎么样实现的呢?现在就分析跟这个相关的代码,它的继承代码如下:class LLCheckBoxCtrl: public LLUICtrl可见LLCheckBoxCtrl类也是控件类来的,原创 2008-06-19 23:35:00 · 4164 阅读 · 0 评论 -
第二人生的源码分析(九十六)LLMenuItemGL实现菜单的显示
在第二生里,菜单是缺少不了的。菜单提供了简单层次关系的一种表达方式,方便表达复杂的层次关系,并且方便写说明书,方便售后服务人员的描述,方便培训。因此,在一个程序没有菜单,往往带来很多不方便的地方。登录界面的菜单如下图: 从上图可以看到File、Edit、Help几个菜单,那么它是怎么样实现的呢?下面就来分析相关的代码。下面先来看菜单定义的继承关系:class LLMenuItemG原创 2008-06-20 23:12:00 · 2953 阅读 · 0 评论 -
第二人生的源码分析(九十九)雷达地图的实现
无论是在2D的游戏里,还是在3D的游戏里,雷达地图的实现,都是比较基本的功能了。因为随着游戏世界里越来越大,参加的玩家也越来越多,需要一个大体的地图来让玩家方便地看到全局的概貌。比如在打对战的游戏里,更加需要了解别人在那里战斗了。有了雷达地图之后,就可以让玩家更加方便地了解全局地图上发生的事情,也方便玩家相互查找,也让玩家不会走迷路。下面就来了解第二生里的怎么样实现雷达地图的实现,它的显示界面如下原创 2008-07-01 21:30:00 · 5171 阅读 · 0 评论 -
第二人生的源码分析(九十八)LLIconCtrl实现图标按钮显示
在前面已经介绍过文字按键的实现,这里主要实现一个图标按钮的实现,如下图里右下角显示的喇叭显示和向上选择的按钮,都是图标显示类型的按钮。 先来看图标按钮类的继承关系,如下:class LLIconCtrl: public LLUICtrl由这里可以看到LLIconCtrl类是控件类,它可以显示在界面上面。下面来看它的实现代码:#001 class LLIconCtrl#0原创 2008-06-30 21:17:00 · 3203 阅读 · 0 评论 -
第二人生的源码分析(100)雷达地图详细显示
前面已经介绍雷达地图的类声明,现在就来仔细分析一下雷达地图是怎么样显示出来的。雷达地图显示函数LLNetMap::draw代码如下:#001 void LLNetMap::draw()#002 {#003 static LLFrameTimer map_timer;#004 判断是否显示雷达地图。#005 if (!getVisible() || !gWo原创 2008-07-02 21:00:00 · 4906 阅读 · 3 评论 -
afxvisualmanagervs2005.cpp(33)内存泄漏问题
当使用VC2008编译时,发现MFC的程序提示有如下内存泄漏:Detected memory leaks!Dumping objects ->f:/dd/vctools/vc7libs/ship/atlmfc/src/mfc/afxvisualmanagervs2005.cpp(33) : {564} client block at 0x00F14D00, subtype c0, 572 byte原创 2010-03-19 13:04:00 · 3906 阅读 · 0 评论