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 ...
随机推荐
- jQuery在IE7和8下setInterval失效的问题
原因不在于setInterval,而是IE的缓存造成ajax请求页没有更新的问题. 在请求的url中加入一个随机数参数即可. var CheckPaied = function (transactio ...
- Sorl之.net操作
http://www.cnblogs.com/zhangweizhong/category/771055.html 插入: SolrNet.Startup.Init<Movie>(&quo ...
- Win10下IIS配置图解、MVC项目发布图解、IIS添加网站图解
Win10下IIS配置 .找到控制面板:[开始]菜单鼠标右击,打开[控制面板] .打开控制面板,点击[程序],点击[启用或关闭Windows功能] 下一步,点击[启用虎关闭Windows功能] . 开 ...
- R语言的日期运算
写hive SQL查询, 需要从导入的参数, 自动累加日期. 从而实现一个自动的,多个日期的统计过程 R语言的日期运算超级简单. > test<-Sys.Date() > test ...
- 在Silverlight宿主html页面添加按钮无法显示
在建silverlight应用程序时宿主html中嵌入的silverlight时出现的问题: 预想效果: 实际效果: silverlight填满整个page的所以无法显示html中其他的控件 解决办法 ...
- 第一篇代码 嗨翻C语言 21点扑克
/* * 计算牌面点数的程序. * 使用“拉斯难加斯公开许可证”. * 学院21点扑克游戏小组. */#include <stdio.h>#include <stdlib.h& ...
- css权重及优先级问题
css权重及优先级问题 几个值的对比 初始值 指定值 计算值 应用值 CSS属性的 指定值 (specified value)会通过下面3种途径取得: 在当前文档的样式表中给这个属性赋的值,会被优先使 ...
- android保存图片的方式
Android中保存图片的两种方式 第一种是保存到数据库: 1.保存到数据库: 2.从数据库读取: 二是以图片格式保存到本地 1. A.声明tempFile以保存到指定路径: B.保存到tempFil ...
- Erlang generic standard behaviours -- gen_server module
在分析完gen module (http://www.cnblogs.com/--00/p/4271386.html)之后,就可以开始进入gen_server 的主体module 了.gen_serv ...
- [转]KDE/QT与GNOME/GTK比较
[转]KDE/QT与GNOME/GTK比较 http://www.cnblogs.com/itech/archive/2009/08/18/1548964.html 虽然在商业方面存在竞争,GNOME ...