Переклад туторіалів по libGDX

Представляю вашій увазі переклад другого туторіалу libGDX. Оригінал тут. Перша частина знаходиться тут.

Цей туторіал дає уявлення як малювати зображення використовуючи OpenGL і як libGDX спрощує та оптимізує цей процес за допомогою класу SpriteBatch.

Малювання зображення.

Зображення, отримане з оригінального формату (наприклад, PNG) і завантажене в GPU називається текстурою. Текстури малюються за деякою специфікацією, яка є описом геометричної фігури і яким чином текстура накладається на вершини цієї фігури. Наприклад, геометрична фігура може бути прямокутником і кожен кут прямокутника відноситься до відповідного кута текстури.

Дуже часто малювання текстур відбувається у прямокутній геометрії. Також часто одна текстура або її різні частини малюються багато разів. Неефективно надсилати один прямокутник для малювання в GPU. Замість цього багато прямокутників для однієї текстури можуть бути описані і відправлені в GPU всі разом. Цим і займається клас SpriteBatch.

SpriteBatch отримує текстуру та координати кожного прямокутника, куди буде виведена ця текстура. Він накопичує цю інформацію без посилання в GPU. Коли він отримує текстуру, яка відрізняється від останньої завантаженої текстури, він робить активною останню завантажену текстуру, надсилає накопичену інформацію з малювання в GPU і починає накопичувати дані про відтворення для наступної текстури.

Зміна текстури кожні кілька прямокутників, які мають малюватись, заважає SpriteBatch групувати досить багато прямокутників. Також прив'язка текстури — досить дорога операція. Враховуючи ціпричини часто зберігають багато дрібних зображень в одному великому зображенні і потім малюють частини великого зображення, максимізуючи цим кількість накопичених прямокутників для відмальовування і уникаючи зміни текстури. Дивіться TexturePacker для більш детальної інформації.

SpriteBatch (пакувальник спрайтів)

Використання класу SpriteBatch у додатку виглядає так:

Усі виклики SpriteBatch для малювання повинні бути укладені між методами begin() та end(). Виклики методів для малювання іншими засобами (не класом SpriteBatch) не повинні зустрічатися між методами begin() та end().

Texture (текстура)

Клас Texture отримує зображення з файлу і завантажує його в GPU. Файл зображення повинен бути розміщений у директорії «assets», як описано в Project Setup. Розміри зображення повинні бути ступенем двійки (16х16, 64х256 тощо).

Тут створюється текстура та відправляється класу SpriteBatch для малювання. Текстура малюється в прямогольнику, лівий нижній кут якого розміщений у точці (10, 10), з шириною та висотою, що дорівнює розмірам текстури. SpriteBatch має багато методів для малювання текстур:

Малює текстуру у точці х, у, використовуючи розміри текстури

Малює частину текстури.

Малює частину текстури, розтягнуту до розмірів width*height, і, можливо, відбиту.

Цей монструозний метод малює частину текстури з можливістю стиснення (розтягування), обертання навколо крапки та можливістю відображення.

Малює частину текстури, розтягнуту до розмірів width*height. Це більш сучасний спосіб. Координати вказуються над пікселях, а дійсних числах.

Малює частину текстури, «натягуючи» її на фігуру, вказану в spriteVerticles

TextureRegion (регіон текстури або частинатекстури)

Клас TextureRegion описує прямокутник усередині текстури та використовується для малювання лише частини текстури.

Тут 20, 20, 50, 50 описує частину текстури, яка потім буде намальована у точці (10, 10). Ця ж дія може бути зроблена передачею текстури та додаткових параметрів класу SpriteBatch, але клас TextureRegion робить це зручнішим, оскільки простіше визначити окремий об'єкт та працювати з ним, ніж пам'ятати про купу додаткових параметрів.

SpriteBatch має багато методів для малювання TextureRegion:

— малює регіон, використовуючи ширину та висоту регіону.

- Малює регіон, стислий (розтягнутий) до розмірів width і height.

- Малює регіон, розтягнутий (стиснутий) до width і height, з можливістю масштабування і обертання щодо точки originX, originY.

Sprite (спрайт)

Клас Sprite описує регіон текстури, положення, де буде малюватись цей регіон і колір, яким буде для регіону (колір для tinting - затінювання кольором).

Тут 20, 20, 50, 50 описує регіон текстури, який буде повернутий на 45 градусів, а потім намальований у точці (10, 10). Це ж може бути зроблено передачею текстури або її частини в SpriteBatch та передачею інших параметрів, але клас Sprite робить це зручнішим, оскільки ви зберігаєте всі параметри в одному місці. Також, завдяки тому, що клас Sprite зберігає геометрію в собі і перерахує її лише в разі потреби, це злегка покращує продуктивність в операціях масштабування, обертання або інших властивостях, які не змінюються між кадрами.

Слід зауважити, що клас Sprite змішує інформацію про модель (розташування, інформацію про обертання та інші) з інформацією про подання (текстура була намальована цим же класом). Церобить невідповідним використання Sprite в архітектурі, де ви хочете суворо відокремити модель від подання. У цьому випадку використання класу Texture або TextureRegion може мати більше сенсу.

Tinting (забарвлення (затінення) кольором)

Коли намальована текстура, вона може бути зафарбована певним кольором:

Цей код показує, як намалювати текстуру, її регіон та спрайт із забарвленням кольором. Колір описується в моделі RGBA, де кожна компонента лежить в межах від 0 до 1. Альфа-канал ігнорується, якщо змішування (blending) відключено.

Blending (змішування)

Змішування увімкнено за замовчуванням. Це означає, що коли текстура відображається, прозорі частини цієї текстури можуть об'єднуватися з пікселями, які вже намальовані на екрані в цьому місці.

Коли змішування вимкнено, все, що було на екрані, стирається текстурою, що малюється тут. Це більш ефективно і, таким чином, ви завжди можете вимкнути змішування, якщо воно вам не потрібне. Наприклад, якщо ви малюєте велике фонове зображення на весь екран, продуктивність може бути покращена в першу чергу відключенням змішування:

Поліпшення продуктивності.

SpriteBatch має публічне поле renderCalls. Після чергового циклу рендерингу тут зберігається скільки разів SpriteBatch надсилав різні дані про геометрію між викликами begin() та end(). Це трапляється, якщо прив'язуються різні текстури, або якщо SpriteBatch був переповнений (надто маленький кеш). Якщо розмір SpriteBatch підібраний правильно і renderCalls занадто велике (близько 15-20) це свідчить, що ви використовуєте занадто багато текстур. Намагайтеся розмістити частину текстур в одній великій текстурі.

SpriteBatch має додатковий конструктор, який приймає число та розмірибуферів. Це просунута фішка, яка наказує працювати з VBO (vertex buffer objects) замість звичайного VA (vertex arrays). SpriteBatch зберігає список буферів та при кожному черговому циклі рендерингу використовує наступний буфер. Коли maxSpritesInBatch невелика і renderCalls велика, це фішка може дати невеликий приріст продуктивності.

Хардкорна конфа за С++. Ми запрошуємо лише профі.