отрісовка зображень
Дуже часто текстура малюється з відображенням на прямокутної геометрії. Так само дуже часто, багато разів робиться малювання однієї і тієї ж текстури або її різних регіонів. Було б не ефективно кожен раз пересилати по одному прямокутнику в графічний процесор для відтворення. Замість цього, безліч прямокутників однієї і теж текстури, можна описати і переслати всі разу в графічний процесор. Це те, що робиться SpriteBatch клас.
Клас SpriteBatch надає текстуру і координати для кожного малювання прямокутника. Він робить збір геометрії без передачі її в графічний процесор. Якщо він отримує текстуру відмінну від останньої, то він прив'язує останньою текстуру, передаючи зібрану геометрію для малювання, і починає збір геометрії для нової текстури.
Кожна зміна текстури при малюванні декількох прямокутників, призводить в тому, що SpriteBatch групує багато геометрії. Так само, прив'язка текстури є досить дорогою операцією. З цих причин, він зберігає багато маленьких зображень в одному великому зображенні і потім малює регіони з одного великого зображення для максимальної угруповання геометрії і запобігання частої зміни текстур. Для більшої інформації дивіться TexturePacker.
SpriteBatch
Використання SpriteBatch в додатку виглядає наступним чином:
Всі виклики малювання SpriteBatch повинні бути зроблені між begin () і end () методами. Малювання які не належать до SpriteBatch не може бути між begin () і end () методами.
Клас Texture декодує файл зображення і завантажує його в пам'ять графічного процесора. Файл зображення повинен розташовуватися в assets директорії, як описано в ручний настройки проекту. Розмір зображення повинен бути ступенем двох (16x16, 64x256 і так далі).
Створена текстура передається в SpriteBatch для відтворення. Текстура буде намальована в прямокутнику з позицією 10,10 і шириною і висотою різними розміром текстури. SpriteBatch має багато методів для відтворення текстур:
Методи і опис
draw (Texture texture, float x, float y)
Малює текстуру використовуючи ширину і висоту текстури.
draw (Texture texture, float x, float y, int srcX, int srcY, int srcWidth, int srcHeight)
Малює част текстури.
draw (Texture texture, float x, float y, float width, float height, int srcX, int srcY, int srcWidth, int srcHeight, boolean flipX, boolean flipY)
Малює частина текстури, розтягує до ширини width і висоти height. з можливістю перекидання.
draw (Texture texture, float x, float y, float originX, float originY, float width, float height, float scaleX, float scaleY, float rotation, int srcX, int srcY, int srcWidth, int srcHeight, boolean flipX, boolean flipY)
Цей метод малює частину текстури, розтягує до ширини width і висоти height. масштабує і обертає навколо оригіналу з можливістю перекидання.
draw (Texture texture, float x, float y, float width, float height, float u, float v, float u2, float v2)
Цей метод малює частину текстури, розтягує до ширини width і висоти height. Це кілька просунутий метод, так як він використовує текстурні координати від 0 до 1, замість координат пікселів.
draw (Texture texture, float [] spriteVertices, int offset, int length)
Це просунутий метод для передачі геометрії текстурних координат і колірної інформації. Цей метод можна використовувати для малювання будь-які чотирикутник, а не тільки прямокутники.
TextureRegion
Клас TextureRegion описує прямокутник всередині текстури і корисний при малюванні тільки частини текстури.
Тут 20, 20, 50, 50 описують частина текстури, яка замет малюється як 10,10. Теж саме може бути досягнуто шляхом передачі Texture і інших параметрів в SpriteBatch. але TextureRegion робить це зручніше, маючи тільки один об'єкт, який описує те й інше.
Клас SpriteBatch має багато методів для малювання регіонів текстури.
Методи і опис
draw (TextureRegion region, float x, float y)
Малює регіон використовуючи ширину і висоту регіону.
draw (TextureRegion region, float x, float y, float width, float height)
Малює регіон, розтягуючи до ширини width і висоти height.
draw (TextureRegion region, float x, float y, float originX, float originY, float width, float height, float scaleX, float scaleY, float rotation)
Малює регіон, розтягуючи до ширини width і висоти height. масштабує і обертає навколо оригіналу.
Клас Sprite регіон текстури і геометрію, де він буде малюватися і колір для малювання.
Тут 20, 20, 50, 50 описують частина текстури, яка повернута на 45 градусів і малюється в позиції 10,10. Теж саме можна досягти передачею Texture або TextureRegion та інших параметрів в SpriteBatch. але клас Sprite робить це більш зручним, маючи один об'єкт, які описує все. Крім того, оскільки Sprite містить геометрію і перераховує її тільки коли необхідно, він трохи більш ефективний, якщо масштаб, поворот або інші властивості залишаються незмінними між кадрами.
Зверніть увагу, що Sprite змішує інформацію про модель (позиція, кут повороту і так далі) з інформацією про вид (текстура для малювання). Це робить Sprite невідповідним при застосуванні шаблону проектування, який строго відокремлює модель від виду. В цьому випадку, використання Texture і TextureRegion може мати більший сенс.
Тонування
Коли малюється текстура, вона може бути тонований певним кольором.
Цей код показує як малювати текстуру, регіон і спрайт з тонуванням. Значення кольору описуються використовуючи RGBA формат, зі значення між 0 і 1. Альфа значення ігнорується при відключенні змішуванні.
змішування
Змішування включено за замовчуванням. Це означає, що коли малюється текстура, то напівпрозорі ділянки текстури об'єднуються з пікселями вже знаходяться на цьому місці екрану.
Коли змішування відключено, то всі, хто на екрані в цьому місці, замінюється текстурою. Це більш ефективно, так що змішування має бути відключено, якщо воно не потрібно. Наприклад, коли малюється на весь екран велике зображення фону, то продуктивність може бути досягти шляхом відключення змішування:
Примітка: обов'язково переконайтеся, що екран очищається при кожному кадрі. Якщо цього не зробити, то текстура з альфа каналом, може малюватися поверх себе сотню раз, роблячи цим гадану непрозорість. Крім того, деякі архітектури графічних процесорів працюють краще, коли екран очищається при кожному кадрі, навіть якщо непрозорі зображення малюються на весь екран.
Налаштування продуктивності
Клас SpriteBatch має конструктор, який встановлює максимальну кількість спрайтів, які можуть бути поміщені в буфер перед оправкой графічного процесора. Якщо число занадто мало, це призведе до додаткових зверненнями до графічного процесора. Якщо воно занадто велике, то SpriteBatch буде використовувати більше пам'яті, ніж це необхідно.
SpriteBatch має публічне поле з ім'ям maxSpritesInBatch. Це поле вказує на найбільшу кількість спрайтів, вставлених відразу ж графічному процесору, на протязі всього життєвого циклу SpriteBatch. Установка дуже великого SpriteBatch розміру і потім перевірка цього поля, можуть допомогу визначити оптимальний розмір для SpriteBatch. Слід мати такий розмір, щоб він був рівним або трохи більше ніж maxSpritesInBatch. Це поле може бути встановлено в нуль або скинуто в будь-який час.
SpriteBatch має публічне поле з ім'ям renderCalls. Після виклику end () методу, це поле показує скільки раз група геометрії, була передана графічного процесора між останніми викликами begin () і end (). Це відбувається, коли повинна бути прив'язана інша текстура або коли SpriteBatch має в кеші досить спрайтів і ставати повністю заповненим. Відповідно, якщо для SpriteBatch змінено розмір і renderCalls має велике значення (щонайбільше ніж 15-20), то це вказує, що відбувається множинна прив'язка текстур.
SpriteBatch має додатковий конструктор, який приймає розмір і кількість буферів. Це додаткова особливість, яка дозволяє використовувати VBO. а не звичайний масив вершин. Таким чином, є список буферів і при кожному виклику візуалізації, використовується наступний у списку буфер (змінюючи по колу). Коли значення maxSpritesInBatch велике і renderCalls мало, то це може дати невеликий приріст продуктивність.