უკან დაბრუნება
როგორ შედის ნებისმიერი 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-ზე მიმაგრებული სკრიპტით ემატება. C++ კოდს ორი გზით ამატებენ: engine module ძრავის შიგნით კომპილირდება, მაგრამ საკუთარი Godot-ის აწყობას მოითხოვს ყველა პლატფორმისთვის, GDExtension კი shared ბიბლიოთეკას ოფიციალურ Godot-ში runtime-ზე ტვირთავს და სტაბილური C ინტერფეისით ურთიერთობს.

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

აწყობა, რთული ნაწილი

godot-cpp verbose C ინტერფეისს C++ API-ით ფარავს. მე-10 ვერსიიდან ერთი რელიზი 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-ს იძებნის, მზა ბინარებს ConanCenter-იდან იწერს და გაფართოებას აწყობს. godot-cpp-ს C++17 სჭირდება, ამიტომ ძველ პროფილზე ბრძანებას -s compiler.cppstd=17 ემატება.

SSiTech

SiTech — AI-გაძლიერებული ვებ დეველოპმენტი

ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.