- 博客(21)
- 资源 (44)
- 收藏
- 关注
原创 第二人生的源码分析(四十八)接收服务器回应的纹理图片头数据
前面介绍了怎么样发送纹理下载请求到服务器,那么在第二人生里又是怎么样接收纹理图片的呢?接着就来讨论这个问题,它的代码如下: 这是一个静态成员函数,主要为了给网络消息系统回调使用的。#001 // static#002 void LLViewerImageList::receiveImageHeader(LLMessageSystem *msg, void **user_data)
2008-04-29 22:11:00 3182
原创 第二人生的源码分析(四十七)发送下载纹理图片请求
这里接着上一次获取纹理图片线程,继续分析发送纹理图片请求到服务器。代码如下:#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 3039
原创 第二人生的源码分析(四十六)获取纹理图片的线程
纹理图片对于3D程序来说比较重要的数据,如果没有纹理图片,就没有亮丽的外表,就没有丰富多彩的世界。在第二人生里,纹理图片不是随着程序一起发布的,而是不断地从服务器上下载的,这点是不像其它游戏,把所有图片全部预先下载好。下面就来分析一下纹理下载线程的工作过程。先从程序:LLAppViewer::getTextureFetch()->createRequest(getID(),getTarge
2008-04-26 22:56:00 2109
原创 第二人生的源码分析(四十五)图像解压线程
前面介绍虚拟文件系统的线程,其实它是单一个线程来处理所有消息的,还有类LLLFSThread也是一样。在第二人生显示的软件里,图片是占了绝大部份数据,那么从服务器上下载的数据,都是压缩的图片,这样的图片大小就比较小一些,对于网络通讯就需要不太多带宽了,看到程序显示速度明显加快。下面就来分析一下这个线程到怎么样工作的?LLAppViewer::sImageDecodeThread = new L
2008-04-25 22:09:00 2349
原创 第二人生的源码分析(四十四)虚拟文件系统的请求处理
在虚拟文件系统的消息队列里,主要就是LLVFSThread::Request类的请求,Request类是嵌套类,定义在LLVFSThread类里面。它主要实现对类LLVFS的封装访问,让操作更加方便一些,当然它是继续QueuedRequest类的,这样才可以添加到消息队列里去,否则不能添加到这个消息队列容器,也不能实现请求处理的多态了。 下面是类Request的构造函数。#001 LL
2008-04-23 22:32:00 4488 2
原创 第二人生的源码分析(四十三)虚拟文件系统线程
由于第二人生是一个3D显示的软件,因此它就需要不断地从服务器下载大量数据,比如纹理图片,不同的角色是使用不同的纹理图片来实现不同的衣服外表的。当显示这些角色时,就使用从服务器下载的纹理图片。如果显示的人物角色比较多,比如有30个人时,这些纹理图片就需要保存到磁盘里。那么怎么样保存到磁盘里呢?保存到磁盘里就需要一个好的文件系统来保存,以及读取数据出来。读写磁盘是一项比较慢的工作,因此需要使用一个线程
2008-04-22 21:19:00 3523 5
原创 第二人生的源码分析(四十二)实现消息处理的线程类
第二人生里使用线程循环来处理消息,这样的结构就比较清晰。比如有一个写文件的请求,就可以把这个请求放到线程队列里,然后唤醒线程,让线程处理这个请求。那么在第二人生里是怎么样构造消息循环呢?又是怎么样执行其它线程发过来的请求呢?带着这两个问题来分析下面这几段代码。#001 void LLQueuedThread::run()#002 { 下面实现消息循环。#003 whi
2008-04-21 21:43:00 3440
原创 第二人生的源码分析(四十一)使用Apache运行库线程
对于跨平台的应用程序设计,考虑的东西一般都需要比较多,比如线程的设计,在Windows平台和Linux平台就是不一样的API,要适应这两种平台,就需要把这两种API接口通过封装成统一的编程接口,做这样工作的任务也是比较艰难的,因为需要不断地在两个系统上测试。由于Apache基金软件里有这样的共享库,就不必自己再去开发一套,使用现成的Apache软件既提高了开发效率,又可以保证跨平台运行。下面就来分
2008-04-20 11:28:00 3040
原创 第二人生的源码分析(四十)创建多个工作线程
多线程的程序是比较常见的,更何况是网络程序。随着多核CPU的发展,想提高程序的性能,只能靠多线程工作了。下面就带你看看第二人生是怎么创建多线程工作的,每个线程又是做什么样的工作。由于线程类是主动类,线程的工作结构就是程序的工作结构了,写一个好的程序,往往就是线程类的结构安排,也就是整个程序的架构实现。并且每个线程之间的交互,都需要小心地进行着,一着不慎就全盘皆输,造成多个线程之间死锁的出现,因此写
2008-04-18 23:26:00 2745
原创 第二人生的源码分析(三十九)关闭WinXP的错误报告功能
在Windows XP系统里,如果一个程序出错了,就会产生一个程序错误报告,并且可以发送到微软去。对于用户自己开发的程序出错,并不需要发送到微软去,因为那样做是没有什么作用的,毕竟微软不会帮我们改正程序的,那么怎么样来修改出错时不发送到弹出程序出错报告呢?现在就来看看第二人生里是怎么样实现的吧。它的代码如下:#001 void LLAppViewerWin32::disableWinError
2008-04-17 22:57:00 4269 2
原创 第二人生的源码分析(三十八)构造一个消息包并发送
消息解包已经看得比较多了,现在就来分析一下怎么样打包一个消息包。上面已经介绍了通过UDP发送消息包给服务器,这里主要介绍打包的过程,它的代码如下:#001 void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_group,#002 S
2008-04-16 22:57:00 3892
原创 第二人生的源码分析(三十七)消息处理的完整流程
虽然上面介绍了这么多消息处理:从网络接收到数据,再从数据解释到数据获取,但没有一个清晰的流程,下面就来详细地分析这个数据流程是怎么样调用的。具体调用流程如下:1. LLAppViewer::idle() 空闲时处理函数。2. LLAppViewer::idleNetwork()空闲时处理网络事件。3. LLMessageSyste
2008-04-15 23:29:00 3628
原创 第二人生的源码分析(三十六)获取消息包里每一个字段
上面介绍了怎么样构造消息模板,并用它来灵活地生成各种各样需要传送数据的数据结构,现在就来分析一下使用模板怎么样去分析缓冲区里的数据,然后获取消息各个字段数据,这样才可以让别的程序使用起来。#001 BOOL LLTemplateMessageReader::readMessage(const U8* buffer, #002
2008-04-14 21:53:00 3311
原创 第二人生的源码分析(三十五)分析消息模板文件
这种灵活的通讯消息结构到底是怎么样实现的呢?下面就来仔细地分析它实现的代码,如下:#001 // Read file and build message templates#002 void LLMessageSystem::loadTemplateFile(const char* filename)#003 { 首先判断文件名称是否合法。#004 if(!fil
2008-04-12 23:27:00 3437 2
原创 第二人生的源码分析(三十四)读取通讯的消息模板
在开发通讯的软件里,要让通讯的两端程序相互对话,其实就跟人与人的交流是一样的,要使用共同语言,而不能一个人说英语,一个人说汉语。由于通讯两端是分别在不同的程序里,那么就需要定出一套相互认同的语言—协议定义。而定义协议的办法有很多种,比如直接写成C结构,这样的方式最直接了,但它有点不灵活。又有采用XML的方式,这样虽然灵活了,但它的通讯消息大小又太大了,不便于传送,对于中国慢慢网络来说,又太不现实。
2008-04-11 23:21:00 2692
原创 第二人生的源码分析(三十三)消息解包的实现
下面的代码是实现数据包的有效性检验,先调用函数validateMessage来检验接收数据缓冲区里是否有效的数据包,然后调用getMessageName函数来查看是否属于这个环路的数据包,最后判断数据包是否值得信任的或者是否禁止接收的数据。#159 // UseCircuitCode can be a valid, off-circuit packet.
2008-04-10 22:22:00 3983
原创 第二人生的源码分析(三十二)消息解包的实现
从UDP接收到数据后,就会组装成一个完整的数据包,然后检验整个数据包是否有效,并且还处理收到回应的UDP包标识,这样构造一个完整的可靠性连接。具体处理代码如下:#001 BOOL LLMessageSystem::checkMessages( S64 frame_count )#002 {#003 // Pump #004 BOOL valid_packe
2008-04-09 23:23:00 6705 5
原创 第二人生的源码分析(三十一)接收数据的流量控制
数据接收回来后,本来就应立即处理掉,这样是比较简单的想法。但由于网络带宽有限,这时就需要限制UDP接收数据的速度。下面就来分析这种需求的实现,它的代码如下:#001 S32 LLPacketRing::receivePacket (S32 socket, char *datap)#002 {#003 S32 packet_size = 0;#004 下面判断是否
2008-04-08 21:52:00 3991 2
原创 第二人生的源码分析(三十)UDP接收数据和Windows网络关闭
从上面的协议就知道,有发送数据,就肯定有接收数据;有初始化,就肯定有结束。跟人的生命是一样的,有始就有终。那么第二人生里是怎么样接收数据呢?又是怎么样关闭Windows网络呢?通过下面的代码就可以学会怎么样使用UDP接收数据,并且关闭网络,回收资源给Windows系统。 下面的代码先判断是否创建了socket,如果创建了,就接着先关闭网络通讯,再接着删除socket句柄。最后调用函数WSA
2008-04-07 22:30:00 7755
原创 第二人生的源码分析(二十九)Windows网络初始化
上面已经介绍怎么样通过网络发送数据了,但心里又有一个问题,就是网络是怎么样进行初始化,才能发送数据呢?怎么样创建Windows下的UDP协议的呢?现在就来分析这段初始化的代码。#001 S32 start_net(S32& socket_out, int& nPort) #002 { #003 // Create socket, make no
2008-04-04 23:58:00 3217
原创 第二人生的源码分析(二十八)UDP发送数据的可靠性控制
学习过网络编程的人,应该都知道UDP是“不可靠”的协议。不知道你有没有想过UDP为什么不可靠,不可靠在那些方面。其实,UDP和TCP协议一样都是建立在不可靠的IP协议之上,UDP的不可靠是指它不具备流量控制,不具备数据包顺序达到,不具备验证数据包是否丢失。那么在第二人生里使用UDP协议又是怎么样来实现可靠的数据传送的呢?现在就来分析下面这段代码:#001 // This can be call
2008-04-03 21:18:00 2959 4
python抓取天气并分析 实例源码
2017-08-28
书《深度学习》
2017-03-13
国产8051模拟器
2016-09-10
tinyxml2配套源码
2016-06-27
selenium的浏览器驱动
2016-06-14
开源鸿蒙4.0不能进入桌面的补丁
2024-03-17
开源鸿蒙 4.0 RK3566开发板配置
2024-03-17
svm_hog_data.rar
2020-03-02
实现numpy的C++库扩展
2019-11-24
python web py入门配套源代码
2018-02-23
webpy演示例子1
2018-02-21
胶囊模型的代码
2018-02-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人