實(shí)現(xiàn)的目的是為了在一些特定情況下不去使用boost的filter_streambuf,不使用boost::iostreams的理由如下:
1、基于運(yùn)行時(shí)配置的過(guò)濾器,效率稍低
2、對(duì)于網(wǎng)絡(luò)通訊而言,boost的filter_streambuf乃至整個(gè)iostreams庫(kù)都顯得較為臃腫。
所以,我自己編寫(xiě)了一套filter_streambuf,繼承了std::streambuf,并配合自己重新設(shè)計(jì)的archive和batch_data進(jìn)行網(wǎng)絡(luò)通訊,無(wú)論是效率還是易用性上都超出使用boost的iostreams。而boost的那套東西經(jīng)過(guò)我的反復(fù)使用后,覺(jué)得更適合用在文件讀寫(xiě)和數(shù)據(jù)持久化上。
如果要說(shuō)哪里不如boost的filter_stream,也就是boost的filter_streambuf可以動(dòng)態(tài)配置filter,而我使用的是模板技術(shù)將filter的關(guān)系在編譯期就關(guān)聯(lián)了起來(lái),所以只能是靜態(tài)配置filter。下面是具體使用時(shí)的完整例子代碼:
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 // 輸出過(guò)濾
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 // 輸入過(guò)濾
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 // 輸出內(nèi)存設(shè)備
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 // 輸入內(nèi)存設(shè)備
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 }
代碼中的意思就是將寫(xiě)入的數(shù)據(jù)逐字節(jié)的加1,并保存在內(nèi)存緩沖里,然后又從內(nèi)存緩沖中讀出,逐字節(jié)減1,并輸出到控制臺(tái),一套經(jīng)過(guò)過(guò)濾的讀寫(xiě)流便完成了。由于使用了模板元的list作為鏈接,在release模式下所有的過(guò)濾器操作都是內(nèi)聯(lián)的,這雖然也是我預(yù)想的效果,但看完匯編碼之后,著實(shí)讓我高興了一晚上,這種成就感真的是programer最大的樂(lè)趣。
需要說(shuō)明的是:代碼中的mpl::list2是自己實(shí)現(xiàn)的模板元鏈表...過(guò)段時(shí)間考慮研究一下boost的并替換過(guò)來(lái),因?yàn)槟莻€(gè)list后面的2讓我覺(jué)得很不夠智能...當(dāng)然,如果boost的list實(shí)現(xiàn)過(guò)于復(fù)雜,或是不能讓我的代碼完全內(nèi)聯(lián)化的話,肯定不會(huì)考慮使用。
完成這個(gè)之后,我便準(zhǔn)備著手構(gòu)建cge項(xiàng)目,所謂的cge,就是cloud game engine的縮寫(xiě)...顧名思義就是使用了云技術(shù)的游戲引擎,我想在業(yè)余時(shí)間嘗試一些顛覆傳統(tǒng)cs架構(gòu)的在線游戲引擎架構(gòu)設(shè)計(jì),具體難點(diǎn)估計(jì)會(huì)有2個(gè):
1、運(yùn)用gpgpu group的并行運(yùn)算技術(shù),考慮使用目前市場(chǎng)占用率最大的nvidia tesla服務(wù)器配合cuda,在服務(wù)器用physX實(shí)現(xiàn)一定的物理模擬。
2、在即時(shí)性較強(qiáng)的在線游戲中,ping值一直是最大的挑戰(zhàn),所以有選擇性的使用云計(jì)算技術(shù),這是架構(gòu)設(shè)計(jì)上的挑戰(zhàn)。
關(guān)于cge的設(shè)計(jì)思考和規(guī)劃,會(huì)另外開(kāi)貼具體闡述,并記錄開(kāi)發(fā)進(jìn)度和情況。