代码拉取完成,页面将自动刷新
同步操作将从 likecg/kbengine 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
/*
This source file is part of KBEngine
For the latest info, see http://www.kbengine.org/
Copyright (c) 2008-2012 KBEngine.
KBEngine is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
KBEngine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with KBEngine. If not, see <http://www.gnu.org/licenses/>.
*/
#include "baseapp.hpp"
#include "backup_sender.hpp"
#include "server/serverconfig.hpp"
namespace KBEngine{
float backupPeriod = 0.0;
//-------------------------------------------------------------------------------------
BackupSender::BackupSender():
backupEntityIDs_(),
backupRemainder_(0.f)
{
}
//-------------------------------------------------------------------------------------
BackupSender::~BackupSender()
{
backupEntityIDs_.clear();
}
//-------------------------------------------------------------------------------------
void BackupSender::tick()
{
int32 periodInTicks = secondsToTicks(ServerConfig::getSingleton().getBaseApp().backupPeriod, 0);
if (periodInTicks == 0)
return;
// 这里对备份的entity做一下分批操作
// 大概算法是配置上填写的备份周期换算成tick数量, 每个tick备份一部分entity
float numToBackUpFloat = float(Baseapp::getSingleton().pEntities()->size()) / periodInTicks + backupRemainder_;
// 本次备份的数量
int numToBackUp = int(numToBackUpFloat);
// 计算出精度导致的损失数量
backupRemainder_ = numToBackUpFloat - numToBackUp;
// 如果备份表中没有内容了则重新产生一份新的
if (backupEntityIDs_.empty())
{
this->createBackupTable();
}
Mercury::Bundle bundle;
while((numToBackUp > 0) && !backupEntityIDs_.empty())
{
Base * pBase = Baseapp::getSingleton().findEntity(backupEntityIDs_.back());
backupEntityIDs_.pop_back();
MemoryStream* s = MemoryStream::ObjPool().createObject();
if (pBase && backup(*pBase, *s))
{
--numToBackUp;
bundle.append(*s);
}
MemoryStream::ObjPool().reclaimObject(s);
}
}
//-------------------------------------------------------------------------------------
bool BackupSender::backup(Base& base, MemoryStream& s)
{
// 这里开始将需要备份的数据写入流
base.writeBackupData(&s);
if(base.shouldAutoBackup() == KBE_NEXT_ONLY)
base.shouldAutoBackup(0);
return true;
}
//-------------------------------------------------------------------------------------
void BackupSender::createBackupTable()
{
backupEntityIDs_.clear();
Entities<Base>::ENTITYS_MAP::const_iterator iter = Baseapp::getSingleton().pEntities()->getEntities().begin();
for(; iter != Baseapp::getSingleton().pEntities()->getEntities().end(); iter++)
{
Base* pBase = static_cast<Base*>(iter->second.get());
if(pBase->shouldAutoBackup() > 0)
backupEntityIDs_.push_back(iter->first);
}
// 随机一下序列
std::random_shuffle(backupEntityIDs_.begin(), backupEntityIDs_.end());
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。