我正在尝试从 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/