kvm虛擬機圖形性能的優化

GraphicsImage destination字段指向當前Graphics對象的目標繪製區域。

當目標區域爲屏幕時,該字段爲空,否則指向一個Image的子類MutableImage類型的對象。

無論目標繪製區域是屏幕或者是緩衝區,都是用SCREEN_INFO保存其信息。不同的是wndID,屏幕時wndID指向的是一個窗體,否則是一個pixmap

 

目前對於設置GraphicssetColorsetClipsetFont等接口只是將相關屬性保存在Graphics對象當中,並沒有對繪圖目標區域SCREEN_INFO中對應的gc進行設定,而是當調用drawLinedrawChars等具體操作時,調用GRAPHICS_SETUP(FALSE)gc的剪切區和線條等屬性進行設置,有一些如顏色屬性在調用LCDUIdrawLine等接口時設定,字體是在LCDUIdrawChars中進行設定的。

由於每個目標設備都有自己的gc,其實設定Graphics繪圖屬性時,可以直接設置相應CREEN_INFO中的gcID進行設置,從而避免每次繪圖操作時,都需要設置gc

根據上述方法優化後的sun的kvm虛擬機,jbeanchmark的測試成績提升了200%以上。看來圖形還是最消耗資源的。

 

Graphics.rgbColor

// 用來替代myBitmapStruct,表示屏幕信息或者一個緩衝區

typedef struct screen_info {

    struct _gvt *vtable;     // 對應的基本圖形繪製函數表

    int prop;    // 表示是否有alpha混合,mask等信息

    int width;

    int aligned_width;     // image的寬度數值是爲偶數的,類似填充位

    int height;

    //int cl, ct, cr, cb;// 取消於20070628,使用底層microwindow剪切區

    // 該繪圖區域中的gc,其實只有屏幕和MutableImage對象時,gc纔有效

    GR_GC_ID  gcID;  

    GR_WINDOW_ID  wndID; // Image對象對應得pixmapid或者屏幕窗體id

    GR_REGION_ID regionID;// 用來設置對應的剪切區

    // unsigned char *alpha;    // alpha混合時所用的數據

    int strokeStyle;   // 所畫線條的類型

    int mutable;    // 窗體id對應的區域是否是可變的。

    // alpha 通道,當SCREEN_INFO表示屏幕或者沒有alpha通道的圖像時

    // alphaChannel的值等於0

    int alphaChannel ;

 

       /* 原系統只使用一個全局變量,在多線程情況下可能會出現問題,

    * 其實該font並沒有什麼用處,每次進行繪圖操作時,

    * 將獲取Graphics對象當中font

    */

       LOG_FONT font;

} SCREEN_INFO;   // screenInfo包含窗體id和大部分得gc信息。

 

 


當要載入一副圖片時,先調用Image.createImage接口將其載入一個Image的子類ImmutableImage類型的對象當中。

然後再調用Graphics.drawImage方法將其繪製到屏幕或者另一個繪圖緩衝區(MutableImage類型的對象)當中。

 

發佈了24 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章