将字节数组传递给PixelShaderEffect

时间:2018-05-22 20:28:13

标签: c# uwp win2d

我在C#/ UWP / Win2D应用程序中基于非标准像素格式从文件中快速制作动画图像。图像之间存在相关性(想想flipbook动画),但没有任何程序化。

我编写了一个原型,并在下面附上相关代码。 "怀特"和 "黑色"颜色最终将转换为颜色查找表(例如5 =白色)

....
//Create render target in function elsewhere
CanvasRenderTarget crt = new CanvasRenderTarget(Sender, FrameWidth, FrameHeight, defaultDpi);
GenerateNextFrame(crt);
....

private void GenerateNextFrame(CanvasRenderTarget frame)
{
    var frameSize = FrameHeight * FrameWidth * sizeof(ushort);
    var frameBytes = new byte[frameSize];
    var frameShorts = new ushort[FrameWidth * FrameHeight];
    var colors = new Color[FrameWidth * FrameHeight];
    var white = Colors.White;
    var black = Colors.Black;
    var comp = (ushort.MaxValue / 2);

    //read bytes from file
    FrameFileStream.AsStreamForRead().Read(frameBytes, 0, frameSize);
    //convert bytes to shorts
    System.Buffer.BlockCopy(frameBytes, 0, frameShorts, 0, frameSize);

    //convert shorts to colors
    for (var i = 0; i < colors.Length; i++)
    {
        colors[i] = (frameShorts[i] < comp) ? white : black;
    }
    //set colors on frame
    frame.SetPixelColors(colors);
}

性能很好~60FPS,FrameWidth / FrameHeight为512,但在1024时下降到~30FPS。任何大于此的表现都会更糟。

使用大数据进行分析表明,彩色数组循环和SetPixelColors调用是瓶颈。

我已经尝试了几种方法来加快速度(PLINQ,Parallel.ForEach,数据的预排队),但未能比上面的表格更快。

我认为处理此问题的正确方法是为CanvasRenderTarget创建一个新的受支持类型的DirectXPixelFormat,以便我可以使用SetPixelBytes。这似乎是不可能的。

下一个正确的选项似乎是编写一个接受frameBytes的PixelShaderEffect,以灰度创建像素,然后将其用作设置颜色的另一个效果的来源。

我无法找到任何创建IGraphicsEffectSource的示例。

任何建议,文档,或者最重要的是,工作&#34;这就是你将一个字节数组传递给PixelShaderEffect&#34;非常感谢。

0 个答案:

没有答案