質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

274閲覧

ECS実装でEntityとSystemの実装方法が知りたい

user12345

総合スコア1

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2024/10/02 13:34

編集2024/10/04 09:49

実現したいこと

下記はECS実装に向けてまずは簡単なコンソール出力にて、実装を簡略化したものなのですが、
SystemEntityの部分でどのように、EntitiyComponentDataを連携して
それぞれ異なるComponentDataに対してSystemを実行したらいいか知りたいです。

ECSとは:https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%83%86%E3%82%A3%E3%83%BB%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%83%BB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0

ECSの実装について:https://zenn.dev/rita0222/articles/c22a8367e31b4d5f4eeb

知りたいこと

System部の実装方法で、複数の異なるComponentDataの塊を処理する方法

コード内容

Chunkクラスはある程度の数のComponentDataをまとめておく機構なのですが未使用です
ArcheTypeクラスはChunkクラスをまとめておく機構ですが未使用です。
現状ではTransform,Rendererの二つのComponentがあります。
Systemは基底クラスでこのクラスを継承してSystemを実装しています。

前提

Entity Component Systemでのキャッシュヒットで効率化を行う。

考えたこと

1,今のような場合だとmain()関数に直接記述できますが実際の開発ではロジック化するので違います
2,仮にComponentDataが一種類だけでVoxelのみだったらSystem部のUpdate()関数の引数に(std::vector<Voxel> &v)などといった形で考えたのですが、実際の開発では複数の種類あるはずなので実装できません。
3,そもそもキャッシュヒットを狙う設計なので、ポインタなどを使うとデータが並ばなくなるので
困りっています。

理解したこと

1,ECSではComponentはデータのみを持ち、非ECSでコンポーネント指向のUnityのような形である、
Update()のような機能はSystemが処理する

該当のソースコード

cpp

1#include <iostream> 2#include <glm/glm.hpp> 3#include <vector> 4 5/*############################################################################ 6# 基底クラス 7##############################################################################*/ 8 9/*###################################### 10# ComponentData base class 11########################################*/ 12class ComponentData 13{ 14public: 15 ComponentData() 16 { 17 std::cout << "Component Created" << std::endl; 18 } 19 20}; 21 22/*###################################### 23# ArcheType base class 24########################################*/ 25class ArcheType 26{ 27public: 28 ArcheType() 29 { 30 std::cout << "ArcheType Created" << std::endl; 31 } 32 33 34 35}; 36 37/*###################################### 38# System base class 39########################################*/ 40class System 41{ 42public: 43 44 System() 45 { 46 std::cout << "System Created" << std::endl; 47 } 48 49 virtual void Update() = 0; 50}; 51 52/*############################################################################ 53# 派生クラス 54##############################################################################*/ 55 56/*###################################### 57# Transform Component 58########################################*/ 59class Transform 60{ 61public: 62 63 glm::vec3 position; 64 glm::vec3 rotate; 65 glm::vec3 scale; 66 67 Transform() 68 { 69 std::cout << "Transform Created" << std::endl; 70 } 71 72 73}; 74 75/*###################################### 76# Mesh Component 77########################################*/ 78class Mesh 79{ 80public: 81 82 glm::vec4 color; 83 84 Mesh() 85 { 86 std::cout << "Mesh Created" << std::endl; 87 } 88}; 89 90/*###################################### 91# Voxel ComponentData 92########################################*/ 93class Voxel : public ComponentData 94{ 95public: 96 97 Transform transform; 98 Mesh mesh; 99 100 Voxel() : ComponentData() 101 { 102 std::cout << "Voxel Created" << std::endl; 103 } 104}; 105 106/*###################################### 107# Render System 108########################################*/ 109class RenderSystem : public System 110{ 111public: 112 113 RenderSystem() 114 { 115 std::cout << "Render System Created" << std::endl; 116 } 117 118 void Update() override 119 { 120 std::cout << "Render System Updated" << std::endl; 121 } 122 123}; 124 125/*###################################### 126# Movement System 127########################################*/ 128class MovementSystem : public System 129{ 130public: 131 132 MovementSystem() 133 { 134 std::cout << "Movement System Created" << std::endl; 135 } 136 137 void Update() override 138 { 139 std::cout << "Movement System Updated" << std::endl; 140 } 141 142}; 143 144 145/*############################################################################ 146# その他 147##############################################################################*/ 148 149/*###################################### 150# Chunk 151########################################*/ 152class Chunk 153{ 154public: 155 156 157 Chunk() 158 { 159 std::cout << "Chunk Created" << std::endl; 160 } 161}; 162 163/*###################################### 164# Entity 165########################################*/ 166class Entity 167{ 168public: 169 170}; 171 172int main() 173{ 174 std::vector<Voxel> voxelList; 175 voxelList.resize(100); 176 177 178 179 180} 181

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2024/10/03 01:12 編集

(単なる誤記の指摘みたいな話ですが) 質問文末尾の > ポインタやなどを使うと… という箇所で単語が抜けてしまっている(:本来は「ポインタやXXXなど」と書かれる場所である)ように見えます. (困り事を説明している個所なので,ここで抜けている単語というのが話の内容において重要だったりしないのかな? と)
user12345

2024/10/03 13:28

修正しました。
dodox86

2024/10/04 01:54

唐突に'ECS実装'との単語が出てきましたが、設計、デザインパターンの一種「Entity-Component-System」でしょうかね。ゲームプログラミング界隈では一般的な単語、概念なのでしょうか。 ※あまり日本語サイトでヒットしなかったので、英語でAIのCopilotさんに訊ねるといくつか紹介されました。 https://en.wikipedia.org/wiki/Entity_component_system > Entity–component–system (ECS) is a software architectural pattern mostly used in video game development for the representation of game world objects.
fana

2024/10/04 02:05 編集

> mostly used in video game development これってどっちの意味なんだろう?(←英語弱い) ・「ゲーム開発という場面において 最も使われているパターン である」みたいな意味? ・「このパターンが使われる主な場面というのは, ゲーム開発 である」みたいな意味? 前者なら > ゲームプログラミング界隈では一般的な単語、概念 という話になり,後者だとその辺はよくわからん感じ(?)ですね.
maisumakun

2024/10/04 02:31

> 唐突に'ECS実装'との単語が出てきましたが 真っ先にElastic Container Service(AWSのサービス)が浮かんでしまい、一瞬思考がデッドロックしました。
guest

回答2

0

自己解決

解決方法 (手順)

  1. シグネチャベースのエンティティグループ化
  2. システムでアーキタイプを処理

解説

ECSアーキテクチャで異なるアーキタイプ(つまり、異なるコンポーネントの組み合わせ)をシステムが処理するための一般的なアプローチは、アーキタイプごとのグループ化と、それに応じたシステム処理の分割

結論

シグネチャベースでグループ化する

シグネチャベースのエンティティグループ化

エンティティを追加する際に、そのエンティティが持つコンポーネントに基づいてアーキタイプ(シグネチャ)を計算し、そのシグネチャに該当するリストやグループにエンティティを追加します。

cpp

1class ArchetypeManager { 2public: 3 std::unordered_map<ComponentSignature, std::vector<Entity>> archetypeMap; 4 5 void AddEntityToArchetype(Entity entity, ComponentSignature signature) { 6 archetypeMap[signature].push_back(entity); 7 } 8 9 const std::vector<Entity>& GetEntitiesBySignature(ComponentSignature signature) { 10 return archetypeMap[signature]; 11 } 12};

システムでアーキタイプを処理

各システムは、自分が必要とするコンポーネントに対応するシグネチャを持っており、アーキタイプごとに異なる処理を行います。

cpp

1class RenderSystem { 2public: 3 void Update(ArchetypeManager& archetypeManager) { 4 ComponentSignature renderSignature; 5 renderSignature.set(TransformComponentID); // Transform を要求 6 renderSignature.set(MeshComponentID); // Mesh を要求 7 8 const auto& entities = archetypeManager.GetEntitiesBySignature(renderSignature); 9 10 for (auto entity : entities) { 11 // エンティティの Transform と Mesh を使ってレンダリング処理 12 } 13 } 14};

参考

ChatGPT: [ECSアーキテクチャで、下記のコードですが複数の異なるアーキタイプをシステムが処理するための機構はどうつくればいいのか?]と記述し、下に上記の提示コードをclass Transformから Voxel ComponentData
をコピペし回答を取得、※AIなので同じものが回答されるかわかりません。

投稿2024/10/04 10:21

user12345

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ECS

なる話を全く知りませんので,「ECSの場合はこうするんだよ!」みたいな話があるのか否か等全くわからないのですが,
(ECSなる単語を無視して)質問内容のみを見た感想 としては

2,仮にComponentDataが一種類だけでVoxelのみだったらSystem部のUpdate()関数の引数に(std::vector<Voxel> &v)などといった形で考えたのですが、実際の開発では複数の種類あるはずなので実装できません。

という困り事(というか「不自由さ」とでもいうか?)が起きている原因というのは,
「複数個の System 群のインタフェース を統一しようとしていること(:class MovementSystem : public System みたいな実装形態)」にあるのではないか? と見えます.
この実装形態というのは must なのでしょうか?
言い換えれば, MovementSystemRenderSystem は全く自由に( System から派生とかせずに)実装するのではダメなのでしょうか?

C++

1//こんな感じに書き並べれば行けるのでは? という素人発想 2void Update() 3{ 4 MovementSystem MS; 5 RenderSystem RS; 6 ...(他に何種類あるのかわからないけども) 7 8 //適切な順番で更新処理を行う. 9 //「インタフェース統一縛り」が無いならば,個々に必要なものを渡すことには何の障害も無い. 10 MS.Update( a,b,c ); 11 RS.Update( x,y ); 12 ... 13}

上記のような話がダメである場合(System の種類というのが膨大? 「ECSの場合は~」みたいな話にそぐわない? その他?)……
各 System に事前に必要なものを渡しておくとかすれば,Update() のシグネチャは統一できそうですが,そういう話でもない??

投稿2024/10/04 01:25

編集2024/10/04 01:27
fana

総合スコア11954

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問