Flash在DirectX中的繪製

這裏使用的是以前我說過的OLE控件在Direct3D中的渲染方法, 本身不進行swf的解析, 這不現實.編程

  • 前提條件: COM編程, OLE編程, DirectX編程, ActionScript/Flash(可選).
    • 建立一個ShockwaveFlashObjects::IShockwaveFlash的對象
    • 實現一個IOleClientSite來作爲IShockwaveFlash的容器
  • 繪製
    • 經過OleDraw來把GDI的像素數據繪製到DC上(IShockwaveFlash是一個IViewObject)
    • 把DC的像素數據拷貝到D3D的Texture上. 中間涉及像素格式的內存操做, 須要明白圖像數據的內存格式.
    • 半透明支持(可選): 若是不須要半透明支持的話, 其實能夠直接OleDraw到Texture的DC上, 不用再多一次拷貝. 可是有時候不得不用(像UI), 能夠這參考Transparent Flash Control in plain C++, 用黑色背景和白色背景繪製兩次, 比較兩次結果 的Red通道計算出相應的Alpha值.
    • 髒矩形優化: 若是每幀都進行整個紋理的更新, 你會發現CPU佔用率至關高. 實際上ActiveX自己是有這個優化的, 只不過咱們須要本身找出這個矩形. 經過實現IOleInPlaceSiteWindowless::InvalidateRect能夠獲得相應的"髒"矩形區域, 而後只須要更新相應的紋理區域就能夠讓效率達到商用的標準.
  • 事件響應
    • 幸運的是, IShockwaveFlash是一個IOleInPlaceObjectWindowless對象, 那麼咱們就能夠直接使用IOleInPlaceObjectWindowless::OnWindowMessage進行消息的處理. 注意鼠標座標的轉換和鍵盤輸入焦點的控制.
  • 腳本交互, 參考MFC的思路:
    • C++調用AS: IShockwaveFlash::CallFunction/SetVariable
    • AS調用C++: 須要實現ShockwaveFlashObjects::_IShockwaveFlashEvents, 能夠監聽fscommand和ExternalInterface.call兩種調用方式.

關於具體實現, 已經有人先於我完成了, 因此請直接參考Hikari. 接下來再把IE搞定less

來源 http://blog.csdn.net/xoyojank/article/details/5698191 優化

相關文章
相關標籤/搜索