私はdirect2dを使用して、WindowsAPICodePackを使用して画像を画面外にレンダリングしようとしています。これは、WicBitmapRenderTargetを使用して簡単に実現できますが、残念ながらハードウェアアクセラレーションではありません。
だから私はこのルートを試しています:
- direct3dデバイスを作成する
- texture2dを作成する
- テクスチャサーフェスを使用して、CreateDxgiSurfaceRenderTargetを使用してレンダーターゲットを作成します。
- いくつかの形を描く
これにより画像がレンダリングされますが、CPUの使用率が高い間はGPUがまったく使用されていないように見えます。
私は何か間違ったことをしていますか?ハードウェアまたはソフトウェアのレンダリングが使用されているかどうかを確認する方法はありますか?
コードサンプル:
var device = D3DDevice1.CreateDevice1(null,
DriverType.Hardware,
null,
CreateDeviceOptions.SupportBgra,
FeatureLevel.Ten
);
var txd = new Texture2DDescription();
txd.Width = 256;
txd.Height = 256;
txd.MipLevels = 1;
txd.ArraySize = 1;
txd.Format = Format.B8G8R8A8UNorm; //DXGI_FORMAT_R32G32B32A32_FLOAT;
txd.SampleDescription = new SampleDescription(1,0);
txd.Usage = Usage.Default;
txd.BindingOptions = BindingOptions.RenderTarget | BindingOptions.ShaderResource;
txd.MiscellaneousResourceOptions = MiscellaneousResourceOptions.None;
txd.CpuAccessOptions = CpuAccessOptions.None;
var tx = device.CreateTexture2D(txd);
var srfc = tx.GraphicsSurface;
var d2dFactory = D2DFactory.CreateFactory();
var renderTargetProperties = new RenderTargetProperties
{
PixelFormat = new PixelFormat(Format.Unknown, AlphaMode.Premultiplied),
DpiX = 96,
DpiY = 96,
RenderTargetType = RenderTargetType.Default,
};
using(var renderTarget = d2dFactory.CreateGraphicsSurfaceRenderTarget(srfc, renderTargetProperties))
{
renderTarget.BeginDraw();
var clearColor = new ColorF(1f,1f,1f,1f);
renderTarget.Clear(clearColor);
using (var strokeBrush = renderTarget.CreateSolidColorBrush(new ColorF(0.2f,0.2f,0.2f,1f)))
{
for (var i = 0; i < 100000; i++)
{
renderTarget.DrawEllipse(new Ellipse(new Point2F(i, i), 10, 10), strokeBrush, 2);
}
}
var hr = renderTarget.EndDraw();
}