Estou tentando usar o direct2d para renderizar imagens fora da tela usando o WindowsAPICodePack . Isso é facilmente alcançado usando o WicBitmapRenderTarget, mas infelizmente não é acelerado por hardware.
Então, eu estou tentando esta rota:
- Criar dispositivo direct3d
- Criar texture2d
- Use a superfície da textura para criar um destino de renderização usando CreateDxgiSurfaceRenderTarget
- Desenhe algumas formas
Enquanto isso renderiza a imagem, parece que a GPU não está sendo usada, enquanto a CPU é muito usada.
Estou fazendo algo errado? Existe uma maneira de verificar se a renderização de hardware ou software é usada?
Exemplo de código:
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();
}
Ele usa aceleração de hardware, mas a GPU é usada muito menos porque não há desenho na área visível. O uso da GPU depende do desempenho das placas; portanto, se você tentar isso com recursos avançados, haverá muito pouco uso da GPU. Quando você tenta isso em um nível baixo (com energia suficiente da CPU), o uso aumenta magicamente.
Portanto, o uso da GPU informa se o acesso está ativado. Se RenderTargetType for o padrão, a aceleração será usada se houver suporte. Se você configurar o hardware, ele será usado ou ocorrerá um erro.
De qualquer forma, se você não estiver usando o Direct3D, use BitmapRenderTarget e d2dbitmap como um buffer fora da tela. É mais rápido.
fonte