D3DImage e SharpDX tremeluzem em hardware lento
Estou usando o projeto SharpDX.WPF para as habilidades do WPF, parece uma biblioteca fácil de entender, comparada ao Toolkit que acompanha o SharpDX (que tem o mesmo problema!)
Primeiro: eu corrigi o projeto SharpDX.WPF para o SharpDX mais recente usando o seguinte:https://stackoverflow.com/a/19791534/442833
Fiz o seguinte ajuste hacky ao DXElement.cs, uma solução que também foi feitaaqui:
private Query queryForCompletion;
public void Render()
{
if (Renderer == null || IsInDesignMode)
return;
var test = Renderer as D3D11;
if (queryForCompletion == null)
{
queryForCompletion = new Query(test.Device,
new QueryDescription {Type = QueryType.Event, Flags = QueryFlags.None});
}
Renderer.Render(GetDrawEventArgs());
Surface.Lock();
test.Device.ImmediateContext.End(queryForCompletion);
// wait until drawing completes
Bool completed;
var counter = 0;
while (!(test.Device.ImmediateContext.GetData(queryForCompletion, out completed)
&& completed))
{
Console.WriteLine("Yielding..." + ++counter);
Thread.Yield();
}
//Surface.Invalidate();
Surface.AddDirtyRect(new Int32Rect(0, 0, Surface.PixelWidth, Surface.PixelHeight));
Surface.Unlock();
}
Então, renderizo 8000 cubos em um padrão de cubo ...
Produzindo...
é impresso no console com bastante frequência, mas a cintilação ainda está lá. Estou assumindo que o WPF é bom o suficiente para mostrar a imagem usando um thread diferente antes da renderização, embora não tenha certeza ... Esse mesmo problema também ocorre quando eu uso a variante Toolkit do suporte ao WPF com o SharpDX.
Imagens para demonstrar o problema:
RuimMelhorQuasePretendidoNota: Alterna aleatoriamente entre essas imagens antigas, aleatoriamente. Também estou usando um hardware muito antigo, que torna a oscilação muito mais aparente (GeForce Quadro FX 1700)
A fez um repo que contém exatamente o mesmo código-fonte que estou usando para obter esse problema:https://github.com/ManIkWeet/FlickeringIssue/