Ответ 1
Нет
Похоже, что нет недостатка
На самом деле вы, похоже, следуете стандартным подходам к текстовому рендерингу.
Рендеринг текста "правильно" сравнительно медленный, по сравнению с рендерингом текстурированного квадрата, даже если SpriteFonts вырезает все сплайсирующие глифы, если вы создаете страницу с текстом, тогда вы все равно можете разбивать большое количество треугольников.
Всякий раз, когда я рассматриваю различные решения для визуализации текста для GL/XNA, люди склонны рекомендовать ваш подход. Нарисуйте свою стену текста один раз на многократно используемую текстуру, затем отрисуйте эту текстуру.
Вы также можете рассмотреть RenderTarget2D как возможное решение, которое переносится.
В качестве примера:
// Render the new text on the texture
LoadPageText(int pageNum) {
string[] text = this.book[pageNum];
GraphicsDevice.SetRenderTarget(pageTarget);
// TODO: draw page background
this.spriteBatchCache.Begin();
for (int i = 0; i < text.Length; i++) {
this.spriteBatchCache.DrawText(this.font,
new Vector2(10, 10 + this.fontHeight * i),
text[i],
this.color);
}
this.spriteBatchCache.End();
GraphicsDevice.SetRenderTarget(null);
}
Затем в рендеринг сцены вы можете spriteBatch.Draw(..., pageTarget, ...)
визуализировать текст.
Таким образом вам понадобится только 1 текстура для всех ваших страниц, просто запомните также перерисовать, если ваш шрифт изменится.
Другими вещами, которые следует учитывать, является режим сортировки SpriteBatches, иногда это может повлиять на производительность при рендеринге многих треугольников.
В пункте 2, как я уже упоминал выше, SpriteFonts представляют собой предварительно обработанные текстуры, это означает, что прозрачность выпекается на их спрайте. По существу, библиотека по умолчанию не использует прозрачность/сглаживание.
Если вы сделали их в два раза большими и белыми на черном и использовали SourceColor в качестве альфа-канала, тогда они отображали их уменьшенное смещение с помощью Color.Black, вы могли бы вернуть его.