青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
金慶的專欄
C++博客
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
::
423 隨筆 :: 0 文章 :: 454 評論 :: 0 Trackbacks
公告
我的隨筆
我的評論
我參與的隨筆
留言簿
(12)
給我留言
查看公開留言
查看私人留言
隨筆分類
(502)
1. C/C++(166)
(rss)
2. 網游開發(108)
(rss)
3. Golang(20)
(rss)
4. Linux/Unix(30)
(rss)
5. 軟工與管理(44)
(rss)
6. Python(23)
(rss)
7. Erlang(18)
(rss)
8. Rust(16)
(rss)
9. 其它(77)
(rss)
隨筆檔案
(423)
2023年1月 (1)
2022年11月 (1)
2022年10月 (2)
2022年9月 (1)
2022年4月 (6)
2022年1月 (2)
2021年12月 (4)
2021年11月 (6)
2021年10月 (2)
2021年9月 (2)
2021年8月 (7)
2021年7月 (2)
2021年5月 (2)
2021年3月 (1)
2021年2月 (2)
2021年1月 (1)
2020年12月 (1)
2020年10月 (1)
2020年9月 (5)
2020年8月 (1)
2020年7月 (1)
2020年6月 (1)
2020年4月 (2)
2020年3月 (3)
2020年2月 (3)
2020年1月 (1)
2019年12月 (1)
2019年9月 (2)
2019年4月 (2)
2019年1月 (1)
2018年12月 (1)
2018年11月 (3)
2018年10月 (1)
2018年9月 (3)
2018年8月 (3)
2018年7月 (2)
2018年6月 (4)
2018年5月 (4)
2018年4月 (4)
2018年3月 (1)
2018年1月 (2)
2017年12月 (2)
2017年11月 (3)
2017年10月 (3)
2017年8月 (7)
2017年7月 (1)
2017年6月 (1)
2017年5月 (3)
2017年4月 (3)
2017年3月 (3)
2017年2月 (2)
2017年1月 (2)
2016年12月 (5)
2016年11月 (2)
2016年10月 (2)
2016年9月 (1)
2016年8月 (6)
2016年7月 (3)
2016年6月 (2)
2016年5月 (4)
2016年4月 (2)
2016年3月 (2)
2016年1月 (3)
2015年12月 (2)
2015年11月 (2)
2015年10月 (1)
2015年8月 (2)
2015年7月 (1)
2015年6月 (1)
2015年5月 (4)
2015年4月 (3)
2015年3月 (4)
2015年2月 (5)
2015年1月 (4)
2014年12月 (3)
2014年11月 (3)
2014年10月 (2)
2014年9月 (3)
2014年8月 (1)
2014年4月 (4)
2014年3月 (1)
2014年2月 (4)
2014年1月 (5)
2013年12月 (5)
2013年11月 (5)
2013年9月 (2)
2013年8月 (2)
2013年7月 (2)
2013年6月 (2)
2013年5月 (1)
2013年1月 (2)
2012年12月 (1)
2012年11月 (1)
2012年9月 (1)
2012年8月 (3)
2012年7月 (2)
2012年6月 (1)
2012年4月 (3)
2012年3月 (2)
2012年2月 (3)
2012年1月 (2)
2011年11月 (2)
2011年10月 (3)
2011年9月 (2)
2011年8月 (2)
2011年7月 (3)
2011年6月 (2)
2011年5月 (3)
2011年1月 (2)
2010年12月 (1)
2010年11月 (2)
2010年10月 (2)
2010年9月 (3)
2010年8月 (2)
2010年7月 (3)
2010年6月 (1)
2010年5月 (3)
2010年4月 (3)
2010年3月 (5)
2010年2月 (4)
2010年1月 (4)
2009年12月 (2)
2009年11月 (3)
2009年10月 (4)
2009年9月 (3)
2009年8月 (2)
2009年7月 (4)
2009年6月 (1)
2009年5月 (3)
2009年4月 (4)
2009年3月 (2)
2009年2月 (5)
2009年1月 (1)
2008年12月 (7)
2008年11月 (4)
2008年10月 (1)
2008年9月 (3)
2008年8月 (4)
2008年7月 (3)
2008年6月 (4)
2008年5月 (6)
2008年4月 (7)
2008年3月 (6)
2008年1月 (5)
2007年12月 (7)
2007年11月 (4)
2007年10月 (5)
2007年9月 (6)
2007年8月 (8)
2007年7月 (5)
相冊
公告照片
搜索
積分與排名
積分 - 660016
排名 - 25
最新評論
1.?re: boost::asio::spawn 將一統C++網絡庫
asio 成為C++首選網絡庫
--linda
2.?re: log4cxx中文輸出錯誤補丁
評論內容較長,點擊標題查看
--金慶
3.?re: mingw編譯OrzNet
能發送一個mingw編譯好的OrzNet庫給我嗎? liuweiqcxy@163.com
謝謝!
--劉威
4.?re: log4cxx中文輸出錯誤補丁
評論內容較長,點擊標題查看
--bigbad
5.?re: log4cxx中文輸出錯誤補丁
評論內容較長,點擊標題查看
--bigbad
閱讀排行榜
1.?"multiple definition of" 錯誤(11061)
2.?SVN中邪惡的replace(10986)
3.?VS2005編譯libevent(10434)
4.?混音算法的學習與研究(10239)
5.?C調用lua腳本的效率測試(9020)
評論排行榜
1.?VC6正在被拋棄(35)
2.?VS2005編譯libevent(21)
3.?"multiple definition of" 錯誤(18)
4.?C++引用優于指針(17)
5.?ACE與ASIO之間關于Socket編程的比較(16)
自動刪除的定時器隊列
自動刪除的定時器隊列
(金慶的專欄)
網游服務器中使用定時器隊列代替角色遍歷可以提高性能,同時簡代邏輯。
游戲主循環中不必遍歷角色,只需觸發定時器動作。
主循環代碼如:
RootTimerQueue & rTimerQueue = Singleton<RootTimerQueue>();
do
{
UpdateTimeNow(); // update m_rNow
bool bTimerActed = rTimerQueue.TryToTickOne(m_rNow);
size_t nCount = HandleMessages();
if (0 == nCount)
{
if (m_bStopped) break;
if (bTimerActed) continue;
boost::this_thread::sleep(boost::posix_time::milliseconds(1));
}
} while (true);
定時器運行與主循環線程。
RootTimerQueue為根隊列,單件,各功能的定時器為RootTimerQueue的子隊列。
定時器隊列需要一個自動刪除功能。
如角色相關的一大堆定時器動作需要在角色退出時自動刪除。
不然定時器動作在角色不存在時或重新登錄后觸發,會造成錯誤。
如果采用角色臨時ID(會話ID), 每次登錄都不相同,
可以避免錯誤,定時器動作就成為一個空動作。
但是該動作一直存在于隊列中會占用內存,無法清除。
解決方案是每個角色擁有一個自己的定時器隊列,該隊列為根隊列的子隊列。
角色退出時,子隊列的刪除會自動刪除所有的定時器動作。
class TimerQueue : boost::noncopyable
{
public:
typedef boost::function<void ()> Action;
typedef UInt64 TimerId;
public:
TimerId Insert(time_t tStart, const Action & act, unsigned int nIntervalSec = 0);
void Erase(TiemrId id);
public:
void SetParent(TimerQueue * p);
public:
bool TryToTickOne(time_t tNow);
};
時間精度為秒,因為現在的應用只需秒即可,可以稍加改動替換成高精度時間。
定時器動作分為2類:
1. 只做一次,nIntervalSec為0表示只做一次。
2. 重復做,nIntervalSec非0.
添加定時器只有一個開始時間(有需要可以加個結束時間)。
開始時間可以是登錄前的一個時間點,這樣就可以計算離線期間所發生的改變。
通過SetParent()將自己設為某個隊列的子隊列。
實現部分如下:
class TimerQueue : boost::nonecopyable
{
private:
void TickOne();
void SetNextTime();
void EraseParentTimer();
private:
typedef UInt64 TimerSeq;
private:
struct TimerItem
{
time_t t;
TimerSeq seq;
Action act;
unsigned int nIntervalSec;
};
private:
void InsertItem(const TimerItem & itm);
TimerItem Pop();
private:
struct TimerOrder {};
typedef boost::multi_index::multi_index_container
<
TimerItem,
boost::multi_index::indexed_by
<
boost::multi_index::ordered_unique<
boost::multi_index::tag<TimerOrder>,
boost::multi_index::composite_key<
TimerItem,
boost::multi_index::member<TimerItem, time_t, &TimerItem::t>,
boost::multi_index::member<IimerItem, TimerSeq, &TimerItem::seq>
> // composite_key
>, // ordered_unique
boost::multi_index::hashed_unique<
boost::multi_index::tag<TimerId>,
boost::multi_index::member<TimerItem, TimerSeq, &TimerItem::seq>
> // hashed_unique
> // indexed_by
> TimerItemSet;
typedef TimerItemSet::index<TimerOrder>::type QueueByTime;
typedef TimerItemSet::index<TimerId>::type QueueById;
private:
TimerItemSet m_set;
private:
TimerSeq m_seq;
time_t m_tNext;
TimerQueue * m_pParent;
TimerId m_idParentTimer; // Used to erase timer from parent
};
TimerItemSet以時間和序號排序,允許時間相同,但序號是唯一的。
并且也能用ID號索引,用于刪除定時器。
TimerQueue.cpp
TimerQueue::TimerQueue()
: m_seq(0) // 0 is illegal
, m_pParent(NULL)
, m_idParentTimer(0)
{
SetNextTime();
}
TimerQueue::~TimerQueue()
{
EraseParentTimer();
}
TimerQueue::TimerId TimerQueue::Insert(
time_t tStart, const Action & act, unsigned int nIntervalSec)
{
TimerItem itm = {tStart, ++m_seq, act, nIntervalSec};
InsertItem(itm);
return itm.seq;
}
TimerQueue::Erase(TimerId id)
{
SetById & rSet = mset.get<TimerId>();
SetById::iterator itr = rSet.find(id);
if (itr == rSet.end())
return;
time_t t = (*itr).t;
TimerSeq seqErase = (*itr).seq; // Used to set next time.
TimerSeq seqFront = m_set.get<TimerOrder>().begin()->seq;
rSet.erase(itr);
if (seqErase == seqFront)
SetNextTime();
}
void TimerQueue::SetParent(TimerQueue * p)
{
EraseParentTimer()
m_pParent = p
SetNextTime();
}
bool TimerQueue::TryToTickOne(time_t tNow)
{
if (tNow < m_tNext)
return false;
if (m_set.empty())
return false;
TickOne();
return true;
}
void TimerQueue::TickOne()
{
BOOST_ASSERT(!m_set.empty());
TimerItem itm = Pop();
itm.act();
if (0 == itm.nIntervalSec)
return;
itm.t += itm.nIntervalSec;
InsertItem(itm);
}
TimerQueue::TimerItem TimerQueue::Pop()
{
BOOST_ASSERT(!m_set.empty());
QueueByTime & rQ = m_set.get<TimerOrder>();
QueueByTime::iterator itr = rQ.begin();
TimerItem itm = *itr;
rQ.erase(itr);
BOOST_ASSERT(itm.t == m_tNext);
SetNextTime();
return itm;
}
void TimerQueue::SetNextTime()
{
EraseParentTimer();
if (m_set.empty())
{
m_tNext = std::numeric_limits<time_t>::max();
return;
}
time_t tNew = (*m_set.get<TimeOrder>().begin()).t;
m_tNext = tNew;
if (NULL == m_pParent)
return;
m_idParentTimer = m_pParent->Insert(m_tNext,
boost::bind(&TimerQueue::TickOne, this));
BOOST_ASSERT(m_idParentTimer); // 0 is illegal ID.
}
void TimerQueue::EraseParentTimer()
{
if (m_pParent && m_idParentTimer)
m_pParent->Erase(m_idParentTimer);
m_idParentTimer = 0;
}
void TimerQueue::InsertItem(const TimerIten & itm)
{
m_set.insert(itm);
if (itm.t < m_tNext)
SetNextTiem();
}
RootTimerQueue是TimerQueue的子類。
另外再派生子類
class LogicTimerQueue : public TimerQueue
{
public:
LogicTimerQueue();
};
LogicTimerQueue::LogicTimerQueue()
{
SetParent(&Singleton<RootTimerQueue>());
}
這樣就讓每個LogicTimerQueue成為根隊列的子隊列。
玩家類中就可以添加LogicTimerQueue成員,來執行定時動作。
class Player
{
public:
Player()
{
...
// Check mail every hour.
m_timer->Insert(time(NULL),
boost::bind(&Player::CheckMail, this),
3600);
...
}
...
private:
LogicTimerQueue m_timer;
...
};
posted on 2012-06-20 13:28
金慶
閱讀(1148)
評論(2)
編輯
收藏
引用
所屬分類:
1. C/C++
、
2. 網游開發
評論
#
re: 自動刪除的定時器隊列
2012-11-14 09:08
zozoiiiiii
class Player
{
Player(){注冊定時器}
~Player(){注銷定時器}
}
利用構造函數和析構函數來保證角色退出時定時器的注冊和注銷,不很簡單么,干嘛要那么復雜
回復
更多評論
#
re: 自動刪除的定時器隊列
2012-11-14 19:23
金慶
@zozoiiiiii
沒錯,是在~Player()中注銷的。上面的代碼是如何注銷。假設某個Player注冊了上千個定時器,需要在~Player()中調用上千次注銷方法嗎?
回復
更多評論
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
相關文章:
How are dtLinks created in NavMesh
C++ parameter passing rules
Naming Conventions for Accessors
Visual Studio 2019 Compiler Hangs
Fbx File Format Identifier
查找內存錯誤
std::thread 中的異常會丟失調用棧
用賦值代替 protobuf CopyFrom()
vs2017 linux 編譯輸出改成 vs 格式
為 LiteIDE 添加選中標記
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
Powered by:
C++博客
Copyright © 金慶
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
美女精品一区
|
久久国产日本精品
|
欧美午夜剧场
|
欧美日韩国产丝袜另类
|
欧美午夜精品久久久久久浪潮
|
免费不卡欧美自拍视频
|
亚洲电影免费在线观看
|
91久久精品国产
|
洋洋av久久久久久久一区
|
欧美一区91
|
免费在线观看精品
|
亚洲国产婷婷
|
亚洲精品视频免费在线观看
|
一区二区三区视频免费在线观看
|
老司机凹凸av亚洲导航
|
亚洲电影免费观看高清
|
日韩亚洲欧美成人一区
|
亚洲欧美另类中文字幕
|
久久在线免费观看
|
欧美日韩人人澡狠狠躁视频
|
国产一区二区三区视频在线观看
|
国产精品美女久久久
|
在线观看日韩av电影
|
亚洲午夜久久久久久久久电影院
|
一本一本久久
|
久久久久网址
|
国产精品成人免费
|
亚洲国产一区二区三区青草影视
|
欧美aⅴ一区二区三区视频
|
国产精品扒开腿爽爽爽视频
|
亚洲国产99
|
久久国产婷婷国产香蕉
|
亚洲免费电影在线观看
|
免费av成人在线
|
国产亚洲欧美中文
|
亚洲影院在线
|
亚洲精品日韩激情在线电影
|
欧美aⅴ一区二区三区视频
|
国产伦精品一区二区三区视频孕妇
|
国产视频一区二区在线观看
|
一区二区三区日韩精品
|
免费观看30秒视频久久
|
亚洲欧美国内爽妇网
|
欧美日韩蜜桃
|
亚洲精选91
|
亚洲福利国产精品
|
久久青草久久
|
一区二区三区亚洲
|
久久精品一区二区三区不卡牛牛
|
一本一本久久a久久精品综合妖精
|
欧美成人精品
|
亚洲欧洲精品一区二区
|
欧美成人中文字幕
|
久久久久久久久蜜桃
|
一本高清dvd不卡在线观看
|
嫩草伊人久久精品少妇av杨幂
|
亚洲欧美另类在线
|
国产精品亚洲产品
|
亚洲欧美日韩国产综合精品二区
|
亚洲理论在线观看
|
欧美日韩调教
|
亚洲一区二区视频在线
|
日韩午夜在线电影
|
欧美视频一区二区三区四区
|
国产精品99久久久久久久女警
|
国产欧美一区二区精品仙草咪
|
亚洲自拍偷拍福利
|
亚洲女人天堂av
|
国产亚洲综合在线
|
欧美a级一区二区
|
久久综合电影一区
|
亚洲精品一区二区在线观看
|
99pao成人国产永久免费视频
|
欧美视频免费看
|
性欧美videos另类喷潮
|
午夜精品久久久久久99热软件
|
国产性天天综合网
|
美女脱光内衣内裤视频久久网站
|
麻豆精品传媒视频
|
亚洲午夜一区二区
|
亚洲欧美综合国产精品一区
|
国产在线观看一区
|
欧美国产视频日韩
|
国产精品av免费在线观看
|
在线视频欧美精品
|
国产亚洲欧美另类中文
|
欧美激情亚洲精品
|
国产精品不卡在线
|
老司机亚洲精品
|
欧美日韩精品不卡
|
欧美一区二区视频免费观看
|
久久夜色精品国产噜噜av
|
在线视频精品一区
|
久久精品国产欧美激情
|
一区二区三区回区在观看免费视频
|
亚洲一区二区成人
|
亚洲欧洲一级
|
午夜精品av
|
亚洲视频网在线直播
|
久久狠狠久久综合桃花
|
亚洲视频精选
|
欧美成年人视频网站
|
久久久xxx
|
欧美四级在线
|
亚洲国语精品自产拍在线观看
|
国产一区在线视频
|
在线综合视频
|
亚洲青色在线
|
久久久国产午夜精品
|
欧美一区二区啪啪
|
欧美国产日韩亚洲一区
|
久热精品在线视频
|
午夜在线观看欧美
|
欧美日韩亚洲不卡
|
亚洲福利在线看
|
狠狠色狠狠色综合日日91app
|
亚洲一区二区三区四区五区黄
|
亚洲靠逼com
|
免费在线成人
|
男人的天堂亚洲
|
狠狠色狠狠色综合人人
|
午夜精品视频在线观看
|
国产精品99久久久久久有的能看
|
欧美成人一品
|
亚洲国产精品一区二区www
|
伊人成人在线
|
久久久久久久久综合
|
久久嫩草精品久久久精品
|
国产精品一区二区你懂得
|
日韩一区二区精品视频
|
一本久久青青
|
欧美日韩国产成人在线观看
|
亚洲欧洲一区二区天堂久久
|
亚洲在线国产日韩欧美
|
欧美精品日韩三级
|
亚洲国产精品嫩草影院
|
亚洲激情在线观看视频免费
|
免费看成人av
|
亚洲级视频在线观看免费1级
|
亚洲蜜桃精久久久久久久
|
欧美大片在线影院
|
亚洲全黄一级网站
|
在线亚洲电影
|
国产精品女主播一区二区三区
|
中文国产亚洲喷潮
|
欧美一区二区三区喷汁尤物
|
国产香蕉久久精品综合网
|
久久国产精品久久w女人spa
|
老鸭窝亚洲一区二区三区
|
亚洲高清不卡
|
欧美激情第六页
|
在线亚洲激情
|
久久婷婷影院
|
日韩视频免费观看
|
国产精品久久久久久久9999
|
国产精品xnxxcom
|
亚洲欧美日韩国产综合在线
|
亚洲一区二区三区高清不卡
|
久久精品国产91精品亚洲
|
激情久久影院
|
欧美女主播在线
|
午夜精彩视频在线观看不卡
|
欧美成人亚洲成人日韩成人
|
一区二区欧美日韩
|
国产欧美韩日
|
欧美成人精品一区二区
|
亚洲性人人天天夜夜摸
|
美女主播一区
|
亚洲综合视频在线
|
狠狠久久亚洲欧美
|
欧美日韩国产在线一区
|
性久久久久久久久
|
亚洲国产精品久久久久婷婷老年
|
午夜精品久久久久久久
|
亚洲高清电影
|
国产精品无码永久免费888
|
狼狼综合久久久久综合网
|
欧美久久99
|
欧美一级片一区
|
亚洲人成在线免费观看
|
久久久久一区
|
亚洲资源在线观看
|
亚洲国产色一区
|
国产日韩欧美在线播放
|
欧美激情一区二区三区在线视频观看
|
欧美一区观看
|
亚洲伦理久久
|
精品不卡在线
|
国产麻豆午夜三级精品
|
欧美精品尤物在线
|
久久精品一区二区
|
亚洲一区二区免费在线
|
亚洲免费精品
|
亚洲大胆视频
|
蜜臀久久99精品久久久久久9
|
欧美综合国产精品久久丁香
|
亚洲欧美韩国
|
亚洲性视频网址
|
这里只有精品视频在线
|
亚洲美女av网站
|