我试图从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
他们俩都做的基本相同吗?
答案 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}},但是这部分代码没有发布,所以我无法在没有更多信息的情况下完全确定。