原创 SIGPIPE導致程序無故中止

最近在開發新項目,使用的是舊的代碼,因此要進行一些代碼的刪減和優化。在win下開發時,一切正常,但在Linux下,發現其中一個模塊在啓動時會偶發性無緣無故中止,沒有異常日誌,沒有core dump,內核那邊也沒有異常,進程直接就消失了。 我

原创 Lua 5.3 hashint函數缺陷導致遍歷table性能非常差

最近發現線上有個服務器某些邏輯耗時比較久,問了下同事,他告訴我是因爲lua的pairs函數很慢導致的。 “啊!不至於吧,這數據量纔多少”我一臉詫異,記憶中Lua不至於慢到這種程度,遍歷個幾十萬的table速度還是很快的,而我們線上的這個ta

原创 Socket緩衝區過小觸發TCP Nagle's algorithm算法導致網絡延遲大

在遊戲服務器當中,通常都會爲每個客戶端鏈接設置一個緩衝區。這樣做的理由是遊戲中通常會有持續不斷,零碎的數據包發送到客戶端,使用一個緩衝區可以把這些數據包攢到一起發送,避免頻繁的io操作;另一個原因是,處理遊戲邏輯的線程通常和io操作的線程是

原创 C++ STL chrono和clock_gettime的性能對比

#include <iostream> #include <chrono> #include <ctime> int main() { const int ts = 1000000; std::chrono::steady_cloc

原创 Program terminated with signal 4, Illegal instruction

一個已進入維護狀態多年的項目最近我做了一些優化,沒想到更新出去後程序直接起不來了,core dump的文件顯示程序因爲Program terminated with signal 4, Illegal instruction.直接掛掉。第一

原创 C++使用mutable在const成員函數中加鎖

業務邏輯寫多了,有些基礎的東西就忘了,寫在這裏僅僅是做個筆記。 最近要把自己的程序改成多線程,其中有一個緩衝區類,大概是這樣的: class Buffer { public: /** * 獲取當前緩衝區中已分配的chunk數量及總內存

原创 解決CentOS 6.10安裝VirtualBox增強插件報redefinition of set_nlink錯誤

CentOS 6早已退休,沒人維護了,但最近需要測試一個很老的服務器程序,要跑在CentOS 6上,那就在VirtualBox虛擬機上裝一個吧。由於測試環境是不能上網的,因此我特意下載了一個CentOS-6.10-x86_64-bin-DV

原创 C++中atomic和mutex的對比

最近在優化自己以前寫的一個程序,其中io部分由單線程的Reactor模型改成多線程的Proactor模型。即原來是異步io事件喚醒線程,進行io讀寫,現在是一個線程進行異步io讀寫,然後把數據交給另一個線程進行邏輯處理。那這就涉及到一個線程

原创 win下添加Notepad3右鍵菜單

自己經常用Notepad3編輯器,每次重裝系統後總得查一番資料,這裏記錄一下 Notepad3下載地址 https://github.com/rizonesoft/Notepad3/releases 或者 https://www.rizon

原创 遊戲服務器AOI的實現

在一個場景裏,怪物A攻擊了玩家B,玩家B掉了5血量。玩家B反擊,怪物A掉了10血量。玩家C在旁邊觀看了這一過程,而在遠處的玩家D對這一過程毫無所知。這是MMO遊戲中很常見的一情景,從程序邏輯的角度來看,把它拆分成以下幾部分 怪物A感知玩

原创 IPv6與IPv4的兼容

IPv6出來已經很多年,雖然距離普及還很遠,但項目裏要加上,有沒有人用是一碼事,但不加上肯定過不了審。IPv6最大的問題是包格式與IPv4不兼容 IPv4包格式 0 1

原创 OpenSSL證書認證過程

遊戲服務端這塊,之前是很少用SSL的,畢竟遊戲裏的數據沒有什麼保密的必要,登錄、充值也是傳輸簽名,不涉及密碼什麼的。不過這幾年,HTTPS普及得比較快,H5遊戲發展迅速。H5遊戲是基於web的,和後端通信一般走websocket,加不加SS

原创 Lua os.clock在win和linux下的差異

最近在做一些框架的優化工作,其中一個就是完善測試用例,在進行http模塊測試的時候,我注意到輸出的時間有異常 [T1LP10-20 19:25:09]http(s) test [T1LP10-20 19:25:19][ OK] http

原创 Lua大整數的實現

大整數 程序中基礎的數據類型,如double、int64_t之類的,其大小都是有上限的,假如有一個數10000000000...(後面接10000個0),那麼現在的數據類型是表示不了的,這時候就需要可以無限增長的整數,即大整數。作爲一個遊戲

原创 std::allocator在stl容器中使用問題

std::allocator常用於stl中的各種容器。對應的,stl的容器中也提供了相應的內存分配器參數。當需要統計內存的使用或者自定義內存分配時,十分有用。以std::vector爲例: // std=c++11 // https://w