DxLibEx
DxLibEx copied to clipboard
DxLib全体のラッパーの作成
#7 の議論でDxLibの関数と「混ぜるな危険」になる可能性が出てきたので、DxLib全体のラッパーが必要と判断し、詳細をつめる議論をする。
目的:DxLibの関数を使う際、DxLibEx側のmutexを使い同期をとれるようにする
僕の仮実装では
- 各関数をラップし、それを機能ごとにnamespaceに入れる
となっていましたが、これにこだわるつもりはないです。 ただ、仮にこれで作るとすれば、
- namespaceの命名規則の作成
- namespaceをデフォルトでusingし、dxleの中に入れるかどうか
- noexceptをどこまでつけるか
等の議論が必要だと思います。
いや・・・、必要ですかね・・・。mutexにアクセスできるようにしておけば十分な気がします。それにusing namespaceした時にDxLibの関数とconflictすると思います。
mutexにアクセスできるようにしておけば十分な気がします。
それだとユーザーが「スレッドセーフを保証できなくなるDxLib側の関数」を完全に把握している必要が出てきます。すべてのユーザーがプロフェッショナルではないですし、こういう約束事はバグのもとになると思います。
using namespaceした時に
- DxLibの方にusing namespaceをdefineで無効化できるようにお願いする(さすがにわがままですかね?)
- 接頭語としてdxleを付ける
- using namespaceは禁止(仕様にする)
というのを思いつきました。
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くらいできるでしょう。
自己責任で十分だと思うんです。
言われてみれば確かにそうですね...。 そもそもMTやるなというツッコミは残りますが、DrawBox系が普通に使えないのは困ると思うので、「DXライブラリの関数リファレンスページで公開されている関数のみ」に関してラップを提供するというのはどうでしょうか?
僕のイメージではインターフェースの統一のためにTexture2Dですでに提供されているDrawGraph等の関数も含みます。
それにしてもnamespaceの件が解決しませんね。 それで考えたんですが、あえて引数経由でmutexを渡させてはどうでしょう?
そもそもMTじゃない時は#if~#endifでその部分無効にするわけで、mutexするんだ、という感じが出ていいんじゃないかと。
引数経由でmutexを渡させて
具体的なコードが思いつかないので、コードのイメージをお願いします。
namespace dxle{
DrawGraph(GrapgMutexHandle mutex, int x, int y, bool transflag);
class GrapgMutexHandle {
GrapgMutexHandle ();
void lock();
void unlock();
}
でscreen_mutex_c::mtxをいじるラッパーを渡すみたいな
わかりました。 これらの関数は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
}
こんな感じでとりあえず作ってみます。
まあ、真面目に使うとなれば若干不便でしょうが、誰も使わない機能に時間を割いても仕方がないですし。
あ、空クラスでいいのか・・・。