diff --git a/server/gameserver/CMakeLists.txt b/server/gameserver/CMakeLists.txt index f0d709a..9e57f2d 100644 --- a/server/gameserver/CMakeLists.txt +++ b/server/gameserver/CMakeLists.txt @@ -9,8 +9,11 @@ else() endif() set(CMAKE_BUILD_TYPE "Debug") -set(CMAKE_CXX_FLAGS_RELEASE "-O2 -g -std=gnu++11 -DGAME_ID=${GAME_ID} -DA8_TCP_SESSION2=1 -fsanitize=address -fno-omit-frame-pointer") +set(CMAKE_BUILD_TYPE "Release") +set(CMAKE_CXX_FLAGS_RELEASE "-O3 -g -std=gnu++11 -DGAME_ID=${GAME_ID} -DA8_TCP_SESSION2=1") +#set(CMAKE_CXX_FLAGS_RELEASE "-O2 -g -std=gnu++11 -DGAME_ID=${GAME_ID} -DA8_TCP_SESSION2=1 -fsanitize=address -fno-omit-frame-pointer") set(CMAKE_CXX_FLAGS_DEBUG "-Wall -g -std=gnu++11 -DGAME_ID=${GAME_ID} -DA8_TCP_SESSION2=1") +#set(CMAKE_CXX_FLAGS_DEBUG "-Wall -g -std=gnu++11 -DGAME_ID=${GAME_ID} -DA8_TCP_SESSION2=1 -fsanitize=address -fno-omit-frame-pointer") include_directories( AFTER diff --git a/server/gameserver/android.cc b/server/gameserver/android.cc index 6c7fe6f..d55b112 100644 --- a/server/gameserver/android.cc +++ b/server/gameserver/android.cc @@ -24,10 +24,10 @@ Android::~Android() void Android::Initialize() { + Human::Initialize(); health = meta->i->health(); skin.skin_id = 14001; skin.skin_lv = 1; - RecalcSelfCollider(); } void Android::Update(int delta_time) diff --git a/server/gameserver/app.cc b/server/gameserver/app.cc index 7e803cf..0855b4d 100755 --- a/server/gameserver/app.cc +++ b/server/gameserver/app.cc @@ -59,11 +59,12 @@ static void SavePerfLog() RoomMgr::Instance()->RoomNum() }); if (App::Instance()->HasFlag(4)) { - a8::XPrintf("mainloop_time:%d netmsg_time:%d room:%d online:%d\n", + a8::XPrintf("mainloop_time:%d netmsg_time:%d room:%d over_room:%d online:%d\n", { App::Instance()->perf.max_run_delay_time, App::Instance()->perf.max_dispatchmsg_time, RoomMgr::Instance()->RoomNum(), + RoomMgr::Instance()->OverRoomNum(), PlayerMgr::Instance()->OnlineNum() }); } @@ -73,16 +74,15 @@ static void SavePerfLog() f8::HttpClientPool::Instance()->max_request_delay = 0; } -void App::Init(int argc, char* argv[]) +bool App::Init(int argc, char* argv[]) { signal(SIGPIPE, SIG_IGN); this->argc = argc; this->argv = argv; if (!ParseOpt()) { - terminated = true; a8::XPrintf("gameserver启动失败,缺少-i参数\n", {}); - return; + return false; } a8::XPrintf("gameserver starting instance_id:%d pid:%d game_id:%d\n", {instance_id, getpid(), GAME_ID}); @@ -101,8 +101,8 @@ void App::Init(int argc, char* argv[]) JsonDataMgr::Instance()->Init(); MetaMgr::Instance()->Init(); uuid.SetMachineId(instance_id); - PlayerMgr::Instance()->Init(); RoomMgr::Instance()->Init(); + PlayerMgr::Instance()->Init(); GGListener::Instance()->Init(); a8::UdpLog::Instance()->Info("gameserver starting instance_id:%d pid:%d", {instance_id, getpid()}); @@ -118,16 +118,24 @@ void App::Init(int argc, char* argv[]) SavePerfLog(); }); } + if (HasFlag(7)) { + a8::Timer::Instance()->AddDeadLineTimer( + 1000 * 60 * 2, + a8::XParams(), + [] (const a8::XParams& param) + { + App::Instance()->terminated = true; + } + ); + } + return true; } void App::UnInit() { - if (terminated) { - return; - } - GGListener::Instance()->Init(); - RoomMgr::Instance()->UnInit(); + GGListener::Instance()->UnInit(); PlayerMgr::Instance()->UnInit(); + RoomMgr::Instance()->UnInit(); MetaMgr::Instance()->UnInit(); JsonDataMgr::Instance()->UnInit(); f8::HttpClientPool::Instance()->UnInit(); @@ -137,6 +145,8 @@ void App::UnInit() f8::TGLog::Instance()->UnInit(); UnInitLog(); + FreeSocketMsgQueue(); + FreeIMMsgQueue(); delete im_msg_mutex_; im_msg_mutex_ = nullptr; delete msg_mutex_; @@ -149,9 +159,6 @@ void App::UnInit() int App::Run() { - if (terminated) { - return 0; - } int ret = 0; a8::UdpLog::Instance()->Info("gameserver running", {}); last_run_tick_ = a8::XGetTickCount(); @@ -499,3 +506,52 @@ bool App::HasFlag(int flag) { return flags.find(flag) != flags.end(); } + +void App::FreeSocketMsgQueue() +{ + msg_mutex_->lock(); + if (!work_node_) { + work_node_ = top_node_; + top_node_ = nullptr; + bot_node_ = nullptr; + } + while (work_node_) { + MsgNode* pdelnode = work_node_; + work_node_ = work_node_->next; + if (pdelnode->buf) { + free(pdelnode->buf); + } + free(pdelnode); + if (!work_node_) { + work_node_ = top_node_; + top_node_ = nullptr; + bot_node_ = nullptr; + } + } + msg_mutex_->unlock(); +} + +void App::FreeIMMsgQueue() +{ + im_msg_mutex_->lock(); + if (!im_work_node_) { + im_work_node_ = im_top_node_; + im_top_node_ = nullptr; + im_bot_node_ = nullptr; + } + while (im_work_node_) { + IMMsgNode* pdelnode = im_work_node_; + im_work_node_ = im_work_node_->next; + if (pdelnode->msgid == f8::IM_SysMsgQueue) { + a8::XParams* param = (a8::XParams*)pdelnode->params.param1.GetUserData(); + delete param; + } + delete pdelnode; + if (!im_work_node_) { + im_work_node_ = im_top_node_; + im_top_node_ = nullptr; + im_bot_node_ = nullptr; + } + } + im_msg_mutex_->unlock(); +} diff --git a/server/gameserver/app.h b/server/gameserver/app.h index 2294633..0899486 100644 --- a/server/gameserver/app.h +++ b/server/gameserver/app.h @@ -12,7 +12,7 @@ private: public: - void Init(int argc, char* argv[]); + bool Init(int argc, char* argv[]); void UnInit(); int Run(); @@ -49,6 +49,8 @@ private: void UnInitLog(); bool ParseOpt(); + void FreeSocketMsgQueue(); + void FreeIMMsgQueue(); public: int argc = 0; @@ -68,6 +70,7 @@ public: 4: 打印性能日志 5: 压力测试 6: 删除over room + 7: 内存泄露测试 */ std::set flags; diff --git a/server/gameserver/main.cc b/server/gameserver/main.cc index ecf2f44..3ca4bad 100644 --- a/server/gameserver/main.cc +++ b/server/gameserver/main.cc @@ -1,12 +1,12 @@ #include "precompile.h" #include "app.h" -#include int main(int argc, char* argv[]) { int exitcode = 0; - App::Instance()->Init(argc, argv); - exitcode = App::Instance()->Run(); - App::Instance()->UnInit(); + if (App::Instance()->Init(argc, argv)) { + exitcode = App::Instance()->Run(); + App::Instance()->UnInit(); + } return exitcode; } diff --git a/server/gameserver/metamgr.cc b/server/gameserver/metamgr.cc index 25688a4..483166e 100755 --- a/server/gameserver/metamgr.cc +++ b/server/gameserver/metamgr.cc @@ -157,6 +157,10 @@ private: for (auto& meta : safearea_meta_list) { MetaData::SafeArea& item = a8::FastAppend(safearea_list); item.i = &meta; + if (App::Instance()->HasBit(7)) { + meta.set_wait_time(3); + meta.set_shrink_speed(500); + } safearea_hash[item.i->id()] = &item; } diff --git a/server/gameserver/room.cc b/server/gameserver/room.cc index 1e90f10..b5bf3e4 100644 --- a/server/gameserver/room.cc +++ b/server/gameserver/room.cc @@ -96,6 +96,7 @@ void Room::UnInit() delete pair.second; } removed_robot_hash_.clear(); + grid_service.UnInit(); } void Room::Update(int delta_time) diff --git a/server/gameserver/roommgr.cc b/server/gameserver/roommgr.cc index 95b4106..fc230da 100644 --- a/server/gameserver/roommgr.cc +++ b/server/gameserver/roommgr.cc @@ -43,6 +43,14 @@ void RoomMgr::Init() void RoomMgr::UnInit() { + for (auto& pair : room_hash_) { + pair.second->UnInit(); + delete pair.second; + } + for (auto& pair : over_room_hash_) { + pair.second->UnInit(); + delete pair.second; + } } void RoomMgr::Update(int delta_time) @@ -131,6 +139,11 @@ int RoomMgr::RoomNum() return room_hash_.size(); } +int RoomMgr::OverRoomNum() +{ + return over_room_hash_.size(); +} + Room* RoomMgr::GetJoinableRoom(const std::string& account_id) { for (auto& pair : inactive_room_hash_) { diff --git a/server/gameserver/roommgr.h b/server/gameserver/roommgr.h index 69da4b5..08fed53 100644 --- a/server/gameserver/roommgr.h +++ b/server/gameserver/roommgr.h @@ -23,6 +23,7 @@ class RoomMgr : public a8::Singleton void _CMJoin(f8::MsgHdr& hdr, const cs::CMJoin& msg); void ActiveRoom(long long room_uuid); int RoomNum(); + int OverRoomNum(); Room* GetRoomByUuid(long long uuid); void AddOverRoom(long long room_uuid); diff --git a/third_party/a8engine b/third_party/a8engine index fc4a7d7..0765079 160000 --- a/third_party/a8engine +++ b/third_party/a8engine @@ -1 +1 @@ -Subproject commit fc4a7d7d241002c04aaa09dbf6d6dac91f659a04 +Subproject commit 07650796618d3d5f86bc3749e817bdc4848458b9 diff --git a/third_party/framework b/third_party/framework index fd72ea5..0d1fd33 160000 --- a/third_party/framework +++ b/third_party/framework @@ -1 +1 @@ -Subproject commit fd72ea56059dc8545920e33d436dad5a1d3700fb +Subproject commit 0d1fd33446c6dda16e8ecb5a0ad9b0e42c44deee