为什么会这样? (SharpFont / Monogame错误)

时间:2015-03-08 01:36:33

标签: c# arrays monogame freetype

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

如果我使用Bitmap.ToGdipBitmap,它可以正常工作,但这似乎非常低效和黑客。当我尝试自己转换它时,我得到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

他们俩都做的基本相同吗?

1 个答案:

答案 0 :(得分:1)

披露我是SharpFont的作者。

FTBitmap.ToGdipBitmap的编写考虑了性能。 PInvokeHelper.Copy对指针执行每字节复制,这应该只在性能上超过Buffer.BlockCopy,但是当两者当前只是指向非托管内存的指针时,这要求源和目标都是数组。 C#中的其他复制方法如Marshal.Copy仍需要一面作为数组。

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

您关注的内容看起来不错,我说它的glyphTexture的宽度比FTBitmap的pitch > dput(bmi.cig) structure(list(MSI.subset.BMI = structure(c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 1L, 2L, 3L, 3L, 1L, 3L, 3L, 1L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), .Label = c("0", "1", "2", "NA"), class = "factor"), MSI.subset.Cigarette = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("1", "2", "NA"), class = "factor")), .Names = c("MSI.subset.BMI", "MSI.subset.Cigarette"), row.names = c(NA, 30L), class = "data.frame") > head(bmi.cig) MSI.subset.BMI MSI.subset.Cigarette 1 NA NA 2 NA NA 3 NA NA 4 NA NA 5 NA NA 6 NA NA {1}},但是这部分代码没有发布,所以我无法在没有更多信息的情况下完全确定。