我正在Windows上试验WritableBitmapEx。我创建了一个简单的例子,一个简单的盒子上下移动。
有一个绘图函数,它重新绘制每个框的矩形:
int y = 0;
int dy = 15;
public void draw()
{
y += dy;
if (y > 500 || y < 0)
dy = -dy;
writeableBmp.Clear(System.Windows.Media.Colors.Black);
writeableBmp.FillRectangle(0, y, 100, y + 100, System.Windows.Media.Colors.Green);
}和Loaded事件,它创建可写位图,并在每个帧上调用draw()。
WriteableBitmap writeableBmp;
private async void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
writeableBmp = BitmapFactory.New((int)ContentPanel.ActualWidth, (int)ContentPanel.ActualHeight);
image.Source = writeableBmp;
writeableBmp.GetBitmapContext();
CompositionTarget.Rendering += CompositionTarget_Rendering;
}
private void CompositionTarget_Rendering(object sender, EventArgs e)
{
draw();
}但这给我的~30 not最多,所以动画是不顺利的。
我知道在xaml中创建这样的动画有一些更好的方法(例如创建一个矩形对象并使用xaml动画动画),但是有一个游戏(用另一种语言)以这种方式重新绘制每个帧,我的最终目标是将该代码移植到Windows。因此,找到一种足够快的重绘方法可以使的移植变得更容易,也更容易。
那么,有什么方法可以提高这方面的性能吗?或者是否有更好的方法手动绘制每个帧,但足够快(60 fast )?
发布于 2016-01-26 00:51:38
尝试一下微软的Win2D。您可以在这里使用NuGet或他们的GitHub获得它:微软Win2D GitHub。它基本上是Direct2D上的一个包装器,使用起来非常简单。
特性(从:https://github.com/Microsoft/Win2D/wiki/Features复制)
易于使用的Windows ·可从.NET和C++获得 ·支持Windows 10、Windows 8.1和Windows Phone 8.1 基于GPU加速的即时二维图形绘制 ·作为Direct2D、DirectImage和DirectWrite之上的一个层实现 ·基础类型的互操作,因此可以将Win2D与本机D2D混合和匹配 位图图形 ·加载、保存和绘制位图图像 ·渲染到纹理 ·使用位图作为不透明掩码 ·Sprite批处理API,用于高效绘制大量位图 ·使用块压缩位图格式来节省内存 ·加载、保存和绘制虚拟位图,它们可以大于最大GPU纹理大小,并自动分割成块 矢量图形 绘制原始形状(线条、矩形、圆圈等)或任意复几何 ·使用实色、图像笔刷或直线和径向梯度填充形状 ·用灵活的笔画方式(虚线、虚线等)绘制任意宽度的线条。 ·高质量的抗混叠 丰富的几何操作(联合、相交、路径上的计算点、卫星等) *任意几何区域的剪贴画 在命令列表中捕获绘图操作,供以后重放 ·将墨水笔画(从手写笔)拉近 强大的图像处理效果 ·模糊 ·共混 ·颜色调整(亮度、对比度、曝光、高光和阴影等) ·过滤器(旋转、边缘检测、浮雕、锐化) ·照明 ·自定义像素着色器 还有更多..。 文本 ·完全国际化的Unicode文本呈现 ·文本布局可以绘制、测量或命中测试。 ·将文本轮廓转换为几何图形 ·枚举字体并查询它们的指标 ·绘制或操作单个字形运行以创建自定义文本布局 UI集成 ·XAML CanvasControl使起床和运行变得更容易 ·还可以创建高级的东西,比如所有者-绘制XAML控件 ·XAML CanvasAnimatedControl提供更新/绘制游戏循环编程模型 ·XAML CanvasVirtualControl用于绘制到非常大的虚拟曲面 ·绘制到Windows.UI.Composition绘图表面和交换链上 ·还可以直接绘制到CoreWindow ·印刷
发布于 2016-01-28 08:08:06
感谢鱼龙软件,他建议微软Win2D。
我要解释一下我在我的案子里做了些什么。
在CanvasAnimatedControl中有一个名为Win2D的控件,它是为此目的而专门设计的。
从NuGet获取包并将其添加到页面后,您可以使用两个事件Draw和Update。
Update表示逻辑,而Draw是渲染框架的地方。
这是问题中描述的移动矩形的代码:
private void Page_Loaded(object sender, RoutedEventArgs e)
{
cvs.Update += Cvs_Update;
cvs.Draw += Cvs_Draw;
}
int y = 0;
int dy = 15;
private void Cvs_Draw(Microsoft.Graphics.Canvas.UI.Xaml.ICanvasAnimatedControl sender, Microsoft.Graphics.Canvas.UI.Xaml.CanvasAnimatedDrawEventArgs args)
{
args.DrawingSession.Clear(Windows.UI.Colors.Blue);
args.DrawingSession.FillRectangle(new Rect(0, y, 100, 100), Windows.UI.Colors.Green);
}
private void Cvs_Update(Microsoft.Graphics.Canvas.UI.Xaml.ICanvasAnimatedControl sender, Microsoft.Graphics.Canvas.UI.Xaml.CanvasAnimatedUpdateEventArgs args)
{
y += dy;
if (y > 500 || y < 0)
dy = -dy;
}这段代码在我的手机上运行得很好(~60 This )。
唯一的缺点是,Win2D支持Windows 8.1及更高版本。因此,通过使用这个库,您将失去Windows 8的兼容性。
https://stackoverflow.com/questions/34983803
复制相似问题