2015-03-08 2 views
1

Я пытаюсь получить текстуру MonoGame из растрового изображения FreeType (SharpFont).Почему это происходит? (Ошибка 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

«кажется очень неэффективным и хакерским» на самом деле не является объективной мерой. Насколько эффективно это нужно делать? У вас действительно есть реальная проблема с тем, сколько времени требуется для выполнения операции? Нужно что-то измерять? Не совсем понятно, что вы просите. – craftworkgames

+0

Это больше, что мне интересно, почему это происходит, хотя я делаю то же самое, что и Bitmap.ToGdipBitmap. –

ответ

1

Disclosure Я автор SharpFont.

FTBitmap.ToGdipBitmap был написан с представлением о производительности. PInvokeHelper.Copy выполняет копирование по указателям на каждый байт, что должно быть выполнено только в Buffer.BlockCopy, но для этого требуется, чтобы источник и получатель были массивами, когда оба в настоящее время просто указывают на неуправляемую память. Другие методы копирования в C#, такие как Marshal.Copy, по-прежнему требуют, чтобы одна сторона была массивом.

Ваша реализация включает как минимум в два раза больше копирования памяти (Bitmap.BufferData делает Marshal.Copy), а также подчеркивает GC путем выделения большого количества небольших массивов.

Бит, на котором вы фокусируетесь, выглядит прекрасным, я бы сказал, что это ширина вашего glyphTexture, которая меньше, чем FTBitmap's pitch, но эта часть кода не была отправлена, поэтому я не могу быть полностью уверен без дополнительной информации.

+0

Ошибка на самом деле была ошибкой в ​​Bitmap.BufferData, 'rec.rows * rec.width' должен был быть' rec.rows * rec.pitch', но я вижу, что он исправлен. –

+0

ах хорошо ... думаю, это то, что я получаю за попытку ответить на старый вопрос, глядя на текущий код: P –

Смежные вопросы