skynet 對客戶端廣播的方案

jopen 9年前發布 | 12K 次閱讀 skynet

這是去年在 skynet mailling list 里討論過的一個話題: skyent中socket中使用共享指針的方式是否有價值? ,今天 review 代碼的時候又看到,覺得應該在 blog 記錄一下。

簡單說就是,當從 skynet 向外部發送相同內容的數據包時,雖然依舊需要一個個包的發送(除非在局域網做 UDP 組播),但在某些特定需求下,復制多份相同的數據包 buffer 是個不必要的開銷。

尤其是在上面的帖子中提到的音視頻廣播的場合,幾乎所有的業務都是在向 IO 寫同樣的數據。所以當時我在考慮后,給 skynet 的 socket 層增加了一個接口,供用戶定義共享 buffer ,可以自己在待發送 buffer 對象中自己增加引用計數。

考慮到接口向前兼容,這個用戶自定義 buffer 對象的方法要求用戶在調用 socket send 時,將 size 設置為 -1 ,以便和 raw 指針區分。

https://github.com/cloudwu/skynet/blob/master/skynet-src/socket_server.h#L56-L63

這樣,通過從 C 層面的定制,用戶就可以自己實現共享指針了。skynet 的 socket 層會正確的從共享對象里取得指針、取得數據塊的大小、以及在使用完畢后釋放它。

我沒有給出更多的用法范例、也沒有給出 lua 封裝接口,所以這個 C 接口只提供給了解自己的需求,希望做深度定制的同學去擴展。

如果日后做 MOBA 類游戲,需要大量同步場景中相同的狀態信息,或許我會再做一些封裝。當然,即使這類場合,我覺得多復制幾遍數據,也未必會造成性能問題。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!