ブログ「サイバー少年」

ブログ「サイバー少年」へようこそ!
小学六年生ごろからプログラミングを趣味にしている高校生のブログです。
勉強したことについての記事などを書いています。フリーソフトも制作、公開しています。
(当ブログについて詳しくは「ブログ概要紹介」を参照)

サイバー少年が作ったフリーソフトは「サイバー少年の作品展示場」へ

ゲームでのマルチスレッドのバグが直せない!

ふと、将来ゲームを作れるようになるため、
ゲーム作りの基本を学ぼうということでC#でやってみたんですよ。

ゲームというか、フォームにキャラクターを描画して、移動させるサンプルですね。

ゲームループとか覚えるの面倒くさかったので、タイマーでやりました。

そのとき、System.Windows.Formsのタイマーではなく、スレッドタイマーを使用したんですよ。

そして、このせいでバグがおきます。






まず、Bitmapを一つ作成して、そこにゲーム画面を描画して、
そしてBitmapをフォームに描画する方式にしました。

ダブルバッファリングとか言うようです。


スレッドタイマーに渡す処理には、ダブルバッファリング用のBitmapに描画する処理を書きます。

そして、その処理の最後にフォームに描画するメソッドを呼び出します。

フォームのPaintイベントに描画処理を書いて、フォームのInvalidateメソッドを呼び出す形をとりました。


だいたい処理がまとまって、実行してみたら大変

動かしている途中に不定期で「オブジェクトは現在地の場所で使用されています。」とエラーがでてくるんですよ。

エラーの場所も毎回違います。

エラー発生のタイミングが不定なこと、スレッドタイマーを使用していることから、
恐らくエラーの原因はマルチスレッド処理の間違いだと思います。

マルチスレッドは勉強中なので正確なことは言えませんが、スレッドタイマーにて新しいスレッドを作成して、排他処理を書かずにやっていたからエラーが出たのではないかと。


しかし、排他処理をどこに書けばいいのか…。

コードを見た限り、複数スレッドから同時にアクセスしているオブジェクトはないんですよね。

排他処理の典型例とは違うということです。




というわけでよく分からない説明でしたが、
とにかく、このエラーを直す力が私にはありません。

そういう力をつけなくてはゲームは作れませんね。
とりあえず、頑張ります。


(え、そもそもタイマーでやるのがおかしいって?え、ゲームループって何?)

tag:

コメント

コメントの投稿

トラックバック

トラックバック URL
http://cyberboy6.blog.fc2.com/tb.php/225-a3d0981a
この記事にトラックバックする(FC2ブログユーザー)

当ブログをご利用(閲覧等)になる場合は必ず「当ブログの利用規定」をお守りください。