require_once("docutil.php"); page_head("The BOINC graphics API"); echo"
BOINC applications can optionally generate graphics. Graphics are displayed either in an application window or in a full-screen window (when acting as a screensaver). Applications that do graphics must call
void boinc_init_graphics();at the start and
void boinc_finish_graphics();prior to exiting.
The main application thread is called the worker thread.
boinc_init_graphics()
creates a second thread,
called the graphics thread.
The two threads communicate through application-defined
shared memory structures.
Typically these structures contain information about the computation,
which is used to generate graphics.
The worker must initialize the shared data structure
before calling boinc_init_graphics()
.
Graphical applications must supply the following functions:
bool app_graphics_render(int xs, ys, double time_of_day);This will be called periodically in the graphics thread. It should generate the current graphic.
xs
and ys
are the X and Y sizes of the window,
and time_of_day is the relative time in seconds.
The function should return true if it actually drew anything.
It can refer to the user name, CPU time etc. obtained from
boinc_get_init_data()
.
Applications that don't do graphics must also supply a
dummy app_graphics_render()
to link with the API.
void app_graphics_init();This is called in the graphics thread when a window is created. It must make any calls needed to initialize graphics in the window.
void app_graphics_resize(int x, int y);Called when the window size changes.
void app_graphics_reread_prefs();This is called, in the graphics thread, whenever the user's project preferences change. It can call
boinc_parse_init_data_file(); boinc_get_init_data(APP_INIT_DATA&);to get the new preferences.
The application must supply the following input-handling functions:
void boinc_app_mouse_move( int x, int y, // new coords of cursor bool left, // whether left mouse button is down bool middle, bool right ); void boinc_app_mouse_button( int x, int y, // coords of cursor int which, // which button (0/1/2) bool is_down // true iff button is now down ); void boinc_app_key_press( int, int // system-specific key encodings ) void boinc_app_key_release( int, int // system-specific key encodings )
The following global variables control frame rate:
boinc_max_fps is an upper bound on the number of frames per second (default 30).
boinc_max_gfx_cpu_frac is an upper bound on the fraction of CPU time used for graphics (default 0.5).
Several graphics-related classes were developed for SETI@home/BOINC. They may be of general utility.