Վերադառնալ
Ինչպես է ցանկացած C++ գրադարանը մտնում Godot նախագիծ
SiTech AI Team2 წთ. საკითხავი

Ինչպես է ցանկացած C++ գրադարանը մտնում Godot նախագիծ

Conan բլոգում հրապարակված ուղեցույցը բացատրում է, թե ինչպես է ցանկացած C/C++ գրադարանը ներմուծվում Godot նախագիծ GDExtension-ի և godot-cpp 10-ի միջոցով։ Օրինակում flecs-ի ECS գրադարանը մեկ տեսարանում կառավարում է 100 000 մասնիկ։

Godot-ը MIT լիցենզիայով անվճար, բաց կոդով խաղային շարժիչ է, իսկ նախագծերի մեծ մասը գրվում է GDScript-ով։ Վաղ թե ուշ անհրաժեշտ է դառնում այնպիսի ֆունկցիոնալություն, որն արդեն գոյություն ունի C կամ C++ գրադարանի տեսքով։ GDScript-ը չի կարող կանչել native կոդ, Godot-ը այն ներմուծում է GDExtension-ով, իսկ godot-cpp-ն՝ պաշտոնական C++ bindings-ը, այդ կոդը ներկայացնում է սովորական շարժիչային դասերի տեսքով։

Conan-ի բլոգի ուղեցույցը բացատրում է այս ճանապարհը․ godot-cpp 10-ն այժմ ConanCenter-ում է, իսկ օրինակում flecs-ի ECS գրադարանը տեսարանում կառավարում է 100 000 մասնիկ։

Ինչպես է Godot-ը ընդլայնվում C++ կոդով

Godot նախագիծը բաղկացած է scene-ներից, node-ների ծառերից, իսկ վարքը ավելացվում է node-ին կցված script-ով։ C++ կոդը ավելացնում են երկու եղանակով․ engine module-ը կոմպիլվում է շարժիչի ներսում, բայց պահանջում է սեփական Godot-ի հավաքում բոլոր պլատֆորմների համար, իսկ GDExtension-ը shared գրադարանը բեռնում է պաշտոնական Godot-ում runtime-ի ընթացքում և շփվում կայուն C միջերեսով։

Godot-ის Create New Node დიალოგი, სადაც Swarm კლასი Node2D-ის ქვეშ ჩანს

Հավաքումը՝ դժվար մասը

godot-cpp-ն verbose C միջերեսը փաթաթում է C++ API-ով։ 10-րդ տարբերակից մեկ release-ը աշխատում է Godot-ի 4.3-ից սկսած բոլոր տարբերակների հետ, տարբերակն ընտրվում է api_version option-ով, իսկ ընդլայնումը կոմպիլվում է երեք target-ից մեկի համար։ Փաստաթղթերը առաջարկում են godot-cpp-ն ավելացնել որպես git submodule, բայց այդ դեպքում յուրաքանչյուր նախագիծ ինքն է հավաքում գրադարանները բոլոր պլատֆորմների համար։

Conan-ը վերցնում է կախվածությունները

ConanCenter-ում godot-cpp-ի recipe-ն այս bindings-ը դարձնում է սովորական փաթեթ․ api_version (4.3-ից 4.7-ը, լռելյայն 4.7) և target-ը Conan option-ներ են։ Յուրաքանչյուր համակցություն հավաքվում է մեկ անգամ և հետո սպասարկում բոլոր նախագծերին։ ConanCenter-ում 1 900-ից ավելի գրադարան կա, և Conan-ը բոլորին նույն կերպ է հավաքում։

100 000 մասնիկ flecs-ով

Օրինակում GDExtension-ը գրանցում է նոր Swarm node, որը flecs-ի վրա կառավարում է 100 000 մասնիկ․ նրանք փախչում են մկնիկից և բախվում եզրերին։ ECS-ում entity-ն պարզ id է, component-ը՝ նրան կցված տվյալներ, իսկ system-ը՝ ֆունկցիա, որն անցնում է բոլոր համապատասխան entity-ներով։ Միևնույն տիպի component-ները հիշողության մեջ պահվում են միասին, դրա համար շատ entity-ներով անցումը արագ է։

Godot-ის editor-ი Swarm node-ისა და Count, Flee Radius თვისებებით

Ամեն frame-ին _process()-ը flecs-ին փոխանցում է մկնիկի դիրքը, world.progress()-ով գործարկում system-ները և դիրքերը պատճենում MultiMesh-ի buffer-ում․ MultiMesh-ը մեկ draw call-ով նկարում է մեկ mesh-ի շատ instance, քանի որ 100 000 մասնիկի համար առանձին node-ը չափազանց ծանր է։ Դասը գրանցվում է GDREGISTER_RUNTIME_CLASS-ով, այսինքն editor-ում միայն placeholder է։

Հավաքումը կատարվում է մեկ հրամանով․ conan build . --build=missing։ Conan-ը գտնում է godot-cpp-ն ու flecs-ը, ներբեռնում պատրաստ binary-ները ConanCenter-ից և հավաքում ընդլայնումը։ godot-cpp-ն պահանջում է C++17, դրա համար հին profile-ին ավելացվում է -s compiler.cppstd=17։

SSiTech

SiTech — AI-ով հզորացված վեբ մշակում

Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։