DxLibEx icon indicating copy to clipboard operation
DxLibEx copied to clipboard

DxLib全体のラッパーの作成

Open Nagarei opened this issue 9 years ago • 9 comments

#7 の議論でDxLibの関数と「混ぜるな危険」になる可能性が出てきたので、DxLib全体のラッパーが必要と判断し、詳細をつめる議論をする。

目的:DxLibの関数を使う際、DxLibEx側のmutexを使い同期をとれるようにする

僕の仮実装では

  • 各関数をラップし、それを機能ごとにnamespaceに入れる

となっていましたが、これにこだわるつもりはないです。 ただ、仮にこれで作るとすれば、

  • namespaceの命名規則の作成
  • namespaceをデフォルトでusingし、dxleの中に入れるかどうか
  • noexceptをどこまでつけるか

等の議論が必要だと思います。

Nagarei avatar Nov 17 '15 12:11 Nagarei

いや・・・、必要ですかね・・・。mutexにアクセスできるようにしておけば十分な気がします。それにusing namespaceした時にDxLibの関数とconflictすると思います。

yumetodo avatar Nov 17 '15 13:11 yumetodo

mutexにアクセスできるようにしておけば十分な気がします。

それだとユーザーが「スレッドセーフを保証できなくなるDxLib側の関数」を完全に把握している必要が出てきます。すべてのユーザーがプロフェッショナルではないですし、こういう約束事はバグのもとになると思います。

using namespaceした時に

  • DxLibの方にusing namespaceをdefineで無効化できるようにお願いする(さすがにわがままですかね?)
  • 接頭語としてdxleを付ける
  • using namespaceは禁止(仕様にする)

というのを思いつきました。

Nagarei avatar Nov 17 '15 22:11 Nagarei

DxLibの方にusing namespaceをdefineで無効化できるようにお願いする

一応現状

// ネームスペース DxLib を使用する ------------------------------------------------------
#ifdef DX_USE_NAMESPACE

using namespace DxLib ;

#endif // DX_USE_NAMESPACE

となっているので、ここだけいじればいいんですが、管理人さん首を縦に振ってくれるかなぁ・・・。

いや、何が面倒って、DxLibの関数追加を私たちがちゃんと追えるならいいんですけど、私たちだって、このプロジェクトばっかりをずっとやってるわけではないですし、そこまで管理できない気がするんです。現状の提案だとDxLibのすべての関数をラップする必要があるわけで(一部関数のみ提供だとそれこそ混乱を招く)。

なので、基本はクラスでラップしつつ、mutexへのaccessができるようにして、ラップしていないものをスレッドセーフに使うときはmutexをきちっとやるようにアナウンスする、でいいと思うんです。

すべてのユーザーがプロフェッショナルではないですし、こういう約束事はバグのもとになると思います。

もちろんこれはごもっともなんですが、マルチスレッド自体初心者が手を出せるわけではないですし (最近初心者の定義が怪しい気がしますが)、 大体の関数をクラスでラップするなりdxle名前空間に関数作れば、ないものに関してMTするなら自己責任で十分だと思うんです。

ラップしていない関数使うような人かつMTやりたい人ならmutexくらいできるでしょう。

yumetodo avatar Nov 17 '15 23:11 yumetodo

自己責任で十分だと思うんです。

言われてみれば確かにそうですね...。 そもそもMTやるなというツッコミは残りますが、DrawBox系が普通に使えないのは困ると思うので、「DXライブラリの関数リファレンスページで公開されている関数のみ」に関してラップを提供するというのはどうでしょうか?

僕のイメージではインターフェースの統一のためにTexture2Dですでに提供されているDrawGraph等の関数も含みます。

Nagarei avatar Nov 18 '15 10:11 Nagarei

それにしてもnamespaceの件が解決しませんね。 それで考えたんですが、あえて引数経由でmutexを渡させてはどうでしょう?

そもそもMTじゃない時は#if#endifでその部分無効にするわけで、mutexするんだ、という感じが出ていいんじゃないかと。

yumetodo avatar Nov 18 '15 14:11 yumetodo

引数経由でmutexを渡させて

具体的なコードが思いつかないので、コードのイメージをお願いします。

Nagarei avatar Nov 18 '15 22:11 Nagarei

namespace dxle{
DrawGraph(GrapgMutexHandle mutex, int x, int y, bool transflag);
class GrapgMutexHandle {
GrapgMutexHandle ();
void lock();
void unlock();
}

でscreen_mutex_c::mtxをいじるラッパーを渡すみたいな

yumetodo avatar Nov 19 '15 09:11 yumetodo

わかりました。 これらの関数はDX_THREAD_SAFEが定義されているときのみ有効で良いですかね? あと、GrapgMutexHandleは空クラスでも機能すると思うのでその感じで実装します。

namespace dxle{
#ifdef DX_THREAD_SAFE
struct GrapgMutex{};
int DrawGraph(GrapgMutex mtx, int x, int y, int GrHandle, bool transflag) DXLE_NOEXCEPT_SINGLE
{
    DXLE_GET_LOCK(dxle::screen_mutex_c::mtx);
    return DrawGraph(x, y, GrHandle, transflag);
}
#endif
}

こんな感じでとりあえず作ってみます。

まあ、真面目に使うとなれば若干不便でしょうが、誰も使わない機能に時間を割いても仕方がないですし。

Nagarei avatar Nov 19 '15 10:11 Nagarei

あ、空クラスでいいのか・・・。

yumetodo avatar Nov 19 '15 11:11 yumetodo