Ich versuche, mit direct2d Bilder mit WindowsAPICodePack außerhalb des Bildschirms zu rendern . Dies ist mit WicBitmapRenderTarget leicht zu erreichen, aber leider nicht hardwarebeschleunigt.
Also versuche ich diese Route:
- Erstellen Sie ein direct3d-Gerät
- Erstellen Sie die Textur2d
- Verwenden Sie die Texturoberfläche , um ein Renderziel mit CreateDxgiSurfaceRenderTarget zu erstellen
- Zeichne einige Formen
Während dies das Image rendert, scheint es, dass die GPU überhaupt nicht verwendet wird, während die CPU stark ausgelastet ist.
Mache ich etwas falsch? Gibt es eine Möglichkeit zu überprüfen, ob Hardware- oder Software-Rendering verwendet wird?
Codebeispiel:
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();
}