2016-01-31 6 views
1

В данной ситуации:
- Карта 32x32-плитка собирается рисоваться в моногейме с C#.
- Каждая текстура имеет 64x64 пикселей.
- Существует только один вид текстуры (например, один .png-файл), повторяющийся снова и снова, чтобы заполнить карту.
- Каждая плитка и объект из класса Tile.cs

Пример 1:
Создание статического/абстрактный класс, содержащий одну текстуру, которая должна быть нарисованы, так что каждая плитка объект может использовать это при рисовании.
Рисование плиточных карт monogame performance

public void Draw(){ 
     //Texture.GrassTexture is from the static class 
     tile.Draw(Textures.GrassTexture); 
    } 

Пример 2:
Другой подход будет либо установить текстурную-переменную для каждого фрагмента при создании нового объекта из него.

Texture2D tileTexture; 
    public Tile(Texture texture){ 
     tileTexture = texture; 
    } 

При рисовании плитки можно использовать переменную tileTexture.

Пример 3:
Отправка текстуры в качестве параметра для каждой плитки при рисовании плитки.

public void Draw(Texture2D texture){ 
     tile.draw(texture) 
    } 


С точки зрения Performace, что из примеров будет лучшая практика? Любые другие идеи приветствуются!


Код изготовлен для этого сообщения.

ответ

2

От рендеринг Перспектива перспективы важно, что вы не используете много разных текстур во время одной ничьей карты.

В моем опыте переключение текстур часто наносит ущерб производительности. Итак, вас действительно интересует сохранение всех плиток для вашей карты на одной текстуре (это часто называют атласом текстуры ).

MonoGame не поставляется с поддержкой текстурного атласа из коробки. Однако вы можете взглянуть на то, как мы реализовали его в MonoGame.Extended.

Основная идея заключается в реализации класса для представления области текстуры , которая представляет собой единую черепицу из вашей многослойной текстуры.

public class TextureRegion2D 
{ 
    public TextureRegion2D(string name, Texture2D texture, int x, int y, int width, int height) 
    { 
     if (texture == null) throw new ArgumentNullException("texture"); 

     Name = name; 
     Texture = texture; 
     X = x; 
     Y = y; 
     Width = width; 
     Height = height; 
    } 

    public string Name { get; private set; } 
    public Texture2D Texture { get; protected set; } 
    public int X { get; private set; } 
    public int Y { get; private set; } 
    public int Width { get; private set; } 
    public int Height { get; private set; } 

    public Rectangle Bounds 
    { 
     get { return new Rectangle(X, Y, Width, Height); } 
    } 
} 

Затем, когда вы предоставляете плитки использовать перегрузку спрайтов партии, которая принимает исходный прямоугольник а.

var sourceRectangle = textureRegion.Bounds; 
spriteBatch.Draw(textureRegion.Texture, position, sourceRectangle, color); 

Конечно, для этого все хорошо работает, требуется еще несколько шагов.

  1. Вам необходимо упаковать плитки на одну текстуру. Вы можете сделать это вручную или использовать такой инструмент, как TexturePacker.
  2. Вам понадобится способ загрузки плиток в области текстуры. Если плитки упакованы в простой шаблон сетки, этот код довольно тривиален для записи вручную.Если вы использовали упаковщик текстур, вам нужно будет написать импортера.

И наконец, если вы уже используете Tiled Map Editor для создания карты вы можете быть заинтересованы, чтобы знать, что MonoGame.Extended уже имеет поддержку для загрузки и рендеринга их.

+0

Спасибо! Если я объединю все свои интенсивные текстуры плитки с атласом, я предполагаю, что ContentManager будет загружать текстуру только в любом случае? Если нет, не будет ли это тяжело обрабатывать, так как в моей игре чаще всего более 100 фрагментов на экране. Мой класс плитки очень похож на тот, который описывается здесь. – user2858578

+0

Да, менеджер контента загружает только каждую текстуру один раз, но если у вас есть все ваши плитки в виде отдельных текстур, он будет загружать графический процессор при рендеринге, потому что ему нужно будет переключаться текстуры каждый раз, когда он создает другую плитку. – craftworkgames

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

  • Нет связанных вопросов^_^