BOINCのグラフィクスAPI |
|
BOINCのアプリケーションはグラフィクス画面を表示するようにできます (オプション)。 グラフィクスを表示する場所は、 アプリケーションのウインドー内か、フルスクリーン・ウインドー ( BOINC スクリーンセイバーが選択されている場合)のいずれかです。
グラフィクス機能はあなたの作る主アプリケーションと一体化することもできますし、 別のプログラムとして作ることもできます。 一体型のアプローチを推奨します。 ですからまずそちらから説明しましょう。 このアプローチでは、boinc_init() を呼ぶ代わりに、アプリケーションは下記の関数を呼びます。
#if defined(_WIN32) || defined(__APPLE__)
retval = boinc_init_graphics(worker);
#else
retval = boinc_init_graphics_lib(worker, argv[0]);
#endif
worker() が、あなたの作るアプリケーションの
主関数です。 アプリケーションは描画と入出力の関数を備えねばなりません(下記参照)。
これらの関数が ワーカー・スレッド(worker thread)を生成し、 主アプリケーションの機能を動かします。 もともとのスレッドは、グラフィクス・スレッド(graphics thread) になり、GUI イベントを処理しながら画像表示を行います。
Unix では、あなたの作るグラフィクスのコードは、別の共有ライブラリ(.so) に含める必要があります。 というのは、 Unix の計算機はグラフィクスに必要なライブラリ(OpenGL, GLUT, X11) を持っていないことがあるからです。 アプリケーションをこれらのライブラリと動的リンクする構造にすると、 ライブラリが存在しない場合、アプリケーションのスタートアップで失敗します。 一方、アプリケーションをこれらのライブラリに静的にリンクすると、 グラフィクス処理は多くの計算機でとても非効率的にしか処理できません。
この共有ライブラリの名前は、実行可能ファイルの名前の末尾に、 '.so' をつけたものでなければなりません。 さらに、それは libboinc_graphics_impl.a および、 描画用関数、入力処理関数ともリンクされている必要がありますし、 glut と opengl とは(動的に)リンクされていなければなりません。 主プログラムとこの共有ライブラリは、 複数ファイル アプリケーションの版 として束ねておかねばなりません。 グラフィクスを使う Unix/Linux アプリケーションは、 その全てのファイルを -D_REENTRANT オプションつきでコンパイルしなければなりません。 グラフィクスではマルチスレッドを使うからです。
BOINC 例題アプリケーション (原文、翻訳準備中) ではこの手法を使っています。 さらに、Unix 上で共有ライブラリを生成するのに必要な Makefile コマンドについても記しています。
主プログラムの中にグラフィクスコードをもつうプログラムは、次の関数を用意する必要があります。
void app_graphics_render(int xs, ys, double time_of_day);
この関数はグラフィカル・スレッドから、定期的に呼ばれます。
[呼ばれたら]、現在時点のグラフィックを生成するべきです。
xs と ysは、それぞれ、[描画するべき]
ウインドーのX方向、Y方向のサイズです。 time_of_day は、
秒で表した相対時刻です。
グラフィクスの表示をしないアプリケーションも、このAPIとリンクする都合上、
ダミーの関数 app_graphics_render()
を用意しなければなりません。
void app_graphics_init();
この関数は、ウインドーが作られたときに、
グラフィクス・スレッドの中から呼ばれます。
呼ばれたら、そのウインドー内でグラフィクスを初期化するのに必要な
処理があれば、それをしなければなりません。
void app_graphics_resize(int x, int y);
この関数は、ウインドーのサイズが変化したときに呼ばれます。
void app_graphics_reread_prefs();
この関数は、参加者のプロジェクト・レファレンスが変更された
ときは必ず、グラフィクス・スレッドの中で呼び出されます。
この関数の中から、以下の関数を呼んで、新しい好みの設定(プレファレンス)
を取り出すことができます。
boinc_parse_init_data_file();
boinc_get_init_data(APP_INIT_DATA&);
アプリケーションは下記の入力処理関数群を提供する必要があります。
void boinc_app_mouse_move(
int x, int y, // カーソルの新位置の座標
bool left, // 左のマウスボタンが押し下げられているか
bool middle,
bool right
);
void boinc_app_mouse_button(
int x, int y, // カーソルの座標値
int which, // どのボタンが対象か (0/1/2)
bool is_down // 今、押し下げられたその場合だけ、true
);
void boinc_app_key_press(
int, int // システム固有のキー符号化
);
void boinc_app_key_release(
int, int // システム固有のキー符号化
);
以下のグローバル変数がフレーム・レイトを制御します:
boinc_max_fps は、秒あたりの表示フレーム数の上限です。 (デフォルトは 30)
boinc_max_gfx_cpu_frac は、グラフィクスのために使うことのできる CPU時間の割合の上限です。 (デフォルトは 0.5)
SETI@home/BOINCの開発のため、グラフィクス関連のクラスが数種、 開発されました。 これらは、一般にも使えるものでしょう。
ファイル api/txf_util.C には、見栄えのよい3次元テキスト描画の関数 のサポートがあります。
アプリケーションは事前に用意した画像ファイル (JPEG, GIFF, BMP または Targa) をグラフィクスとして表示することができます。 これは一番簡単なやり方で、コーディングなしで済みます。 ワークユニットのそれぞれに、その画像ファイルを含めなければなりません。 こうするには、そのアプリケーションを、 api/static_graphics.C と (このファイルの中に書かれたファイル名を変更してから) リンクします。 時間がたつにつれて、画像を取り替えていくこともできますが、 そのときは(論理的なファイル名ではなくて、物理)ファイル名を、 そのたびに変更する必要があります。
このやり方では、アプリケーションには「主プログラム」と 「グラフィクス・プログラム」とから成っています。 主プログラムがグラフィクス・プログラムを起動し、 その作業が終われば終了させます。 主プログラムとグラフィクス・プログラムは、 典型的には共有メモリの仕組みを使って通信します。 このために、 boinc/lib/shmem.C の中の関数を利用することができます。
主プログラムは下記の関数を使って初期化をする必要があります。
int boinc_init_options_graphics(BOINC_OPTIONS&, WORKER_FUNC_PTR worker);
このグラフィクス・アプリケーションは、 BOINC フレームワークを使って実装できます。 このフレームワークを使う場合、初期化を以下の関数で行い、
int boinc_init_options_graphics(BOINC_OPTIONS&, NULL);
コア・クライアントからのグラフィクス・メッセージを処理するのは、 主プログラムでもグラフィクス・プログラムでも構いません。 グラフィクス・プログラムで処理するのがもっとも簡単です。 というのは、主プログラムが処理することにすると、 そのメッセージをグラフィクス・プログラムに伝える必要があるからです。
最終更新時刻 00:48:36, 2006年08月12日(JST)
Copyright © 2008 University of California.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License,
Version 1.2 or any later version published by the Free Software Foundation.
Copyright © 2008 Komori Hitoshi(je2bwm at jarl.com).
Japanese translation from English web pages on BOINC.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License,
Version 1.2 or any later version published by the Free Software Foundation.