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();
}
Es wird zwar Hardwarebeschleunigung verwendet, die GPU wird jedoch viel weniger verwendet, da keine Zeichnung in den sichtbaren Bereich erfolgt. Die GPU-Nutzung hängt von der Kartenleistung ab. Wenn Sie dies also im High-End-Bereich versuchen, wird die GPU nur sehr wenig genutzt. Wenn Sie dies am unteren Ende versuchen (mit genügend CPU-Leistung), steigt die Nutzung auf magische Weise.
Die GPU-Nutzung zeigt Ihnen also an, ob acc aktiviert ist. Wenn RenderTargetType die Standardeinstellung ist, wird die Beschleunigung verwendet, sofern dies unterstützt wird. Wenn Sie Hardware einstellen, wird diese verwendet oder es tritt ein Fehler auf.
Wenn Sie Direct3D nicht verwenden, sollten Sie BitmapRenderTarget und d2dbitmap als Off-Screen-Puffer verwenden. Es ist schneller.
quelle