Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

データドリブンなアーキテクチャを導入する #31

Open
EbiseLutica opened this issue Oct 18, 2024 · 1 comment
Open

データドリブンなアーキテクチャを導入する #31

EbiseLutica opened this issue Oct 18, 2024 · 1 comment
Milestone

Comments

@EbiseLutica
Copy link
Collaborator

EbiseLutica commented Oct 18, 2024

背景

Prometeでは、画面を構成する全ての概念がElementというC#クラスで管理されている

一方、多くのゲームは、そのロジックで使うためのデータをクラスなり構造体なりで持っていることが殆どである

ゲームロジック用のデータを画面に表示するとき、以下のような処理を行う必要がある

  1. データ列をforeach
  2. データごとにElementを生成する
  3. 生成したElementを配置する
  4. データ列に変更があったら、対象のElementを変更したり、作成したり、削除したりする

これは、ロジック側のデータ列とPromete側のElementリストで、似たような構造を二重管理していることになる
特に 4. がかなり面倒…。ロジック側のデータ列がそのまま画面描画に使われたら、メモリ効率も生産性も上がるだろう

Data Renderer パターン

このissueでは、上記の背景を解決するために、任意のC#オブジェクトおよび、それを用いた画面描画のロジックを使って画面を構成できるようにする。ロジック用のデータをDataとし、それを画面に描画するためのコードをRendererとするため、Data Rendererパターンと呼ぶ。

Data

Dataは、単なるC#の型である。stringやintでもいいし、構造体・クラスを問わない。

Renderer

Rendererは、与えられたDataを元に画面描画を担当するクラスである。

public struct Enemy
{
    public Texture2D Texture { get; set; }
    public Vector Position { get; set; }
    public string Name { get; set; }
    public int Hp { get; set; }
}

public class EnemyRenderer : DataRenderer<Enemy>
{
    // DataRenderer<T>.Render(T data);
    public override void Render(Enemy enemy)
    {
        // 実際の画面描画。Promete Elementを生成するか、よりローレベルなAPIを呼ぶかは未定
    }
}
@EbiseLutica
Copy link
Collaborator Author

RenderAll(ReadonlySpan<Enemy> enemies) の形で全データの描画を制御できてもよさそう

@EbiseLutica EbiseLutica added this to the Promete v1 milestone Nov 18, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant