Godot Engine (godotengine/godot на GitHub) — игровой движок с открытым исходным кодом, в основном на C++. Он поддерживает как 2D, так и 3D. Как программист на C++, который посещает занятия по сетевым технологиям, я решил создать граф зависимостей #include и попытаться определить наиболее важные файлы в графе.

Делая это, я надеюсь выяснить, какие файлы важны для новичков, которые хотят внести свой вклад в Godot.

Я использовал cinclude2dot2, скрипт на основе Python, для анализа исходных файлов C/C++ непосредственно из исходных файлов Godot из репозитория GitHub и обнаружения строк с включениями файлов. Данные были очищены вручную и лишены путей к каталогам, оставив только имена файлов. Это означает, что файлы с повторяющимися именами объединяются в один узел графа. Это нежелательно.

Я использовал Gephi для визуализации и всех расчетов метрик, запуская OpenOrd и ForceAtlas2 на графике с различными настройками.

Прежде всего, давайте введем несколько понятий.

  • In-Degree – это количество раз, когда файл включается в другие файлы.
  • Out-Degree – это количество раз, когда файл включает в себя другие файлы.
  • Степень – это сумма как In-Degree, так и Out-Degree.
  • PageRank — это известный алгоритм Google для ранжирования веб-страниц, но его также можно применять к графикам в целом! Здесь мы используем его для ранжирования файлов в графе зависимостей.

Степень

Во-первых, согласно нашему рейтингу, мы видим, что файлы настроек конфигурации и доступа config.h и project_settings.h довольно популярны. К сожалению, в настоящее время config.h представляет собой смесь 5 разных файлов, но все они находятся в каталоге firstparty/:

./thirdparty/squish/config.h
./thirdparty/pcre2/src/config.h
./thirdparty/opus/config.h
./thirdparty/mbedtls/include/mbedtls/config.h
./thirdparty/libvpx/vpx_ports/config.h

Таким образом, мы можем сделать вывод, что Godot (точнее, код, который использует Godot) достаточно много внимания уделяет этим библиотекам. Ничего слишком большого, но, возможно, что-то, что мы, возможно, захотим разбить позже, если захотим поближе взглянуть на это.

os.h — довольно важный файл, так как это класс, который имеет дело с изменением видеорежимов, запросом операционной системы на использование памяти и так далее и тому подобное.

Как ни странно, важные классы, такие как Object, здесь не отображаются! In-Degree — довольно наивное измерение важных узлов в графе — позже вы увидите лучшие.

Вне степени

Мы можем интерпретировать out-grade как «самые сложные для понимания файлы», если предположим, что должны понимать содержимое, поступающее из заголовков, на которые он ссылается. Поэтому уместно, что редактор Godot и менеджер сцены появляются в этом списке. Однако большие числа становятся менее пугающими, если учесть, что register_types.cpp на самом деле является именем более 30 различных файлов…

Возможно, вы заметили, что некоторые файлы с префиксом bt продолжают появляться. Что это? Это физический движок Bullet, который использовался во многих проектах с открытым исходным кодом, а также в коммерческих проектах (даже в фильмах). Вполне логично, что файлы Bullet отображаются здесь довольно часто, поскольку физика и столкновение — непростые задачи, которые нужно выполнить и понять.

PageRank

PageRank — это алгоритм, который выводит веса узла на основе весов других узлов, отдавая предпочтение соединениям, которые ведут к узлу, а не от него. Таким образом, PageRank не только создает более «глобальную» метрику, но и отдает предпочтение узлам на принимающей стороне ссылки на зависимость.

Мы видим довольно большие изменения по сравнению с другими показателями. Мы можем увидеть более важные файлы, такие как повторная реализация вектора Годо, «базовые функции и определения, которые будут использоваться везде в typedef.h» и класс String Годо.

Так что, возможно, когда кто-то проходит Годо, было бы полезно следить за некоторыми из них! Скорее всего, вы встретите заголовочный файл в этом списке, и есть вероятность, что большинство других людей тоже.

Промежуточность

Метрики центральности отлично подходят для выяснения того, какие узлы находятся в ядре/центральной точке графа. Здесь мы, наконец, видим, что Object, базовый класс практически для всего, занимает подобающее место в верхней части рейтинга — даже официальная документация считает его важным! Вариант, самый важный класс в движке, также появляется под номером 2. Одним из результатов, который плохо задокументирован с помощью пользовательского руководства для него в документации, является ориентированный на графический интерфейс класс Controlcontrol.h находится под влиянием и влияет на большую часть кодовой базы. , что уместно, если учесть, что редактор Godot Engine построен в рамках собственной структуры графического интерфейса.

  • Примечание: лично я считаю, что разработка Godot собственного редактора как игры Godot — это круто и уникально! Я думаю, что это заслуживает большего внимания.

editor_node.h и node.h, похоже, составляют основу редактора и движка сцены соответственно — они, возможно, являются первыми кандидатами на изучение для получения интимного вида. в Годо.

Многие классы здесь намекают на фундаментальные системы, такие как обработка изображений, основной цикл движка или сами редакторы.

Важные кластеры/модули

В Gephi я запустил обнаружение модульности, чтобы попытаться сгруппировать кодовую базу Godot в разные кластеры, за исключением того, что на этот раз я решил взвесить размер узла на основе промежуточной центральности, потому что он, как правило, согласуется с официальными данными. размещение документации по важности на Вариант и Объект. Ниже представлено новое изображение, на котором раскрашены только 7 самых больших кластеров:

Кластер 1: ядро ​​и редактор (26%)

Кластер 2: основной, конфиг и библиотеки (14,53%)

Кластер 3: Объект, Вариант (14,11%)

Кластер 4: пулевая библиотека (9,2%)

Кластер 5: libvpx (6,75%)

Вывод

Одна интересная вещь, которую мы узнали о Godot, заключается в том, что значительная часть его кодовой базы даже не является частью самой Godot. В репозитории есть по крайней мере 10–15% кода движка Godot, который, как можно ожидать, будет довольно изолированным, но все же на него часто ссылаются другие библиотеки — возможно, работнику, который начинает сталкиваться с этими влиятельными файлами, может понадобиться изучить эти библиотеки. вывести свое развитие на новый уровень.

Мы обнаружили, что большая часть кода в Godot по праву находится под влиянием и влияет на многие файлы в каталоге core/, и определили некоторых важных кандидатов, которые могут подойти для дальнейшей документации. Этот анализ подтверждает мнение о том, что Variant и Object являются двумя чрезвычайно важными классами в движке Godot, хотя есть много других важных классов, которые значительно влияют на свои области кода. Что ж.

Файлы

Многие, но не все изображения и данные включены в файл zip ниже:

godot-all-graph-analysis.zip

Первоначально опубликовано на vermillionazure.com 31 марта 2018 г.