Превод на уроци по libGDX

Представям на вашето внимание превода на втория libGDX урок. Оригиналът е тук. Първата част е тук.

Този урок дава представа как да рисувате изображения с помощта на OpenGL и как libGDX опростява и рационализира този процес с класа SpriteBatch.

Рисуване на изображения.

Изображение, взето от оригиналния си формат (като PNG) и заредено в GPU, се нарича текстура. Текстурите се чертаят според някаква спецификация, която е описание на геометрична фигура и как текстурата се прилага към върховете на тази фигура. Например, геометрията може да бъде правоъгълник и всеки ъгъл на правоъгълника се отнася до съответния ъгъл на текстурата.

Много често текстурното рисуване се случва в правоъгълна геометрия. Също така е много обичайно да рисувате една текстура или нейните различни части много пъти. Неефективно е да изпращате един правоъгълник за изобразяване към GPU. Вместо това много правоъгълници за една текстура могат да бъдат описани и изпратени на GPU всички заедно. Това прави класът SpriteBatch.

SpriteBatch получава текстурата и координатите на всеки правоъгълник, където тази текстура ще бъде показана. Той натрупва тази информация, без да я изпраща до GPU. Когато получи текстура, която е различна от последната заредена текстура, тя прави последната заредена текстура активна, изпраща натрупаната информация за изтегляне към графичния процесор и започва да натрупва данни за изтегляне за следващата текстура.

Промяната на текстурата на всеки няколко правоъгълника, които трябва да бъдат начертани, не позволява на SpriteBatch да групира достатъчно правоъгълници. Освен това обвързването на текстурата е доста скъпо. Имайки предвид тезипричини, често съхраняват много малки изображения в едно голямо изображение и след това рисуват части от голямо изображение, като по този начин увеличават максимално броя на натрупаните правоъгълници за рисуване и избягват промени в текстурата. Вижте TexturePacker за повече подробности.

SpriteBatch (обвивка на спрайт)

Използването на клас SpriteBatch в приложение изглежда така:

Всички извиквания към SpriteBatch за изобразяване трябва да бъдат обвити между методите begin() и end(). Извикванията към методи за рисуване със средства, различни от класа SpriteBatch, не трябва да се появяват между методите begin() и end().

Текстура (текстура)

Класът Texture взема изображение от файл и го зарежда в GPU. Файлът с изображение трябва да бъде поставен в директорията "активи", както е описано в (ВРЪЗКА) Настройка на проекта. Размерите на изображението трябва да бъдат степен на две (16x16, 64x256 и т.н.).

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

Чертае текстура при x, y, като използва размерите на текстурата

Рисува част от текстурата.

Чертае част от текстурата, разтегната на ширина*височина и по избор отразена.

Този чудовищен метод рисува част от текстурата с възможност за компресиране (разтягане), завъртане около точка и възможност за отразяване.

Чертае част от текстурата, разтегната на ширина*височина. Това е по-усъвършенстван метод. Координатите не са посочени в пиксели, а в реални числа.

Чертае част от текстурата, като я „разтяга“ върху формата, зададена от spriteVerticles

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

Класът TextureRegion описва правоъгълник в рамките на текстура и се използва за изчертаване само на част от текстурата.

Тук 20, 20, 50, 50 описва частта от текстурата, която след това ще бъде начертана на (10, 10). Същото действие може да се извърши чрез предаване на текстура и допълнителни параметри на класа SpriteBatch, но класът TextureRegion прави това по-удобно, защото е по-лесно да дефинирате един обект и да работите с него, отколкото да запомните куп допълнителни параметри.

SpriteBatch има много методи за изчертаване на TextureRegion:

- чертае регион, като използва ширината и височината на региона.

- рисува регион, компресиран (разтегнат) на ширина и височина.

- чертае област, разтегната (компресирана) на ширина и височина, с възможност за мащабиране и завъртане спрямо точката originX, originY.

спрайт (спрайт)

Класът Sprite описва областта на текстурата, позицията, където тази област ще бъде изчертана и цвета, който ще бъде за региона (цвят за оцветяване - оцветяване с цвят).

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

Трябва да се отбележи, че класът Sprite смесва информация за модела (позиция, информация за въртене и т.н.) с информация за представяне (текстурата е начертана от същия клас). Товаправи неподходящо използването на Sprite в архитектура, където искате стриктно да отделите модела от изгледа. В този случай използването на клас Texture или TextureRegion може да има повече смисъл.

Тониране (оцветяване (засенчване) с цвят)

Когато се начертае текстура, тя може да бъде запълнена с определен цвят:

Този код показва как да нарисувате текстура, нейната област и оцветен спрайт. Цветът е описан в RGBA модел, където всеки компонент е между 0 и 1. Алфа каналът се игнорира, ако смесването е деактивирано.

Смесване

Смесването е активирано по подразбиране. Това означава, че когато се начертае текстура, прозрачните части на тази текстура могат да се комбинират с пикселите, които вече са начертани на екрана на това място.

Когато смесването е деактивирано, всичко, което е било на екрана, се изтрива от текстурата, която е начертана на това място. Това е по-ефективно и по този начин винаги можете да деактивирате смесването, ако не ви е необходимо. Например, ако рисувате голямо фоново изображение, което да запълни екрана, производителността може да се подобри, като първо деактивирате смесването:

Подобряване на представянето.

SpriteBatch има публично поле renderCalls. След следващия цикъл на изобразяване той съхранява колко пъти SpriteBatch е изпратил различни данни за геометрията между извикванията към begin() и end(). Това се случва, ако са обвързани различни текстури или ако SpriteBatch е пълен (кешът е твърде малък). Ако SpriteBatch е оразмерен правилно и renderCalls е твърде висок (около 15-20), тогава използвате твърде много текстури. Опитайте се да поставите някои от текстурите в една голяма текстура.

SpriteBatch има допълнителен конструктор, който приема число и размерибуфери. Това е усъвършенствана функция, която нарежда да работи с VBO (върхови буферни обекти) вместо обичайните VA (върхови масиви). SpriteBatch поддържа списък с буфери и използва следващия буфер всеки път, когато изобразява. Когато maxSpritesInBatch е малък и renderCalls е голям, тази функция може да даде малък тласък на производителността.

Hardcore conf в C++. Каним само професионалисти.