Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the antispam-bee domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /home/ruwritingagame/public_html/wp-includes/functions.php on line 6121
Глава 4. Printf в OpenGL ES – Игра в Написание Игры

Глава 4. Printf в OpenGL ES

Теперь, имея 2 OpenGL ES проекта на разных платформах, можно прикинуть что в них общего и в чем разница.

Общая структура: Создание GL context-а, инициализация данных, главный цикл с покадровым rendering-ом, выход. GL команды (Слава Богу!) выглядят тоже похоже. Разница в инициализации окна и GL-a, в GL-related инклюдах (gl/egl на Android-е и glfw/glad в Windows-е). Прием и обработка системных событий и ручного ввода тоже различаются.

Значит надо собрать platform-specific вещи в 2 отдельных набора (один для PC и другой для Android-а).

Начнем с printf-обрАзной функции, которая будет нужна для разработки и потребует разных реализаций для Windows и для Android-а. Сперва на

Windows:

  1. Запускаем Visual Studio. Открываем C:\CPP\a999hello\p_windows\p_windows.sln

2. Приготовим для нее место: right-click на “p_windows ” project -> Add -> New Filter

Имя – xPlatform


3. Физически мы будем держать Windows-specific файлы в каталоге C:\CPP\p_windows (там же где и GLFW/GLAD). Надо проинформировать Проект, что искать инклюды и там тоже:

Right-click на “p_windows” project -> Properties, All configurationsWin32, Configuration properties -> C++ -> General -> Additional Include Directories -> Edit, добавляем New Line (Новую Строку), идем в

C:\CPP\p_windows

Select Folder, Ok, Apply, Ok


4. Под xPlatform добавляем header file: Right-click на xPlatform, Add -> New Item,

  • выбрать “Header File (.h)”
  • name – platform.h
  • Location неправильный, заменим на C:\CPP\p_windows

Теперь – Add.

Как и было заявлено выше, мы напишем функцию, которая сможет напечатать что-либо на экране (в данном случае – в окне Консоли), что-то типа printf-а.

Мы НЕ можем использовать сам printf потому что:

  • Он работает только на PC. На Android-е работать не будет.
  • Не работает в OpenGL экране.
  • Нужен только в Debug конфигурации, в Release должен быть отключен.

Эту функцию я назову mylog(). Хочу, чтобы она принимала параметры так же как printf (сперва форматирующая строка, и потом – по обстоятельствам).

Еще она должна отключаться в Release конфигурации. Код:

#pragma once
#include "stdio.h"
#include <stdarg.h>

inline void mylog(const char* _Format, ...) {
#ifdef _DEBUG
    va_list _ArgList;
    va_start(_ArgList, _Format);
    vprintf(_Format, _ArgList);
    va_end(_ArgList);
#endif
};

Теперь можно ее опробовать.


5. Откроем main.cpp.

Сверху, где инклюды, добавим строку:

#include "platform.h"

В функции main(void), в самом начале, сразу после “{“ добавим строку

mylog(" Hello %s !\n", "Windows");

Выбираем Debug конфигурацию (в верхнем меню).

Запускаем (зеленая стрелка). Смотрим окно Консоли:

Hello Windows !


6. Теперь можно убрать “#include <stdio.h>” из main.cpp и поменять error_callback() с использования printf на mylog (это было единственное использование printf-а в main.cpp):

static void error_callback(int error, const char* description)
{
    mylog("Error: %s\n", description);
}

Еще раз запускаем – норм.


Теперь

Android:

На Android-е это будет слегда по-другому. Во-первых – нет окна Консоли. Во-вторых – нет “окон” вообще (в Windows-овском смысле). Зато есть “LogCat” – собственный Android-овский механизм для вывода debug/development сообщений.

7. Закрываем и пере-запускаем Visual Studio, открываем C:\CPP\a999hello\p_android\p_android.sln.


8. Добавляем filter (virtual folder): right-click на p_android.NativeActivity project -> Add -> New Filter.

Имя то же, xPlatform


9. Под xPlatform создадим header file: Right-click на xPlatform, Add -> New Item,

  • выбираем “Header File (.h)”
  • name – platform.h
  • Меняем location на C:\CPP\p_android\

Затем – Add.

Код:

#pragma once
#include <android/log.h>
#include "stdio.h"

inline void mylog(const char* _Format, ...) {
#ifdef _DEBUG
    char outStr[1024];
    va_list _ArgList;
    va_start(_ArgList, _Format);
    vsprintf(outStr, _Format, _ArgList);
    __android_log_print(ANDROID_LOG_INFO, "mylog", outStr, NULL);
    va_end(_ArgList);
#endif
};

Этот код полагается на константу _DEBUG, но она пропущена в Android’s debug конфигурации.


10. Открываем p_android.NativeApplication project properties, выбираем Debug configuration, ARM64,

Идем в Configuration Properties -> C/C++ -> Preprocessor, открываем Preprocessor Definitions -> Edit. Если _DEBUG там нет, то добавить, затем OK, Apply, Ok.


11. Теперь откроем main.cpp.

В #include секции добавим новую строку:

#include "platform.h"

В функции android_main (…), в самом начале, сразу после “{“ добавим строку:

mylog(" Hello %s ! \n", "Android");


12. Опять-же, надо проинформировать p_android.NativeActivity проект где искать этот platform.h.

Right-click на p_android.NativeActivity project -> Properties, All Configurations, ARM64. Открываем Configuration Properties -> C/C++ -> General -> Additional Include Directories -> Edit, Добавляем строку, идем на

C:\CPP\p_android

Select Folder, Ok, Apply, Ok.


13. Включаем и разблокируем наш Android, подключаем к PC USB кабелем, разрешаем USB Debugging.


14. Компиляция и запуск (зеленая стрелка). На Android-е ничего нового, тот же мигающий зеленый экран, но теперь мы можем посмотреть LogCat.


15. На VS экране открываем верхнее меню -> Tools -> Android Tools -> Logcat.

В поле <Search Logcat> набираем “mylog”, Enter. И что там у нас?:

Hello Android !


Leave a Reply

Your email address will not be published. Required fields are marked *