實現的目的是為了在一些特定情況下不去使用boost的filter_streambuf,不使用boost::iostreams的理由如下:
1、基于運行時配置的過濾器,效率稍低
2、對于網絡通訊而言,boost的filter_streambuf乃至整個iostreams庫都顯得較為臃腫。
所以,我自己編寫了一套filter_streambuf,繼承了std::streambuf,并配合自己重新設計的archive和batch_data進行網絡通訊,無論是效率還是易用性上都超出使用boost的iostreams。而boost的那套東西經過我的反復使用后,覺得更適合用在文件讀寫和數據持久化上。
如果要說哪里不如boost的filter_stream,也就是boost的filter_streambuf可以動態配置filter,而我使用的是模板技術將filter的關系在編譯期就關聯了起來,所以只能是靜態配置filter。下面是具體使用時的完整例子代碼:
1 #include <ccs/util/ios/ifilter_streambuf.hpp>
2 #include <ccs/util/ios/ofilter_streambuf.hpp>
3 #include <ccs/util/ios/memory_terminal.hpp>
4
5 using namespace ccs;
6 using namespace util;
7
8 // 輸出過濾
9 struct my_ofilter
10 {
11 typedef ios::ofilter_tag tag_type;
12
13 template<typename OutT>
14 std::streamsize write(const char* p, std::streamsize n, OutT& _out)
15 {
16 std::streamsize i = 0;
17 for (; i < n; ++i)
18 {
19 char c = p[i];
20 if (_out.write(&++c, 1) != 1)
21 break;
22 }
23 return i;
24 }
25 };
26
27 // 輸入過濾
28 struct my_ifilter
29 {
30 typedef ios::ifilter_tag tag_type;
31
32 template<typename InT>
33 std::streamsize read(char* p, std::streamsize n, InT& _in)
34 {
35 std::streamsize i = 0;
36 for (; i < n; ++i)
37 {
38 char c;
39 if (_in.read(&c, 1) != 1)
40 break;
41 p[i] = --c;
42 }
43 return i;
44 }
45 };
46
47 // 輸出內存設備
48 struct memory_odevice
49 {
50 typedef ios::dest_tag tag_type;
51
52 std::streamsize write(const char* p, std::streamsize n, ios::memory_oterminal& _out)
53 {
54 return _out.write(p, n);
55 }
56 };
57
58 // 輸入內存設備
59 struct memory_idevice
60 {
61 typedef ios::source_tag tag_type;
62
63 std::streamsize read(char* p, std::streamsize n, ios::memory_iterminal& _in)
64 {
65 return _in.read(p, n);
66 }
67 };
68
69
70 int main(int _Argc, char** _Args)
71 {
72 char buf[256];
73 ios::memory_oterminal memout(buf, 256);
74 ios::memory_iterminal memin(buf, 256);
75 ios::ifilter_streambuf<ios::memory_iterminal, mpl::list2<my_ifilter, memory_idevice> > insbuf(&memin);
76 ios::ofilter_streambuf<ios::memory_oterminal, mpl::list2<my_ofilter, memory_odevice> > outsbuf(&memout);
77 std::istream is(&insbuf);
78 std::ostream os(&outsbuf);
79
80 int num = 188;
81 os.write((char*)&num, sizeof(int));
82 os.flush();
83 is.read((char*)&num, sizeof(int));
84
85 std::cout << num << std::endl;
86 system("pause");
87 }
代碼中的意思就是將寫入的數據逐字節的加1,并保存在內存緩沖里,然后又從內存緩沖中讀出,逐字節減1,并輸出到控制臺,一套經過過濾的讀寫流便完成了。由于使用了模板元的list作為鏈接,在release模式下所有的過濾器操作都是內聯的,這雖然也是我預想的效果,但看完匯編碼之后,著實讓我高興了一晚上,這種成就感真的是programer最大的樂趣。
需要說明的是:代碼中的mpl::list2是自己實現的模板元鏈表...過段時間考慮研究一下boost的并替換過來,因為那個list后面的2讓我覺得很不夠智能...當然,如果boost的list實現過于復雜,或是不能讓我的代碼完全內聯化的話,肯定不會考慮使用。
完成這個之后,我便準備著手構建cge項目,所謂的cge,就是cloud game engine的縮寫...顧名思義就是使用了云技術的游戲引擎,我想在業余時間嘗試一些顛覆傳統cs架構的在線游戲引擎架構設計,具體難點估計會有2個:
1、運用gpgpu group的并行運算技術,考慮使用目前市場占用率最大的nvidia tesla服務器配合cuda,在服務器用physX實現一定的物理模擬。
2、在即時性較強的在線游戲中,ping值一直是最大的挑戰,所以有選擇性的使用云計算技術,這是架構設計上的挑戰。
關于cge的設計思考和規劃,會另外開貼具體闡述,并記錄開發進度和情況。