share干什么的
share到底干什么的
//--------------------打开GameServer,share中加载-------------------------
.加载nBodyID
//玩家的nBodyID表([职业][性别][nboduid])
std::vector<std::vector<int> > m_nbodyid_table;
if(!load_nbodyid())
Plug::PlugMessageBox("加载nBodyID表失败啊!"); .加载人物等级信息
//玩家等级基础信息([职业][等级][等级信息])
std::vector<std::vector<ActorLevelInfo> > m_level_info_vec;
if(!load_level_info())
Plug::PlugMessageBox("加载角色等级信息失败!"); //获取地图信息
std::map<int, MapData> m_mapdata_table;
if(!load_mapdata())
Plug::PlugMessageBox("加载地图数据失败!"); for(auto iter_map : m_mapdata_table)
{
auto& map = m_maps[iter_map.first] = NEW(Map);//创建map
map->init(get_max_gc_numb(), iter_map.second.map_path.c_str());//初始化map里面的很多东西,有待详解
map->m_get_level_info = std::bind(&Share::getLevelInfo, this, ph::_1, ph::_2, ph::_3); map->mapId = iter_map.first;
std::wstring name = L"地图";
name += boost::lexical_cast<std::wstring>(map->mapId);
onThrID(map->getThrID(), name); //获取线程ID
}
m_pDataLayer = data_layer;//用于发送包到客户端
//---------------------------上线玩家--------------------------------
m_share->add_player2(m_actor_id, mapID, m_actor_name);//需要将玩家加入到这两个容器中
void Share::add_player2(int actID, int mapID, const std::string& name)
{
m_all_player[actID] = mapID;
m_name_info[name] = actID;
}
//--------------------------玩家下线-----------------------------------
void Share::del_player2(int actor_id, const std::string& name)
{
m_all_player.erase(actor_id);//从这两个容器中删掉
m_name_info.erase(name);
} //-------------------------其他一些跨地图的操作------------------------
如:聊天,还有就是玩家切换地图的操作,等于说是share保存的是所有地图的信息,以后也会有相应的跨地图的操作放在这里面
//--------------------------最后一个最重要的操作,就是接受map中的消息--------------------
void Share::procMapSendData()
{
for(auto map : m_maps)
{
MapPkt pkt;
for (;;)
{
if(!map.second->revData(pkt))
break;
if(pkt.cmd == ms2gs_转client_cmd)
{
m_pDataLayer->send_data(pkt.channel_id, pkt.data, pkt.len);
}
else if(ms2gs_db_buff_info == pkt.cmd)
{
//玩家下线,保存数据到DB
auto channel = m_Channels[pkt.channel_id];//看来share里面保存了所有的channel信息
channel->OnSaveData(pkt.data, pkt.len); //注意:小退不断开连接
if(channel->isDisconnect())
{
//放入释放队列中,断开
push_freeQueue(channel);
m_Channels[pkt.channel_id] = NULL;
}
}
else if(ms2gs_obj_leave == pkt.cmd)//玩家切换地图
{
int tgtMapID = -;
std::stringstream ss;
ss.write((char*)pkt.data, pkt.len);
boost::archive::binary_iarchive ia(ss);
ia >> tgtMapID; //进入新地图
auto newMap = getMapByMapID(tgtMapID);
newMap->gs2msData(gs2ms_add_player/*gs2ms_obj_enter*/, pkt.channel_id , (void*)ss.str().c_str(), ss.str().size());
auto gc = m_Channels[pkt.channel_id]; //->m_map = newMap;
gc->m_map = newMap; //修改地图
m_all_player[gc->getActorID()] = tgtMapID; //放入在线玩家容器 ////激活玩家【应客户端处理】
//Protocol ptl = {0};
//ptl.cmd_type = c2s_activate_player;
//ptl.content = nullptr;
//ptl.size = 0;
//std::vector<char> buffer;
/ffer.resize(sizeof(Protocol));
//int send_len = ptl.to_buffer(&buffer[0], buffer.size());
//newMap->gs2msData(gs2ms_转client_cmd, pkt.channel_id, &buffer[0], send_len);
}
delete[] pkt.data;
pkt.data = nullptr;
}
}
}
/*share里面保存了所有的map信息,保存所有上线玩家的部分信息,所有的channel信息,我就有个疑问了为什么GameServer要继承
share,难道只是因为需要在在GS线程中处理procMapSendData(),那也不用完全继承share啊,我就去问队长,得到的回答是
GameServer管理所有的channel,而所有的channel保存在share中,所以这样就继承了,其实也不用继承share,直接把channel信息放到GameServer中也可以
这算是疑问,待我在看看*/
share干什么的的更多相关文章
- LA 3231 - Fair Share
You are given N processors and M jobs to be processed. Two processors are specified to each job. To ...
- 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Contract 分享 WebView 中的内容, 为 WebView 截图
[源码下载] 重新想象 Windows 8.1 Store Apps (81) - 控件增强: WebView 之加载本地 html, 智能替换 html 中的 url 引用, 通过 Share Co ...
- linux下安装MySQL出错file /usr/share/mysql/charsets/latin2.xml from install of MySQL-......
linux64 red hat 6.3企业版 开始错误装了32位mysql最后怎么也装不上64mysql了,折腾了一番最后全部卸载搞定: file /etc/init.d/mysql from ins ...
- sendEmail报错:at /usr/share/perl5/vendor_perl/IO/Socket/SSL.pm
sendEmail发送邮件是出现以下报错: ******************************************************************* Using the ...
- iOS - Share 分享/第三方登录
1.系统方式创建分享 按照下图在 Info.plist 文件中将 Localization native development region 的值改为 China.如果不设置此项弹出的分享页面中显示 ...
- share登录Samba可读可写(适合虚拟机下学习使用)
直接配置 smb.conf ( path = /etc/samba/smb.conf ). 首先,进入到 samba 文件夹: cd /etc/samba/ 备份 smb.conf: mv smb.c ...
- Select for update/lock in share mode 对事务并发性影响
select for update/lock in share mode 对事务并发性影响 事务并发性理解 事务并发性,粗略的理解就是单位时间内能够执行的事务数量,常见的单位是 TPS( transa ...
- file /usr/share/mysql/... conflicts with file from package mysql-libs-5.1.73-3.el6_5.x86_ 64 MySQL安装
在CentOS 6.5安装MySQL 5.6.17,安装到最后一个rpm文件MySQL-server时 安装命令是:rpm -ivh MySQL-server-5.6.17-1.el6.x86_64. ...
- Filestream/Windows Share导致Alwayson Failover失败
最近做了一个case, 客户在ALWAYSON环境下进行failover操作, 之后所有replica上的alwayson group状态变成了resolving. 并且在执行failover的rep ...
随机推荐
- JS 获取浏览器和屏幕宽高等信息代码
JS 获取浏览器和屏幕宽高等信息. 网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:doc ...
- php excel (转)
首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包含了PHPExcel.php和 PHPExcel的文件夹,这个类文件和文件夹是我们需要的,把clas ...
- AMD平台下在Windows虚拟机中安装Mac10.8.6【Written By KillerLegend】
我的电脑CPU是AMD,以前在虚拟机中装过Windows操作系统,感觉很简单,这几天想体验一下苹果系统,未来也可能会从事Mac相关软件开发,于是从早上便兴致勃勃的开始了--于是悲剧也开始了,上网各种查 ...
- Linux平台下:块设备、裸设备、ASMlib、Udev相关关系
对磁盘设备(裸分区)的访问方式分为两种:1.字符方式访问(裸设备):2.块方式访问 Solaris平台 : 在Solaris平台下,系统同时提供对磁盘设备的字符.块方式访问.每个磁盘有两个设备文件名: ...
- Linux基础 30分钟GDB调试快速突破
引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代 ...
- brew mac osx 上软件包管理工具
今天推荐 Mac OSX 下,方便高效的包管理工具 brew brew 的全名叫做 Homebrew 它的功能类似于 ubuntu 下同下 apt-get ,或者 Cent OS 下的 yum 等包管 ...
- hdu 1237 简单计算器
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单计算器 Description 读入一个只包含 +, -, *, / 的非负整数计算表达式, ...
- mousewheel滚轮事件
原生的滚轮事件:火狐与其他浏览器使用了不同的事件 /* * 滚轮事件只有firefox比较特殊,使用DOMMouseScroll; 其他浏览器使用mousewheel; * */ // firefox ...
- 为iPhone6设计自适应布局
Apple从iOS6加入了Auto Layout后开始就比较委婉的开始鼓励.建议开发者使用自适应布局,但是到目前为止,我感觉大多数开发者一直在回避这个问题,不管是不是由于历史原因造成的,至少他们在心底 ...
- LinqToExcel: LINQ查询Excel电子表格
Linq的强大人所共知,能不能将Linq扩展到读取excel呢? 答案当然是肯定的. LinqToExcel就是一个实现了使用Linq语法查询excel表格的.net开源类库. 在nuget搜索下载安 ...