以前開發了RichEdit控件,如今回顧總結一下。服務器
Rich text format格式(一般縮寫爲RTF)是一種專有的文檔文件格式,是1987年Microsoft對文件跨平臺交換開發發佈的規範,詳情參考維基百科Rich text format(http://en.wikipedia.org/wiki/Rich_Text_Format),該格式支持在文檔中顯示多種類型的文本對象。該格式文檔以帶有轉義序列的純文本形式存儲和交換。編輯器
遊戲UI庫中的richtext通常包含帶顏色效果文本,圖片,表情,超連接等文本對象,存儲及解析時也以指定轉義字符表示相關類型對象。如:測試
struct RichtextObj{orm
int m_iType;對象
...遊戲
};圖片
struct RichttextText : public RichtextObj{ip
RichtextText() { m_iType = RT_TEXT; }開發
...文檔
};
struct RichtextImage : public RichtextObj{
RichtextImage() { m_iType = RT_IMAGE; }
};
...
每種對象類型在構建和繪製時須要按照類型處理。所以richtext渲染內容的內部存儲結構初始應該定爲這些對象的組合。如:
class Richtext{
std::vector<RichtextObj*> m_vObjList;
};
另外遊戲聊天窗口內容刷新頻率會很是高,極端狀況下不能將服務器內全部玩家輸入的內容都在控件中一直保存顯示,所以須要richtext對顯示內容進行裁剪,支持內容滾動顯示。設置控件的最大顯示行數,若是內容超過了最大行數,須要已fifo的方式釋放掉前面的行。爲了方便刪除添加每行內容,以便於知足顯示範圍,richtext的渲染內容須要按照行,行再包含對象的方式進行存儲。所以richtext的結構應該調整爲
struct RichtextLine{
std::vector<RichtextObj*> m_vObjList;
};
class Richtext{
std::vector<RichtextLine*> m_vLineList;
};
內容刷新時,刪除前面超出的行,添入新的行能夠知足該控件在聊天窗口的運行效率要求。控件顯示內容裁剪後,對控件進行拉伸引發的效率問題也會較好的解決。在Intel i7 2600 主頻3.4GHz的環境下作以下測試:聊天窗口richtext設置最大顯示行數爲100行,每0.1秒對其添加輸入內容,內容包括三個中英文字符串和一個超連接中間穿插兩個表情,一共110個字節左右。刷新的過程當中水平方向伸縮行寬度,每次伸縮刷新渲染存儲結構。渲染存儲結構每次添加輸入內容耗時5微秒左右,100行填滿時,每次拉伸刷新渲染存儲結構耗時800微秒左右。
因爲在Richtext最大顯示行數值較大時,總體刷新渲染存儲結構比較耗時,所以要注意不要直接響應Windows拖拽消息來調用控件的刷新,這裏對比了VisualStudio和editplus編輯器的作法,VisualStudio是在OnButtonUp時纔會真正刷新顯示內容結構;而editplus編輯器在水平方向拖拽時直接顯示出一個滑動條,行寬度不改變,不對顯示內容結構進行刷新。遊戲中能夠經過使用按鈕縮放或限制拖拽最短刷新消時間來避免顯示內容結構刷新過於頻繁。
控件結構
光標
繪製
效率