This Project Has Not Released Any Files
wxWidgetsのTextCtrlが不安定だと思っていた原因は、おそらく別のスレッドからアクセスしていたせいっぽい。 考えてみりゃ当たり前だけど、せめてassert出すなりしてくれれば、もうちょっとわかりやすいのに。 つか、この辺はGTKとも絡んでるっぽいので難しそうだけど。
やっぱりマルチスレッドのプログラミングは難しい。
色々考えて、とりあえずクライアントだけでもC++で書き直すことにしました。 最大の理由は、やはりWindowsではexe単体で実行させたいから。 たかが麻雀を打つのに、Rubyを入れてwxWidgets入れてってのは、さすがに敷居が高すぎる。
ということで、wxWidgetsを使うのは変わらないけど、mingwとMSYS入れて、WindowsでもGCCを使えるようにして、 必要そうなとこからC++で書き直し中。 意外とLinuxで書いたソースのまま通るのね。
ついでにwxFormBuilderも使ってみた。今までGUIでも全部ソースで書いて、このテのやつは使わない オールドタイプだったんだけど、まあ勉強かなぁと思って。
…意外と便利なのね(;
会社ではVisualStudio使ってて、デバッガ以外はむしろ邪魔だと思ってたけど、新しい開発環境も悪くないな。 そのうちEclipseも試してみよう。
WxRubyの不安定さはTextCtrlのせいっぽい。外してみたら結構安定した気が。
サーバが重いのは、サーバ側でロンができるかを判定しているためで、ロン判定のためにはフリテンを調べなければならず、 そのため捨て牌が増えるとどんどん重くなっていた。
別にサーバ側で判定せず、クライアントから送られてきてから判定すれば全然軽くなるのだが、ルールを通達しない仕様上、 サーバから可能な限りクライアントの出来うることを通達する方が親切だし、クライアントを作る手間も減るだろうと 考えたのだが、思いの外(?)、サーバの負荷が高くなってしまった。
で、要するに和了形判定を高速化すれば良いのだが、その方法として、あらさんのHPを 参考に、和了形だけのテーブルを用意することにした。
ただ、今回はシャンテン数を求めるのではなく、和了形の判定さえできれば良いので、牌の種類は関係なく、 1-9の牌を0-4枚持っているパターンだけで済むので、全部で5**9=1953125パターン、そしてそのうち和了形と見なせるのは わずか2869パターンだけなので、これをそのままRubyのHashで持たせてみた。
ついでにあまり有効ではないかもしれないが、字牌でも同じテーブルが使えるよう、刻子のみかどうかもテーブルに 入れておいた。
速度は計ってないが、これでけっこう高速化できたような気がする。
あと、フリテン判定を手出しのときだけにするようにし(現状AIはすべてツモ切りなので、実際にはこれが一番効いたw) とりあえずそれほど重いって感じではなくなった。
やっぱRubyの方が開発は楽だし、当面はこれで凌ぎきろう(;
だんだんWxWidget(WxRuby)にも慣れてきたけど、なんかすごい不安定な気が。たまに[Bug]でハングってしまうのは どう対処すれば良いのだろう。
どっちにせよ、現状もサーバはRubyでぶん回していて激重だし、今からいっそC++で書き直すかなぁ。 仕様もだいたい固まってきたし。
WxRubyでは、アイドル中にRubyのThreadが回らないようだ。
みたいな感じで自分でThread.passを呼ぶ必要があるみたい。むー、美しくない。
イベントのIDも、IntegerじゃなくてSymbolで渡せると便利なのになぁ。
おお、いつの間にか一ヶ月も経ってるw
まあ、正直概ねサボっていたワケですが、それでも何をしていたかと言うと
(1) メインの開発マシンをVine-4.2からUbuntuに乗り換えた
これは大変だった。自分はフォントのこだわりが面倒な人なので、Vineのときのように設定したくて色々頑張ったのだが、 結局あきらめた。
この一件も含め、Ubuntuは正直使いにくい印象。多分、Windows的に与えられたものをそのまま使うには便利だろうけど、 自分の使いやすいようにカスタマイズするとき、ちょっと用意された方法から外れると全然わからない。 まあ、慣れてないというのが一番大きいんだろうけど。
まあでも、とりあえずはしばらくUbuntuを使ってみる予定。Vine-5.0が出たらまた考えよう。
(2) レンタルサーバについて調べてた
やっぱサーバを立てたいよね!ってことで、自分でレンタルするといくらぐらいかかるか調べてみたけど、 daemonを動かすとなるとかなりお高くなってしまうようで、最低でも月1万近くはかかってしまうようだ。
ちなみにこれがモチベーションが下がった最大の要因と言っても過言ではないw
今でもどうしようか悩んでいるが、とりあえずお財布的には痛いけど、レンタルしてみようかなぁと思いはじめた。 他のことにも使えるし。まだわかんないけど。
ということで、とりあえずこの開発も再開させようと思った次第でございます(
とりあえず、おおまかな機能は実装して、あとはUIと絡む部分が面倒だから残ってる。チーで牌を指定する方法とか、 鳴かれた牌の表示とか、リーチ表示とか。
つか、Ruby/Gtkでクライアント作ってるけど、これだとやっぱり皆は動かしてくれないかな? Windowsで動かすには敷居高いし。 他のGUIに移行しておくか…あるいはいっそJavaで書く?
Ruby1.8.5ではTCPSocektを継承したクラスで、for_fdを使ってインスタンスを作成すると問題(Errno::EBADF)が起きるような気が。 しばらく悩んでいたが、継承を止めて委譲するような設計にしたら直った。謎。 Rubyが古すぎるのかも。新しいバージョンでは直ってるのかな。
いい加減Vineも見切りどきか…
[PageInfo]
LastUpdate: 2009-02-19 04:02:13, ModifiedBy: yatsuhashi
[Permissions]
view:all, edit:login users, delete/config:members