
איך כל ספריית C++ נכנסת לפרויקט Godot
מדריך שפורסם בבלוג של Conan מסביר איך כל ספריית C/C++ משתלבת בפרויקט Godot באמצעות GDExtension ו-godot-cpp 10. בדוגמה ספריית ECS בשם flecs מנהלת 100 000 חלקיקים בסצנה אחת.
Godot הוא מנוע משחקים חינמי וקוד פתוח ברישיון MIT, ורוב הפרויקטים נכתבים ב-GDScript. במוקדם או במאוחר נוצר צורך בפונקציונליות שכבר קיימת כספריית C או C++. GDScript לא יכולה לקרוא לקוד native, Godot מטמיע אותו דרך GDExtension, ו-godot-cpp, ה-C++ bindings הרשמיים, מציג את הקוד הזה כמחלקות מנוע רגילות.
המדריך בבלוג של Conan מסביר את הדרך הזו: godot-cpp 10 נמצא כעת ב-ConanCenter, ובדוגמה ספריית ECS בשם flecs מנהלת 100 000 חלקיקים בסצנה.
איך Godot מתרחב עם קוד C++
פרויקט Godot מורכב מסצנות, עצי node, והתנהגות מתווספת בסקריפט שמחובר ל-node. קוד C++ מוסיפים בשתי דרכים: engine module מקומפל בתוך המנוע, אבל דורש בנייה עצמית של Godot לכל הפלטפורמות, בעוד GDExtension טוען ספרייה משותפת ל-Godot הרשמי בזמן runtime ומתקשר דרך ממשק C יציב.

בנייה, החלק הקשה
godot-cpp עוטף את ממשק ה-C verbose ב-C++ API. מגרסה 10 ואילך מהדורה אחת עובדת עם כל גרסאות Godot מ-4.3, הגרסה נבחרת באמצעות option api_version, וההרחבה מקומפלת לאחד משלושה target. התיעוד מציע להוסיף את godot-cpp כ-git submodule, אבל אז כל פרויקט בונה בעצמו את הספריות לכל פלטפורמה.
Conan לוקח אחריות על התלויות
ב-ConanCenter המתכון של godot-cpp הופך את ה-bindings לחבילה רגילה: api_version (מ-4.3 עד 4.7, ברירת מחדל 4.7) ו-target הם option-ים של Conan. כל שילוב נבנה פעם אחת ואחר כך משרת את כל הפרויקטים. ב-ConanCenter יש יותר מ-1 900 ספריות ו-Conan בונה את כולן באותה צורה.
100 000 חלקיקים עם flecs
בדוגמה GDExtension רושם node חדש בשם Swarm, שמנהל 100 000 חלקיקים על גבי flecs: הם בורחים מהעכבר ומתנגשים בקצוות. ב-ECS entity הוא id פשוט, component הוא נתונים שמחוברים אליו, ו-system הוא פונקציה שעוברת על כל entity מתאים. component-ים מאותו סוג נשמרים יחד בזיכרון, ולכן מעבר על המון entity הוא מהיר.

בכל frame _process() מעביר ל-flecs את מיקום העכבר, מריץ system-ים עם world.progress() ומעתיק מיקומים ל-buffer של MultiMesh: MultiMesh מצייר הרבה instance של mesh אחד ב-draw call אחד, כי node נפרד עבור 100 000 חלקיקים כבד מדי. המחלקה נרשמת עם GDREGISTER_RUNTIME_CLASS, כלומר ב-editor היא רק placeholder.
הבנייה מתבצעת בפקודה אחת: conan build . --build=missing. Conan מוצא את godot-cpp ואת flecs, מוריד בינאריים מוכנים מ-ConanCenter ובונה את ההרחבה. godot-cpp דורש C++17, ולכן לפרופיל ישן מוסיפים -s compiler.cppstd=17.
SiTech — פיתוח אתרים בכוח ה-AI
אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.