ET伺服器框架學習筆記(五)

2021-10-10 13:40:54 字數 4498 閱讀 4438

二、使用方式總結

檢視原始碼又發現乙個資料結構,用於記錄管理sorteddictionary這種型別的資料,其中可學習的地方在於,有個**與重複使用的list池子,這種以記憶體換效能的方式,在et裡面比較常見。

// 重用list

private

readonly queue

> queue =

newqueue

>()

;

private

readonly dictionary<

long

, timer> timers =

newdictionary

<

long

,timer

>()

;///

/// key: time, value: timer id

///

private

readonly multimap<

long

,long

> timeid =

newmultimap

<

long

,long

>()

;private

readonly queue<

long

> timeouttime =

newqueue

<

long

>()

;private

readonly queue<

long

> timeouttimerids =

newqueue

<

long

>()

;

上面是timercomponent主要使用的資料結構。

foreach

(keyvaluepair<

long

, list<

long

>

> kv in

this

.timeid.

getdictionary()

)this

.timeouttime.

enqueue

(k);

}while

(this

.timeouttime.count >0)

this

.timeid.

remove

(time);}

while

(this

.timeouttimerids.count >0)

this

.timers.

remove

(timerid)

; timer.tcs.

setresult()

;}

主要使用的時間戳方式,來判定是否要呼叫,timercomponent提供了幾種呼叫方式:

public

ettask

waittillasync

(long tilltime,

cancellationtoken cancellationtoken)

;this

.timers[timer.id]

= timer;

this

.timeid.

add(timer.time, timer.id);if

(timer.time <

this

.mintime)

cancellationtoken.

register((

)=>);

return tcs.task;

}public

ettask

waittillasync

(long tilltime)

;this

.timers[timer.id]

= timer;

this

.timeid.

add(timer.time, timer.id);if

(timer.time <

this

.mintime)

return tcs.task;

}public

ettask

waitasync

(long time,

cancellationtoken cancellationtoken)

;this

.timers[timer.id]

= timer;

this

.timeid.

add(timer.time, timer.id);if

(timer.time <

this

.mintime)

cancellationtoken.

register((

)=>);

return tcs.task;

}public

ettask

waitasync

(long time)

;this

.timers[timer.id]

= timer;

this

.timeid.

add(timer.time, timer.id);if

(timer.time <

this

.mintime)

return tcs.task;

}}

依次為:

-waittillasync(long tilltime, cancellationtoken cancellationtoken):帶取消非同步的,傳入時間戳的定時功能,非同步取消時,會自動呼叫remove清理掉timer

cancellationtoken.

register((

)=>

);

this.mintime,每次增加乙個時間戳定時器,比較這個值,獲取到距離當前時間最近的一次時間戳。這樣在update的時候,沒到最近的時間戳,則直接return,提公升效能。

如果到了這個時間戳,則取出對應的time結構,呼叫裡面的tcs.setresult,中間通過幾次queue的操作,來提公升效能,而不是直接在list或者字典中操作,這樣也能提公升效能。queue由於底層的資料結構,所以很適合做這種取出,壓入的操作。

foreach

(keyvaluepair<

long

, list<

long

>

> kv in

this

.timeid.

getdictionary()

)this

.timeouttime.

enqueue

(k);

}while

(this

.timeouttime.count >0)

this

.timeid.

remove

(time);}

while

(this

.timeouttimerids.count >0)

this

.timers.

remove

(timerid)

; timer.tcs.

setresult()

;}

**如下(示例):

// 等待0.5s再傳送

long instanceid = self.instanceid;

await timercomponent.instance.

waitasync

(500);

if(self.instanceid != instanceid)")

;}self.actorid =

await game.scene.

getcomponent

<

locationproxycomponent

>()

.get

(self.id)

;return

await self.

runinner

(iactorrequest)

;

邏輯:

if

(self.instanceid != instanceid)")

;}self.actorid =

await game.scene.

getcomponent

<

locationproxycomponent

>()

.get

(self.id)

;return

await self.

runinner

(iactorrequest)

;

會在呼叫這個函式後的500毫秒後才會完成,由於是非同步方式,所以不會阻塞呼叫者的執行緒,讓他去做其他事情。

ET伺服器框架學習筆記(十五)

三 locationcomponent 四 locationproxycomponent 總結前面好幾篇都是關於通訊協議的,本篇將對上篇說的actor鎖來個梳理,避免自己以後懵逼。協程鎖元件 game.scene.addcomponent coroutinelockcomponent locatio...

ET框架 服務端 Program學習筆記

在寫服務端之前,我是先看的客戶端 而et框架,服務端和客戶端的 很多都是共用的,這也是et方便的一點。所以,如果你是直接來看服務端的,希望你對客戶端的 已經有了足夠的了解,之前在客戶端講過的 我會一筆帶過。這裡是客戶端 學習筆記的入口。通過landlordscore 學習et框架。非同步方法全部會回...

clamd伺服器 學習筆記

實現病毒掃瞄功能的後台程序,它使用socket通訊 訊號同步 執行緒池 後台程序等典型技術。標準c庫提供了對命令列引數進行分析的函式 include int getopt int argc,char const argv const char optstring argc和argv 是main函式的...