Author: h.mohri
この記事は、Craig ChapmanによるA new mutlti-threading library for Delphi. (darkThreading)の抄訳です。 |
ご存知の方もおられるかとおもいますが、私は、過去2〜3ヶ月間、Delphiの新しいビデオゲームエンジンの開発に取り組んでいました。また、その要求にたくさんの時間がかかりました。そのため、しばらくblogを投稿できませんでした。しかし、ゲーム開発プロジェクトの中で、別のものをDelphi用のオープンソースライブラリとしてリリースすることができました。darkThreadingを紹介したいと思います。
Table of Contents
Introduction
多くのマルチスレッドまたは並列プログラミングライブラリは、タスクモデルを採用しています。このようなモデルでは、メインスレッドはいくつかのタスクを準備し、それらを実行するスレッドプールにスローします。ほとんどの場合このモデルを採用し非常にうまく機能しますが、理想的ではない場合もあります。ゲームエンジンプロジェクトはそのようなケースです。
ビデオゲームエンジンは、ゲームプロセスのライフタイムで常に実行される多くのコンポーネントを備えています。例えば、典型的なゲームではプレイ中、敵が近づくにつれて冷たい足踏み音を鳴らすオーディオコンポーネントがあるかもしれません。タスクベースのスレッドモデルの問題は、オーディオシステムなどのハードウェアコンポーネントやドライバがアプリケーションでコンテキストを取得してそのコンテキストを使用することが多く、単一のスレッドに制限されることが多いことです。タスクベースモデルでは、ゲームシステムスレッドプール内の各スレッドに対して別々のオーディオコンテキストを必要とするか、足踏みステップが再生されるたびに新しいコンテキストを取得する必要がある。コンテキストを取得して解放することは、パフォーマンス的にあまり良くないのでより良いモデルが必要です。
darkThreadingライブラリは、長時間実行される多くのスレッドを提供することでこの問題を解決します。それぞれのスレッドは、不気味な足音を鳴らすなど、特定の機能に専念することができます。スレッドが必要でない期間は、CPUサイクルを消費しないように「スリープ状態にする」ことができ、それらのサイクルを必要とする別のシステムに渡すことができます。darkThreadingライブラリは、スレッド、したがって関連するハードウェアコンテキストを保持し、スレッドは必要なときに単に呼び出されることがあります。
darkThreading詳細
一般的なマルチスレッドライブラリと同様に、darkThreadingはいくつかの「primitives」を提供しています。これは同時実行で動作するクラスで、コードスレッドを安全にするために使用できます。
ICriticalSection
クリティカルセクションは、相互排他的なmutexロックを使用して、特定のコードがいつでも1つのスレッドによってのみ実行されるようにします。
ISignaledCriticalSection
Signaledクリティカルセクションは、クリティカルセクションと同じタスクを実行しますが、ロックが取得された後、排他実行コードは実行スレッドをスリープ状態にすることがあります。このスレッドがスリープしている間は、オペレーティングシステムのスケジューリングから削除され、CPUサイクルを消費しません。その後、他のスレッドは、「Wake」メソッドを呼び出して、実行中のスレッドを復帰させることができる。
IAtomicRingBuffer
アトミックリングバッファは、ある実行中のスレッドから別のスレッドにデータを安全にコピーできるバッファを提供するために、原子変数(一度に1つのスレッドによってのみ書き込まれる変数)を使用します。 リングバッファは単方向であり、1つのスレッドのみがデータをコピーし、唯一の(他の)スレッドはいつでもバッファからデータをコピーすることができる。
IThreadMethod
スレッドメソッドは、スレッド内から指定されたメソッドを繰り返し呼び出すクラスです。 このprimitiveは、darkThreadingライブラリのすべてのスレッドの基礎となります。
darkThreadingは、複数のスレッドを起動するためのスレッドプールシステムも提供します。
IPoolThread
プールスレッドは、スレッドプール内の単一の専用スレッドによって実行されるクラスです。
IThreadPool
スレッドプールはIPoolThreadsの集合であり、各スレッドは自身の専用スレッドで実行されます。
darkThreadingが多くのスレッドライブラリと異なるところは、もっと特殊なクラスと型です…
TMessage
異なるスレッドで動作するサブシステム(IThreadSubSystem参照)間で送信される可能性のあるメッセージ(Windows APIメッセージとは異なります)を表すレコードです。
IMessageChannel
メッセージチャネルは単一のスレッドによって所有され、他のスレッドからのメッセージを受信するためにそのスレッドによって使用されます。 他のスレッドは、メッセージパイプを使用してメッセージをチャネルに送信することができます。 どの1つのチャネルにも複数のメッセージパイプがあり、チャネルを複数送信者のシングルレシーバメッセージングシステムにすることができます。
IMessagePipe
メッセージパイプは単一のスレッドによって所有され、別のスレッドが所有するメッセージチャネルにメッセージを送信するために使用されます。 複数のスレッドがそれぞれ独自のパイプをターゲットチャネルに所有している場合があります。
IMessageBus
メッセージバスは、単にIMessagePipeインスタンスとIMessageChannelインスタンスの機能を結合するための集約インタフェースです。 メッセージバスインタフェースは、他の各インタフェースのメソッドへのアクセスを提供します。
IThreadSubSystem
スレッドサブシステムは、IPoolThreadのやや高度な形式です。 これは、実行されるIThreadSystemにインストールされる長時間実行されるタスクです。 IPoolThreadとは異なり、IThreadSubSystemは、同じスレッド上の他のサブシステムとともにラウンドロビンで実行することができます。 スレッドを共有する場合、IThreadSubSystemは協調的で、他のサブシステムに対してはフリーランタイムを提供することが期待されます。 IThreadSubSystemはメッセージングシステムにもアクセスできるため、サブシステムはメッセージングインターフェイスを使用して通信できます。
IThreadSystem
スレッドシステムは、スレッドプール(IThreadPool)のより高度な形式です。 これは、あらかじめ決められた数のスレッドで実行されるIThreadSubSystemインスタンスの集合です。 IThreadSystemは、サブシステムにメッセージングシステムへのアクセスを提供します。
利用方法
darkThreadingのドキュメンテーションにはまだ少しの作業が必要です(これは間もなく行われます)が、機能のデモを行うためのサンプルアプリケーションがいくつか付属しています。 現時点では、ライブラリの使用方法がわからない場合は、ドキュメントの更新や詳細については、ブログの投稿を参照してください。
ダウンロード
That’s the best bit.
darkGlassゲームエンジンのすべてのコンポーネントと同様に、darkThreadingはMITライセンスに適合するように自由に使用できます。 GitHubから自分のコピーを複製することができます:https://github.com/chapmanworld/darkThreading
Conclusion
darkThreadingに関する次回ポストするブログの記事をご覧ください。 ここでは、サンプルアプリケーションを書いて、ドキュメントの変更についての最新情報を提供します。
一方で、質問があればトライして連絡を取ってください。
Thanks for reading!