我在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;非常感谢。