這段時間在公司做一款游戲服務器開發,開發過程中的一點體會記錄下來,日後也是一點經驗
1.定時刷新機制,服務器中,要有不斷定時刷新的措施,比如任務系統
2.線程的管理和調度,一般使用線程池方案
3.內存方面,為了提高性能,通常使用內存池,而不是頻繁地動態分配內存
4.數據包的設計,通常為 頭部+數據包體 的方式,接受數據包時,先接受包頭,然後根據包頭描述的大小接收剩下的數據;
數據包的內存表現上,為了節省空間,通常將數據按二進制形式串行化(或者說序列化)到Buffer中再發送。
Google的protobuf是個很好的工具,雖然在此次項目中沒有用到,以後可能會考慮使用。
5.隊列的運用,服務器中一般是多線程處理,隊列的思想能夠讓邏輯變得清晰,服務器中經常用到,比如數據包隊列。其實在Windows平台下,完成端口IOCP也是運用了隊列 的思想
6.避免競爭,將一個Socket或者連接的處理都放在一個線程中,不要讓多個線程同時處理同一個socket
7.日志系統,日志系統也可以運用線程和隊列思想,可以考慮用跨平台的日志庫,Log4cplus(Log4cxx),一款功能強大的開源C++日志庫
8.異步回調思想的運用,服務器中有時要處理的結果比不是馬上能夠獲取到會發生阻塞,比如數據庫的查詢等,此時可以運用異步回調的方式提高性能
9.超時檢測,有時候由於網絡原因,客戶端已經斷線了,但服務器可能會很久都沒收到信號,因此,定時的超時檢測是很有必要的。
10.狀態機的運用,比如用戶狀態機,狀態機的運用能夠使得邏輯更清晰
11.設計模式運用,用的比較多比如單例模式,觀察者模式