直接寫屏和特殊系統事件

2021-04-22 08:37:05 字數 1071 閱讀 3787

遊戲軟體一般用cdirectscreenaccess進行直接寫屏。大家都知道,windowserver會在需要停止直接寫屏時**mdirectscreenaccess::abortnow介面函式,在可以重新啟動時**mdirectscreenaccess::restart介面函式。可是具體在這兩個函式中做什麼,sdk沒有過多的介紹。我在此說一下我的做法。如果你合理的處理了這兩個函式,就可以輕鬆應對來電、屏保、程式切換等事件。

我們先說abortnow,它的處理比較簡單。你之需在其中停止驅動遊戲邏輯的計時器(一般是個cperiodic物件),停止聲音模組(一般是乙個cactive任務)就可以了。

值得費些力氣的是restart函式,它並不是在應用程式回到前台,並且可以進行全屏直接寫屏時才被**。所以不能在此時武斷的恢復遊戲邏輯,開始遊戲。

首先,你要呼叫cdirectscreenaccess::startl( )恢復直接寫屏。但是必須給這個函式加上trap保護。因為它很可能丟擲kerrnotready異常。如果遇到這個異常,那你就直接返回好了,因為直接寫屏此時並不能開始。接下來你需要檢查一下繪圖區域,看是否整個螢幕都可以被使用。如果不是,那也無需啟動遊戲邏輯,只需要用最後保留的後台緩衝區的內容更新直接寫屏區域即可。第三種情況,如果直接寫屏成功啟動,並且整個螢幕都可以被繪製,才啟動遊戲邏輯,啟動聲音等其它模組。

完整的**如下:

void cengine::abortnow(rdirectscreenaccess::tterminationreasons /*areason*/)

ipaused = etrue;

} void cengine::restart(rdirectscreenaccess::tterminationreasons /*areason*/)

return;

default:

user::panic(_l("setup dsa error"), error);

}if(ipaused)

}else

}else}}

void cengine::setupdirectscreenaccessl()

void cengine::pauseframe()

};

直接通過framebuffer直接寫屏

幀緩衝 framebuffer 是 linux 為顯示裝置提供的乙個介面,把視訊記憶體抽象後的一種裝置,他允許上層應用程式在圖形模式下直接對顯示緩衝區進行讀寫操作。這種操作是抽象的,統一的。使用者不必 關心物理視訊記憶體的位置 換頁機制等等具體細節。這些都是由framebuffer 裝置驅動來完成的...

RGB24資料直接寫屏

int iwidth,iheight,ibyteswidth iwidth 500 iheight 500 float dtemp 960 ibyteswidth iwidth 4 iwidth 4 1 4 iwidth handle hmem globalalloc gmem moveable,i...

WinCE5 0中應用程式如何直接寫屏

以deviceemulator為例,我們已經知道framebuffer的實體地址是0x30100000,大小為0x100000。那麼在應用程式中可以通過如下 直接獲取操作framebuffer的機會。1char gplcdbuf 2gplcdbuf char virtualalloc null,0x...