c# - 如何在 WriteableBitmap 上写文本?
问题描述
现在我正在编写一个游戏,我需要在 WriteableBitmap 上绘制文本;如何在不从 WritableBitmap 转换为 Bitmap 再到 WriteableBitmap 的情况下做到这一点?我已经在寻找解决方案,但它们都会减慢我的游戏速度,或者需要 Silverlight 之类的东西才能工作。
像这样的东西:
public class ResourceCounter : UIElement
{
public ResourceCounter()
{
RenderBounds = new Bound(new Point(0, 0),
new Point(600, 30));
}
private string goldAmt;
private string woodAmt;
private string stoneAmt;
public override void Tick()
{
goldAmt = GlobalResources.Gold.ToString();
woodAmt = GlobalResources.Wood.ToString();
stoneAmt = GlobalResources.Stone.ToString();
}
public override void Draw(WriteableBitmap bitmap)
{
bitmap.FillRectangle(RenderBounds.A.X,
Renderbounds.A.Y,
Renderbounds.B.X,
Renderbounds.B.Y,
Colors.DarkSlateGray);
bitmap.DrawString("text", other parameters...");
}
}
解决方案
您可以在 Bitmap 和 BitmapSource 之间共享像素缓冲区
var writeableBm1 = new WriteableBitmap(200, 100, 96, 96,
System.Windows.Media.PixelFormats.Bgr24, null);
var w = writeableBm1.PixelWidth;
var h = writeableBm1.PixelHeight;
var stride = writeableBm1.BackBufferStride;
var pixelPtr = writeableBm1.BackBuffer;
// this is fast, changes to one object pixels will now be mirrored to the other
var bm2 = new System.Drawing.Bitmap(
w, h, stride, System.Drawing.Imaging.PixelFormat.Format24bppRgb, pixelPtr);
writeableBm1.Lock();
// you might wanna use this in combination with Lock / Unlock, AddDirtyRect, Freeze
// before you write to the shared Ptr
using (var g = System.Drawing.Graphics.FromImage(bm2))
{
g.DrawString("MyText", new Font("Tahoma", 14), System.Drawing.Brushes.White, 0, 0);
}
writeableBm1.AddDirtyRect(new Int32Rect(0, 0, 200, 100));
writeableBm1.Unlock();
推荐阅读
- javascript - JQ 事件在按 datatable.js 的提取行排序上没有激活
- css - 在不改变大小的情况下创建一侧边框在引导网格中
- mongodb - Mongo - 保存文档时出错:1 在写入数据库时不是主要的
- android - 本地通知实现
- javascript - 找不到 TypeScript 自定义定义文件
- asp.net - Asp.net mvc 5 身份 smtp 连接
- c++ - 如何在 if 语句中放入二维字符串数组?
- c# - 多线程挂起UI?
- reactjs - 创建 React App (不弹出) & ANTD Design & SCSS & Create App Rewired config
- c# - Roslyn - 如果添加了尾随琐事,则 SyntaxNode “消失”