none
【Direct2D】ID2D1Bitmapへのメモリ直接Read,Write RRS feed

  • 質問

  • Direct2Dに関して質問があります。

    ID2D1Bitmapに対して、Lock(),Unlock()的な手法によってメモリ領域を直接Read,Write
    するような方法はないのでしょうか?

    Writeに関してはID2D1Bitmap::CopyFromMemory()を使用する方法もありますが、必ず
    コピーが発生してしまい効率がよくありません。

    IWICBitmapにはLock(),Unlock()があるんですが・・・。

    DirectDraw時代にはLock,UnlockによりSurfaceのメモリに対する自由なRead,Writeが
    できたんですが、これと同様の事をDirect2Dでも実現したいと考えております。

    ID2D1RenderTargetに対してもメモリRead,Writeできても良いと思うのですが、こちらも
    ご存知の方が居られればご教授いただけたらと思います。
    2010年1月15日 15:17

回答

  • 以下より抜粋です。

    [Improving the Performance of Direct2D Applications]
      http://msdn.microsoft.com/en-us/library/dd372260(VS.85).aspx
      Performanceを気にされているようですので、上記の内容を参考にされてはいかがでしょうか。
     
    ---
    [Copying Bitmaps]
      http://msdn.microsoft.com/en-us/library/dd372260(VS.85).aspx#copyingbitmaps

      to improve cache locality,
      the hardware does not actually store a bitmap in the same memory order that the bitmap is addressed.

      Due to constraints on how data is written into a render target when rendering,
      render targets are typically either not swizzled,
      or swizzled in a way that is less optimal than can be achieved
      if you know that you never have to render to the surface.

      Therefore, the CopyFrom* methods are provided for copying rectangles from a source to the Direct2D bitmap.

      CopyFrom can be used in any of its three forms:

      CopyFromBitmap
      CopyFromRenderTarget
      CopyFromMemory
    ---

    Italicの文章から、Lock()/Unlock()は無理ですね。

    • 編集済み kozz 2010年1月16日 2:05 typo
    • 回答としてマーク にわか.NET 2010年1月17日 2:50
    2010年1月16日 2:01

すべての返信

  • 以下より抜粋です。

    [Improving the Performance of Direct2D Applications]
      http://msdn.microsoft.com/en-us/library/dd372260(VS.85).aspx
      Performanceを気にされているようですので、上記の内容を参考にされてはいかがでしょうか。
     
    ---
    [Copying Bitmaps]
      http://msdn.microsoft.com/en-us/library/dd372260(VS.85).aspx#copyingbitmaps

      to improve cache locality,
      the hardware does not actually store a bitmap in the same memory order that the bitmap is addressed.

      Due to constraints on how data is written into a render target when rendering,
      render targets are typically either not swizzled,
      or swizzled in a way that is less optimal than can be achieved
      if you know that you never have to render to the surface.

      Therefore, the CopyFrom* methods are provided for copying rectangles from a source to the Direct2D bitmap.

      CopyFrom can be used in any of its three forms:

      CopyFromBitmap
      CopyFromRenderTarget
      CopyFromMemory
    ---

    Italicの文章から、Lock()/Unlock()は無理ですね。

    • 編集済み kozz 2010年1月16日 2:05 typo
    • 回答としてマーク にわか.NET 2010年1月17日 2:50
    2010年1月16日 2:01
  • kozzさん、情報ありがとうございました。

    ご提示のドキュメントには目を通していたのですが、読み落としていました。
    ご指摘のとおり、確かに無理そうですね。

    DirectDrawでやっていたことをそのままDirect2Dにベースに置き換えるのは
    結構難しそうです。

    大変参考になりました。ありがとうございました。

    2010年1月17日 2:50