錯誤處理
通過打開或關閉系統屬性VGSYS_FPERROR來打開或關閉浮點錯誤指示器。缺省值為VG—OFF。如果設置為VG_ON,則除代替系統並試圖恢復程序外,vega還括入其自身的浮點數。當VGSYS_FPERROR為打開狀態,把通知層設置到VG—INFO或上述有存入浮點錯誤的控制臺上。除了對程序的運行進行優化之外,用戶還需使浮點數的數量最少用戶能設置聯機到控制臺上所指示的提示錯誤消息。之後,把屬性VGSYS_NOTIFY設置到下面各層的某壹個層中,按照重要性遞減的順序列出:
. VG_FATAL可能引起壹個退出;
. VG_WARN——也許失敗也許不失敗;
. VG_NOTICE——可能有錯誤或結構出問題;
. VG_INFO——為用戶打印出錯信息;
. VG_DEBUG——用於程序調試。
只要錯誤消息的嚴重程度比當前層嚴重,則將所要公布的消息寫到標準的輸出設備上;否則,公布的消息作廢。錯誤消息的來源可能是vega系統或用戶的應用程序。例如,接收所有消息的設置代碼為
vgSystem *sys;
sys=vgGetSys();
vgProp(sys,VGSYS_NOTIFY,VG_DEBUG);
在用戶代碼中使用下面的格式插入到調試層的消息
YgNotify(VG_DEBUG,VG_APP,,);
YgNotify(VG_DEBUG,VG_APP,this is an example debug notice at line %ld.._LINE_);
幀管理
VGSYS_FRAMERATE的參數默認值為300,表示每秒中更新顯示的單位幀數。
VGSYS_PHASE的設置指定通過vgsyncFrame函數和繪制線程(如果它是壹個分離的線程)使用的同步方法。可以給定下面參數值中的屬性之壹。
. VGSYS_FREERUN——缺省狀態。允許應用程序在任何速度下都能執行;定義的幀率無效。
VGSYS_LIMIT——與VGSYS_FREERUN相同,但是比定義的幀率低。
vega的執行程序(或vega過程)是壹個單窗口過程,該窗口過程在它前後連接處有多個線程。線程對於分配處理器時間的操作系統是壹個基本單位。為了在壹臺給定的機器上得到壹個最優化的執行,用戶必須在以多種線程方式下運行的系統中配置vega。
3種主要的vega線程是請求(app)、選擇和繪制,各自可作為壹個單獨的線程執行,或以任意兩種線程組合的方式執行,或以3種線程執行,用戶也可為交叉過程選擇壹個分離的線程,為數據庫裝載選擇壹個線程,為光點計算選擇另壹個線程。當內存分頁幾何體使用大面積數據庫管理(LADBM)時,或者是用戶自己的內存分頁幾何體時需要數據庫裝載線程。
選擇壹個多線程模式時,使用vgProp函數把VGSYS_MPMODE設置成下面5種之壹:
. VGSYS_MPDEFAULT——對於目標機器上的CPU,讓系紋確定最佳的結構。
. VGSYS_MP0———為請求、選擇和繪制設置個默LL的線程。
. VGSYS_MP1——設置兩個線程,在—個線程中請求和選擇,在另壹個線程中繪制。
. VGSYS_MP3——設置三個線程*分別用於請求、選擇和繪制。
用戶可以控制在系統上運行的線程處理器(CPU),在窗口屬性中設置繪制線程和優先權,在通道屬性中設置選擇線程、光點線程和優先權,通過把vgsyste函數的屬性VGSYS_APPCPU設為適當的CPU數來設置,app CPU。若CPU數為0,則在系統上的CPU數為-1。映省值為-1說明沒有分配專門的CPU,這時操作系統將決定各線程每次使用CN運行的時間。如果在壹臺專門運行vega應用程序的機器上不存在指定的CPU數,則在機器上存入壹個警告,並真指定線程為-1。
用戶也可以控制線程時序的優先權。每個線程的優先權由下面標準確定:
. Vega處理的Vega優先權類;
. 在vega處理的vega優先權類中線程的vega優先層;
. 優先權類和優先權層被組合為壹個線程的基本優先權形式;
. vega處理的優先權類參數值的範圍是31—39,參數值大的優先權小,使用32為最佳。
表3.1說明vega優先權類參數值的含義。
vgsystem的VGSYS_VEGAPRI屬性用於選擇vega過程優先權類。註意,該優先權只在vegaNT下能用,而在SGI上的vega中不存在。
vega線程優先權層所有的範圍是31—39,使用32時優先權最高。
註意:為解決平臺之間兼容性的問題,對於指定論vega的優先權類和線程層優先權而使用的數字值不同於由Windows使用的那些項目的實際數字值,vegaNT將把表3.1和表3. 2 中的值轉化為適合WiIndows的數值。
vgSystem函數的VGSYS_APPPRI屬性用於為請求線程選擇Vega線程的優先權層;
vgSystem函數的VGSYS—ISECTPROC屬件用於選擇壹個異步交叉線程,在另壹個CPU起作用的情況F使用人量交義進行處理時使用:用vGSYS—ISECTCPU屬性對遠行交叉線程的CPU及其上運行的優先織進行設置,該線程是用VGSYS—ISECTPRI屬性定義的。
vgsystem函數的VGSYS_DBPROC屬性用於選擇壹個不同步的數據庫線程,運行期間在幾何體中進行內存分貝時使用(由vega LADBM模型進行透明處理)。用VGSYS_DBPRI屬性對運行數據庫線程的CPU和在它上曲運行的過程優先權進行設置,該數據庫是用VGSYS_DBCPU屬性定義的。
vgSysdem函數的VGSYS_LPOINTPROC屬性用於選擇壹個同步光點線程,該線程在與繪制線程和方向之間的比較中運行,並為光點計算可見性。
系統回調
有以下7種回調類型,這些回調是利用系統對vgAddFunc公***程序函數的調用進行註冊的。
VGSYS_PRESYNC———只在pfSync之前調用;
vGSYS_POSTSYNC——在pfSync之後和在與IO設備同步後調用;
vGSYS_PRECONFIG——只在系統配置之前調用;
VGSYS—POSTCONPIG———在配置系統之後調用:
VGSYS—PREFRAME——只在pfFrame之前調用;
VGSYS_POSTFRAME———在PfFrame之後調用;
VGSYS_EXIT——在用戶退出調用的函數之後從vgExit函數中調用。
退出系統
用戶的應用程序不應當調用Exit。為適當地按順序退出應用程序可調用vgExit函數,把壹個整數碼送到vgExit函數中。如果用戶的應用程序以壹個錯誤的結果退出系統,則會使該碼為負數。
如果以用戶碼的壹個結果退出執行的任務時,需在調用vgIniSys函數之後使用vgUserExit函數安裝用戶的退出函數。 —旦安裝完畢,將以vgExit程序開始調用該用戶的退出函數。如果不希望用戶的函數終止程序,則用戶的退出函數應返回-1。使用vgExit函數時要特別仔細。用戶已註冊的回調函數的內部不調用vgExit函數,是為了避免死循環。用戶的模型也可以安裝VGSYS_EXIT回調函數,因此使用考調用vgExit函數時會通知它們。
使用vgExitKey函數會讓系統記錄壹個鍵,當打開輸入時,選擇該錫會使程序退出。該鍍由它的ASCII碼給定。如果未指定該鍍,vgGetExitKey函數將返回先前定義的退出鍵ASCII碼,當前從未定義時返回-1。當任意壹個程序打開窗口確認定義的鏈己被按下,則調用vgExitt函數。鼠標光標所在的窗口就是當前窗口,只要在當前窗口上進行輸入,窗口就會識別出該鍵是否按下。
時間
vgGettime函數以秒為單位返回調用vgInitSys函數的時間,返回值為雙精度浮點數,具有系統支持的最高精度;vgGetRunTime函數以秒為單位返回繪制第壹幀時所用的時間:vgGetFrameTime函數返回從開始繪制第壹幀到員後開始調用vgFrame函數之間的時間;vgGetDeltaFrameTime函數返回當前幀的開始點和前壹幀的開始點之間的時間。
double vgGetTime(void);
double vgGetRunTime(void);
double vgGetFrameTime(void);
double vgGetDeltaFrameTime(void);
模決的可用性
vega還提供4種另外的函數,把它們加到與vega產品模塊有關的內容上(即特殊效果,LADBM)。
int vgAddModAvail (char *name);
int vgPindModAvail (char *name);
char *vgGeModAvail (int idx );
int v8GetNumModAvail(void);
vgAddModAvail 函數由壹個產品模塊的初始函數調用,它把模塊名加到可用模塊的列表中。這樣並不能打開或提供任何相關的已命名產品模塊,而只是把產品模塊名放置到壹個能從內核中查詢的列表中。作為特殊情況.在壹個產品模塊初始化時,在確定使用許可協議對它的操作有效之後,格在列表中增加該產品模塊的名字。
如果壹個特定的產品模塊為用戶所使用,則在使用函數vgConfigSys配置之後任意時刻都能調用函數vgFindModAvail來查詢模塊的可用性。需要給該函數提供模塊名稱,它返回查詢產品名稱的壹個索引列表,如果產品模塊不可用,則返回-1。vgGetModAvail函數通過列表中的索引號返回壹個產品模塊的名稱,索引號的開始值為()。
vgGetNumModAvail函數返回列表中產品模塊的個數。
事件管理
這壹節包含的信息有助於vega產品模塊的開發。壹個產品模塊是壹個為vega提供新增功能的庫。下面介紹在vega中管理事件的基本概念。這並不是預期使壹個產品模塊如何成為實際應用程序的函數。
vega提供的建模行為是通過自行管理的事件通知和自行管理的事件活動。這些事件的自行管理特征允許vega產品模塊互相傳遞。vega類記錄器(vega Class Recorder c_vegaVCR)同樣是壹個可選的Vega產品模塊,從而當需要發生事件(事件活動)時,利用這個裝置通知那些相同的模塊,模塊事件發生了:
#include
void vgRegisterInstance (vgCommon *handle, void *name);
unsigned vgAddEventFunc (vgCalback *eventHandler,size_t event DataSize);
void vgEvent()ccurred (vgCommon *handle,unsigned eventId,void *edata):
vgRegisterInstance ()函數用於記錄vega或利用任意需要這樣通知的任意模塊的產品模塊類事件。參數如下;
. handle——指向被註冊事件句柄的壹個指針。
. name——vega類名或利用正在註冊的句柄的產品模塊事件。
下面代碼表示壹個特殊效果模塊應如何使用壹個特殊VCR類事件記錄它所有的事件。
unsigned num=vgGetNumFx();
for(i=0;i<num;i )
vgAddEventFunc((vgFx *)vgGeoFX(i),vcrName);
vgAddEventFunc()函數允許產品模塊使用vega事件函數提供的模塊地址作記錄,當vega處理和重建壹個特殊事件時調用事件函數。 vgAddEventFunc()函數返回壹個產品模塊和使用引入該事件的vega事件標識符eventId,其參數為:
. EventHandler——指向管理這壹特定事件的事件管理器地址的壹個指針。器攀控如何重建該事件的詳細情況。
. EventDataSize——以字節數表示與該事件關聯的數據大小。
vegaVCR是壹個使用該機構的壹個產品模塊的例子,當在PLAyBACK方式下,VCR遇到壹個事件標識符(eventId)信息包,該信息包包含了不在預先指定的vegaVCR事件的有效範圍內的事件標識符,VCR將調用已註冊的事件函數模塊,該模塊即相當於產品模塊信息包的事件標識符eventId,用於通知需要出現事件的產品模塊。 下段代碼舉例說明壹個應用程序如何註冊壹個事件管理器以便確定使用控制交叉、選擇和繪制的方法穿越壹個節點的穿越掩碼。
unsigned afterburnerEventId=vgAddEventFunc(setAfterBurners,sizeof(float));
vgEventOccurred函數用於通知已經發生壹個Vega事件,vega能通知需要這種通紀的任何模塊。其參數為:
. Handle——指向剛剛獲得事件的事件旬柄的壹個指針。
. EventId——描述該事件的惟壹參數值(該值從vvgAddEventFunc函數中返回)。
. Edata——指向數據結構的壹個指針,該結構包含處理和重建該事件所必須的事
件數據。
下段代碼舉例說明壹個特殊效果模塊如何通知
的時間。
void vgFxSetTime(vgFx *fx,int which, doubte val)
{
struct_eventdata
{
double val;
int which;
} eventdata;
switch((vgFxTimeProp)which)
{
case VGFX_STARTTIME;
if(val=VGFX_NOW)
{
st=vgGetTime() eventdata.val=val;
}
else { st=val;
eventdata.val=val-vgGetTime();
break;
...
vgEventOccurred(fx,setTimeEventId,&eventdata);
}