c# - 为什么会发生这种情况? (SharpFont/Monogame 错误)

标签 c# arrays monogame freetype

我正在尝试从 FreeType (SharpFont) 位图获取 MonoGame 纹理。

如果我使用Bitmap.ToGdipBitmap,它工作得很好,但这似乎非常低效和hacky。当我尝试自己转换它时,我收到 System.ArgumentException (源数组不够长)。

Bitmap.ToGdipBitmap 的代码如下所示:

for (int i = 0; i < rec.rows; i++)
    PInvokeHelper.Copy(Buffer, i * rec.pitch, locked.Scan0, i * locked.Stride, rec.width);

我的代码如下所示:

byte[] data = fontFace.Glyph.Bitmap.BufferData;
for (int y = 0; y < (int)glyphTexture.Height; y++)
{
    byte[] row = new byte[(int)glyphTexture.Width];
    Array.Copy(data, y * fontFace.Glyph.Bitmap.Pitch, row, 0, row.Length);
    ...
}

主要关注这两个:

i * rec.pitch

y * fontFace.Glyph.Bitmap.Pitch

他们不会做基本上相同的事情吗?

最佳答案

披露我是 SharpFont 的作者。

FTBitmap.ToGdipBitmap 在编写时就考虑到了性能。 PInvokeHelper.Copy 对指针进行按字节复制,这在性能上只能被 Buffer.BlockCopy 击败,但这要求源和目标都为数组目前两者都只是指向非托管内存的指针。 C# 中的其他复制方法(例如 Marshal.Copy)仍然要求一侧是数组。

您的实现涉及至少两倍的内存复制(Bitmap.BufferData 执行 Marshal.Copy),并且还通过分配大量小数组来强调 GC。

您关注的部分看起来不错,我想说的是您的 glyphTexture 的宽度小于 FTBitmap 的 pitch,但是代码尚未发布,因此如果没有更多信息,我无法完全确定。

关于c# - 为什么会发生这种情况? (SharpFont/Monogame 错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28922159/

相关文章:

c# - 如何将8bit声音转换为16bit

c# - 在给定类更改的情况下,在序列化之间键入对象

c# - 如何在windows窗体中开发类似 "outlook 2007 send/receive progress"对话框的窗体?

c# - 在 ASP.NET Core 和 EF Core 中使用 MySQL 提供程序时出现 NotImplemented 异常

java - 创建未知类型的数组

xamarin - Xamarin Studio 中 Android 项目的 3D 建模

c# - Azure.消息.ServiceBus : should I remove ProcessMessageAsync handler from ServiceBusProcessor on disposing?

arrays - 将每个数字 a[i] 替换为其右侧的下一个更高的数字,

c++ - 在 bool 数组上使用二进制表达式的最快方法

c# - Windows Phone 8 MonoGame 初始化未被调用