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

Example は MainLoop ベースにするべきか? #180

Open
lriki opened this issue Jan 14, 2021 · 0 comments
Open

Example は MainLoop ベースにするべきか? #180

lriki opened this issue Jan 14, 2021 · 0 comments
Labels

Comments

@lriki
Copy link
Collaborator

lriki commented Jan 14, 2021

しない。

以下、検討結果。

動機

Lumino は次の2つのエントリーポイントの作成方法がある。

  • Application クラスを継承して実装する
  • Main() に while 等を使ってメインループを実装する

Application の実装では仮想関数などの知識が必要となるため、メインループと比べてやや前提知識のレベルが上がる。
簡単なサンプルではメインループを使って実装した方がわかりやすいのでは?

特に C と HSP3 へ対応するにあたって、継承といった概念の無い言語向けに作るサンプルが少し難しくならないか心配。

対案

なぜ Application クラスを使うのか?

メインループの隠蔽が必要なケースに対応するため。

Web や Android 環境で期待通りのメインループを実装することは困難で、どうしても使いたいときはサブスレッドを使う必要がある。
ただサブスレッドでは UI 関係の API に制約がかかることが一般的で、問題の原因となりやすい。

また update のタイミングをエンジン側で完全に制御できるようになるので、
一時停止、ヒットストップ(これは Application でやるべきではないかもしれないが) といった時間制御がやり易くなったり、
メッセージキューが空なら更新しないことで負荷を落とすといった制御をすることが可能になる。

オブジェクト指向の知識を前提とする懸念はあるが、アプリの規模が大きくなりシーン遷移が必要になってくると、
どのみち同じように継承&仮想関数(or コールバック登録)の実装が必要になったり、この辺りの知識が必須になってくる。

なぜメインループをサポートするのか?

Moduler Engine として、他のフレームワークに組み込めるようにするため。

ただこの場合、FPS制御などは他フレームワーク側に任せることになるため Engine::update はやめて、FrameWindow の描画関数や更新関数を直接呼び出すようにした方がいいかもしれない。

逆にこのFPS制御やシステムのメッセージキューの処理を誰に任せるかはっきりさせない限り、メインループサポートは待った方がよさそう。
(例えば HSP3 で await は誰が呼び出せばいいの?とか)

Research

ざっと集めてみたゲームエンジン・ライブラリでは、Application クラス相当のエントリーポイントとなっているものが圧倒的に多かった。

メインループをサポートしているのは、低レイヤーの描画ライブラリであることが多い感じ。

Application クラス相当

Unity など大きなゲームエンジンや、Web系などプラットフォームの制約がかかるものは全てこちら。

Amethyst(rust)

Piston(rust)

Panda3D(python)

pyxel(python)

pyglet(python)

kivy(python)

KivEnt(python)

Tkinter(python)

defold(lua)

love2d(lua)

Gosu(ruby)

Shoes(ruby)

Ruby2D(ruby)

DotFeather(C#)

Stride(C#)

Ogre(C++)

openFramework

Cinder

Pomdog(C++)

MEGA(C++)

Processing

MainLoop

SDL

Altseed

Siv3D

DxRuby

pygame(python)

rubygame(ruby)

@lriki lriki added the question label Jan 14, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant