原文鏈接:http://www.aosabook.org/en/vtk.html
作者:Berk Geveci 與 Will Schroeder
可視化工具箱(Visualization Toolkit, VTK)是一種廣泛使用的數(shù)據(jù)處理與可視化軟件系統(tǒng)。它應(yīng)用于科學(xué)計算、醫(yī)學(xué)影像分析、計算幾何、渲染、圖像處理以及信息學(xué)等領(lǐng)域。本章,我們展示一個VTK的簡要概覽,包括一些使之成為一個成功系統(tǒng)的基本設(shè)計模式。
要真正理解一個軟件系統(tǒng),關(guān)鍵之處不僅要理解它能夠解決什么問題,而且還要了解它出現(xiàn)時的特定文化環(huán)境。在VTK的案例中,系統(tǒng)表面看起來要設(shè)計成用于科學(xué)數(shù)據(jù)的三維可視化系統(tǒng)。但VTK出現(xiàn)時的文化語境為奮斗者們添上了一個意義深遠(yuǎn)的背后故事,這有助于解釋軟件為什么是這樣設(shè)計和部署的。
在VTK創(chuàng)生和開始編寫之時,它的初始作者(Will Schroeder、Ken Martin、Bill Lorensen)還是GE研發(fā)部門的科研人員。我們向一個名為LYMB的先驅(qū)性系統(tǒng)投入了大量精力,該系統(tǒng)是一種以C實(shí)現(xiàn)的、類似Smalltalk的開發(fā)環(huán)境。在那個時代,它是一個偉大的系統(tǒng),我們作為科研人員一再地被阻止在兩大障礙上:1)IP問題(此處意指知識產(chǎn)權(quán)(Intellectual Property, IP)——譯注。)和2)非標(biāo)準(zhǔn)的、有所有權(quán)的軟件。IP問題之所以是個問題,是因?yàn)橐坏〨E公司的律師介入,那么嘗試將軟件向公司外部公布軟件就幾乎不可能了。第二,即使我們在GE公司內(nèi)部部署軟件,許多我們的用戶也會受制于學(xué)習(xí)一個有所有權(quán)的、非標(biāo)準(zhǔn)系統(tǒng),因?yàn)闉榱苏莆账鞒龅呐Σ荒茉谒x開公司后轉(zhuǎn)移到新的雇主那里;并且,這種軟件沒有標(biāo)準(zhǔn)工具集所提供的廣泛支持。于是,VTK的原始動機(jī)就是開發(fā)一個開放標(biāo)準(zhǔn),或曰“協(xié)作平臺”,通過它,我們能夠很容易地將技術(shù)傳授給我們的用戶。因此,為VTK選擇一個開源許可證或許是我們所做出的最重要的設(shè)計決策。
最終選擇了非互利的、自由的許可證(比如:選BSD(即BSD許可證(Berkeley Software Distribution License,BSD)。——譯注。)而不選GPL(即GPL許可證(GNU General Public License)?!g注。))在事后證明是一個值得效仿的決策,因?yàn)樗罱K使基于商業(yè)的服務(wù)和咨詢成為可能,而這正成就了Kitware。在我們做出這個決定的時候,我們最感興趣的是降低與學(xué)術(shù)界、研究機(jī)構(gòu)以及商務(wù)實(shí)體之間合作的壁壘。我們從那時也發(fā)現(xiàn),許多組織都避免使用互利性許可證,由于它們可能造成的嚴(yán)重問題。事實(shí)上,我們可能會爭論互利性許可證在延緩開源軟件的接收上有很大作用,但這另當(dāng)別論。這里的要點(diǎn)是:與任何軟件系統(tǒng)相關(guān)的重要設(shè)計決策之一就是著作權(quán)許可證的選擇。重新審視項(xiàng)目的目標(biāo),然后再恰當(dāng)?shù)亟鉀QIP問題是很重要的。
VTK最初是以一個科學(xué)數(shù)據(jù)可視化系統(tǒng)出現(xiàn)的??梢暬I(lǐng)域之外的許多人都天真地把它當(dāng)成一種特殊的幾何渲染:查看虛擬物體并與之交互。盡管這些確實(shí)是可視化的一部分,但是通常的數(shù)據(jù)可視化還包括把數(shù)據(jù)轉(zhuǎn)換成感知性輸入的整個過程,典型的數(shù)據(jù)是圖像,此外還包括觸覺、聽覺等其他形式。數(shù)據(jù)形式不僅由幾何拓?fù)浣Y(jié)構(gòu)組成——比如像網(wǎng)格或者復(fù)雜空間分解等抽象形式,還有核心結(jié)構(gòu)的屬性,諸如標(biāo)量(如:溫度或壓強(qiáng)),矢量(如:速度),張量(如:應(yīng)力與張力),以及渲染屬性,諸如表面法線和紋理坐標(biāo)等。
注意,通常情況下,表示時空信息的數(shù)據(jù)被看做是科學(xué)可視化的一部分。然而,還有更抽象數(shù)據(jù)形式,比如市場統(tǒng)計資料、網(wǎng)頁、文檔以及其它信息,它們只能通過諸如非結(jié)構(gòu)文檔、表格、圖和樹等抽象(即:非時空)關(guān)系來表示。這些抽象數(shù)據(jù)一般通過信息可視化的方法來處理。在社區(qū)的幫助下,VTK現(xiàn)在能夠完成科學(xué)可視化和信息可視化方面的工作。
作為一種可視化系統(tǒng),VTK的角色是以這些形式獲取數(shù)據(jù),并最終將它們轉(zhuǎn)換成利于人類感官理解的形式。因此,VTK的核心需求之一就是創(chuàng)建數(shù)據(jù)流管線的能力,這種管線能夠讀入、處理、表示并最終渲染數(shù)據(jù)。這樣,工具箱就必須構(gòu)建成一個靈活的系統(tǒng),它的設(shè)計在許多層面上反映了這一點(diǎn)。例如,我們有目的地將VTK設(shè)計成這樣一種工具箱,它具有許多可互換的組件,這些組件可以組合起來用于處理多種數(shù)據(jù)。
在深入介紹VTK特殊的架構(gòu)特性之前,先介紹頂層的概念,它們系統(tǒng)的開發(fā)和使用都產(chǎn)生了深遠(yuǎn)的影響。其中之一就是VTK的混合包裝設(shè)施。該設(shè)施從VTK的C++實(shí)現(xiàn)自動生成Python,Java,和Tcl等的語言綁定(還可綁定更多的語言,并且有些已經(jīng)實(shí)現(xiàn)了——譯注)。最具實(shí)力的開發(fā)者將使用C++進(jìn)行工作。使用者和應(yīng)用程序開發(fā)者也可以使用C++,但是通常情況下,上文提到的解釋性語言更加適合這兩個群體?;旌系木幾g性/解釋性環(huán)境將這兩個領(lǐng)域的優(yōu)勢結(jié)合在了一起:計算密集型算法的高性能和樣機(jī)或開發(fā)的靈活性。事實(shí)上,這種多語言計算的方法在許多科學(xué)計算社區(qū)中得到廣泛應(yīng)用,并且許多團(tuán)隊(duì)將VTK作為他們自己軟件的一個范本。
就軟件過程而言,VTK采用CMake來控制構(gòu)建過程;CDash/CTest用于測試;然后CPack用于跨平臺部署。VTK確實(shí)可以在幾乎任何計算機(jī)上進(jìn)行編譯,包括因其簡陋的開發(fā)環(huán)境而聲名狼藉的超級計算機(jī)。此外,開發(fā)工具外圍還包括網(wǎng)頁、wiki、郵件列表(用戶區(qū)和開發(fā)者區(qū)),文檔生成設(shè)施(即:Doxygen)和bug追蹤系統(tǒng)(Mantis)。
由于VTK是面向?qū)ο笙到y(tǒng),在其內(nèi)部,對類的訪問和數(shù)據(jù)成員的實(shí)例化都被小心地管理起來。通常情況下,所有的數(shù)據(jù)成員的訪問權(quán)限均為protected或private。通過Set
和Get
方法來訪問這些數(shù)據(jù)成員,這兩種方法具有各種類型的形參,例如:布爾型數(shù)據(jù)、模態(tài)數(shù)據(jù)、字符串、以及向量。這些方法中的多數(shù)的創(chuàng)建是通過向類的頭文件中插入宏來實(shí)現(xiàn)的。例如:
vtkSetMacro(Tolerance, double);
vtkGetMacro(Tolerance, double);
可以展開為如下形式:
virtual void SetTolerance(double);
virtual double GetTolerance();
使用這些宏的原因已經(jīng)超出了僅僅使代碼清晰。VTK中有重要的數(shù)據(jù)成員控制調(diào)試、更新對象的修改時間(MTime)、并恰當(dāng)?shù)毓芾硪糜嫈?shù)。這些宏正確地操作這些數(shù)據(jù),因而強(qiáng)烈推薦使用它們。例如,當(dāng)一個對象的修改時間沒有得到恰當(dāng)?shù)墓芾頃r,VTK中就會出現(xiàn)一個尤其嚴(yán)重的bug。在這種情況下,代碼就不會按其應(yīng)該運(yùn)行的方式運(yùn)行,或者還會執(zhí)行多次。
VTK的優(yōu)勢之一就是其相對簡單的用于表示和管理數(shù)據(jù)的方法。典型的情況下,各種特殊數(shù)據(jù)(例如:vtkFloatArray
)的數(shù)組用于表示信息的連續(xù)片段。例如:一個裝載有三個三維坐標(biāo)點(diǎn)的表可以用具有9個元素的vtkFloatArray
來表示。這些數(shù)組有一種元組的記法,故有一個三維坐標(biāo)點(diǎn)即一個3元組,而一個對稱的3×3張量矩陣可以由一個6元組表示()。專門采用這種設(shè)計是因?yàn)樵诳茖W(xué)計算中,與操作數(shù)組的系統(tǒng)(例如:Fortran)接口是很常見的,并且這樣還能使對大塊連續(xù)數(shù)據(jù)的內(nèi)存分配與回收變得更加高效。再者,連續(xù)數(shù)據(jù)的通信、串行、以及IO操作通常更有效率。這些(可以加載各種類型數(shù)據(jù)的)核心數(shù)據(jù)數(shù)組表示了VTK中的大部分?jǐn)?shù)據(jù),且具有多種方便的方法,以進(jìn)行信息的插入和訪問,包括用于快速訪問的方法、以及在添加更多數(shù)據(jù)時所需要的自動分配內(nèi)存的方法。數(shù)據(jù)數(shù)組是抽象類vtkDataArray
的子類,該抽象類的意義在于:通用的虛方法可用于簡化編碼。但是,為了實(shí)現(xiàn)更高的性能,靜態(tài)的、模版化的函數(shù)被引入,這樣就可以根據(jù)不同的參數(shù)類型進(jìn)行切換,并實(shí)現(xiàn)隨后對連續(xù)數(shù)據(jù)數(shù)組的直接訪問。
即使由于性能方面的原因,模板被廣泛地使用,C++模板通常在公有類的API中也是不可見的。這點(diǎn)在STL中也是如此:我們采用了PIMPL設(shè)計模式來隱藏模版實(shí)現(xiàn)的復(fù)雜細(xì)節(jié)。這種模式為我們提供了很大幫助,尤其是在以前文所述將代碼包裝為解釋性代碼的時候。避免公有API中模板的復(fù)雜性意思是:在應(yīng)用程序開發(fā)者看來,VTK實(shí)現(xiàn)大部分是無需考慮數(shù)據(jù)類型的選擇的。當(dāng)然,在其外殼之下,代碼的執(zhí)行是由數(shù)據(jù)類型來驅(qū)動的,而該數(shù)據(jù)類型則一般是運(yùn)行時訪問數(shù)據(jù)時確定的。
一些用戶很想知道為什么VTK使用引用計數(shù)來管理內(nèi)存而不是垃圾回收這一對用戶來說更為友好的方式。基本的答案是當(dāng)數(shù)據(jù)被刪除的時候,VTK需要對其完全控制,因?yàn)橐幚淼臄?shù)據(jù)量可能十分巨大。例如,一組1000×1000×1000字節(jié)的體數(shù)據(jù)的數(shù)據(jù)量是1G字節(jié)。把這么大的數(shù)據(jù)留在內(nèi)存中等待垃圾回收器來決定是否應(yīng)該釋放它們,確實(shí)不是一個好主意。在VTK中,大部分類(vtkObject
的子類)具有內(nèi)建的引用計數(shù)能力。每個對象都包含有一個引用計數(shù),它在該對象實(shí)例化時被初始化為1。每次使用該對象都會進(jìn)行注冊,然后引用計數(shù)就加1。類似地,當(dāng)使用該對象進(jìn)行了反注冊(或者等效地認(rèn)為該對象被刪除),那么引用計數(shù)就會減1。最終的對象引用計數(shù)減至0,此時該對象自毀。下面列舉一個典型的例子:
vtkCamera *camera = vtkCamera::New(); // reference count is 1
camera->Register(this); // reference count is 2
camera->Unregister(this); // reference count is 1
renderer->SetActiveCamera(camera); // reference count is 2
renderer->Delete(); // ref count is 1 when renderer is deleted
camera->Delete(); // camera self destructs
這里還有另外一個關(guān)于為什么引用計數(shù)對于VTK很重要的原因——它提供了有效復(fù)制數(shù)據(jù)的能力。例如:想象有一個數(shù)據(jù)對象D1,它由許多數(shù)據(jù)數(shù)組組成:點(diǎn)、多邊形、顏色、標(biāo)量、以及紋理坐標(biāo)等?,F(xiàn)在假設(shè)處理該數(shù)據(jù)來生成一個新的數(shù)據(jù)對象D2,此對象與第一個對象相同,還外加了向量數(shù)據(jù)(用于定位點(diǎn))。一種浪費(fèi)資源的方式是完全復(fù)制(深拷貝)D1來創(chuàng)建D2,然后向其中加入新的向量數(shù)據(jù)數(shù)組。另有一種方法,我們創(chuàng)建一個空的D2,然后將D1中的數(shù)組傳給D2(淺拷貝),使用引用計數(shù)來追蹤數(shù)據(jù)所有權(quán),最終向添加新的向量數(shù)組。后者方法避免了復(fù)制數(shù)據(jù),這正如前文所述,對一個優(yōu)秀可視化系統(tǒng)是必不可少的。我們在本章的稍后內(nèi)容中可以看到,數(shù)據(jù)處理的管線例行公事式地實(shí)現(xiàn)了這種運(yùn)行機(jī)制,即:將數(shù)據(jù)從算法的數(shù)據(jù)復(fù)制至輸出,此時引用計數(shù)對于VTK是必不可少的。
當(dāng)然,引用計數(shù)也有一些臭名昭著的問題。偶爾會存在引用周期,這時循環(huán)中的對象以一種相互支持的配置來引用彼此。這種情況下,就需要明智的介入,或者在VTK中,一種在vtkGarbageCollector
中實(shí)現(xiàn)的特殊設(shè)施就可以用來管理牽涉與上述循環(huán)中的對象。當(dāng)這樣的類被鑒別到的時候(這被期望發(fā)生在開發(fā)過程中),該類就會將其自身注冊至垃圾回收器,并管理其自己的Register
和Unregister
方法的開銷。然后緊接著的對象銷毀(或者反注冊)方法對局部的引用計數(shù)網(wǎng)絡(luò)進(jìn)行拓?fù)浞治?,搜索已?jīng)分離了的相互引用的對象群。這些都將被垃圾回收器予以刪除。
VTK中的多數(shù)實(shí)例化過程是通過一種以靜態(tài)類成員實(shí)現(xiàn)的對象工廠運(yùn)行。典型的語義表達(dá)如下:
vtkLight *a = vtkLight::New();
這里要認(rèn)識到的重要之處是:這里實(shí)際被實(shí)例化的可能不是vtkLight
,可能是vtkLight
的子類(例如:vtkOpenGLLight
)。采用對象工廠的動機(jī)多種多樣,最為重要的是應(yīng)用的可移植性和設(shè)備不相關(guān)性。例如,前文中我們在一個渲染場景中創(chuàng)建了一個光源。在一個運(yùn)行于特定平臺上的特定的應(yīng)用程序中,vtkLight::New
可能會生成一個OpenGL光源,然而在不同的平臺上,存在著圖形系統(tǒng)中其他渲染庫或方法來創(chuàng)建光源的可能性。到底實(shí)例化什么樣的派生類是一種運(yùn)行時系統(tǒng)信息的功能。在早期的VTK中,可以有包括gl、PHIGS、Starbase、XGL、以及OpenGL等多種選擇。然而這些圖形庫中的多數(shù)現(xiàn)在已經(jīng)消失了,出現(xiàn)了包括DirectX和基于GPU方法在內(nèi)的新方法。隨著時間的推移,一個利用VTK寫成的應(yīng)用程序沒必要進(jìn)行修改,因?yàn)殚_發(fā)者已經(jīng)派生出了特定的對應(yīng)于新設(shè)備的vtkLight
的子類和其他渲染類來支持不斷發(fā)展的技術(shù)。另外一個對象工廠的重要用處是使性能增強(qiáng)變動的運(yùn)行時替換成為可能。例如,一個vtkImageFFT
可能取代一個訪問特種用途硬件或數(shù)值計算庫的類。
VTK的一個優(yōu)點(diǎn)就是其表示數(shù)據(jù)復(fù)雜形式的能力。這些數(shù)據(jù)形式包括從簡單表格到有限元網(wǎng)格之類的復(fù)雜結(jié)構(gòu)。所有這些數(shù)據(jù)形式都是vtkDataObject
的子類,如圖24.1所示(注意這是數(shù)據(jù)對象類的繼承圖的一部分)。
圖24.2:數(shù)據(jù)集類
VTK由若干主干子系統(tǒng)組成。與可視化包關(guān)聯(lián)最緊密的子系統(tǒng)或許應(yīng)該是數(shù)據(jù)流/管線架構(gòu)了。從概念上講,管線架構(gòu)由三類基本對象組成:表示數(shù)據(jù)的對象(上文中的vtkDataObject
),將數(shù)據(jù)從一種形式處理、變換、濾波或者映射成另外一種形式的對象(vtkAlgorithm
),以及執(zhí)行管線的對象(vtkExecutive
)——此管線控制著一個由交錯數(shù)據(jù)(?)和過程對象(即:管線)組成的連通圖。圖24.3展示了一個典型的管線。
盡管這是交互的一種原始形式,它也是許多使用VTK的應(yīng)用程序的基本要素。例如:上述的簡短代碼可以很容易地轉(zhuǎn)換、用于顯示并管理圖形界面中的進(jìn)度條。這一命令/觀察者子系統(tǒng)也是VTK中三維掛件的核心,這些掛件是用于數(shù)據(jù)的請求、操縱以及編輯的復(fù)雜的交互性對象,下文將予以描述。
提到上面的例子,很重要的一點(diǎn)是,VTK中的事件都是預(yù)定義的,但是這里也為自定義事件開了后門。vtkCommand
類定義了一組枚舉型事件(例如:上面例子中的vtkCommand::ProgressEvent
)以及一個用戶事件。UserEvent
只是一個整形數(shù)值,一般用作一組應(yīng)用程序中自定義事件的起始抵消值。于是,vtkCommand::UserEvent+100
可能是指一個VTK預(yù)定義的事件之外的某個事件。
從用戶的角度來看,一個VTK掛件可以看作是場景中的一個演員,只是用戶可以通過操縱句柄或者其它幾何特性(句柄操縱與幾何特性操縱均是基于前文所述之抓取功能——原文:picking functionality,即24.2.4一節(jié)中最后一段所述——的)來與之交互。與掛件的交互是很直觀的:用戶抓住球面句柄并將其移動,或者抓住一條直線并將其移動。然而,在場景的背后,事件被發(fā)送出去(例如:InteractionEvent
),而一個編寫合理的應(yīng)用程序就能夠觀察到這些事件,并采取恰當(dāng)?shù)男袆印@?,它們通常由下面所給出的vtkCommand::InteractorEvent
所觸發(fā):
vtkLW2Callback *myCallback = vtkLW2Callback::New();
myCallback->PolyData = seeds; // streamlines seed points, updated on interaction
myCallback->Actor = streamline; // streamline actor, made visible on interaction
vtkLineWidget2 *lineWidget = vtkLineWidget::New();
lineWidget->SetInteractor(iren);
lineWidget->SetRepresentation(rep);
lineWidget->AddObserver(vtkCommand::InteractionEvent, myCallback);
實(shí)際上,VTK掛件由兩個對象構(gòu)建而成:一個是vtkInteractorObserver
的子類,另一個是vtkProp
的子類。vtkInteractorObserver
只是觀察渲染窗中的用戶交互(例如:鼠標(biāo)事件和鍵盤事件)并處理之。這些操縱通常由突出顯示句柄,改變鼠標(biāo)指針的外觀,以及變換數(shù)據(jù)等所組成,它們都會修改vtkProp
的幾何特征。當(dāng)然,這些掛件的特殊細(xì)節(jié)要求編寫子類來控制其行為的細(xì)微差別,目前系統(tǒng)中擁有50多個不同的掛件。
VTK是一個大型軟件工具箱。目前,系統(tǒng)由大約1500萬行代碼(包括注釋,但是不包括自動生成的包裹層軟件),約1000個C++類組成。為了管理系統(tǒng)的復(fù)雜度并減少構(gòu)建和鏈接的時間,系統(tǒng)被分割放置在十幾個子路徑中。表24.1列出了這些子路徑,并簡要總結(jié)了這些庫所提供的功能。
| Common
| VTK核心類 |
| Filtering
| 用于管理管線數(shù)據(jù)流的類 |
| Rendering
| 渲染,抓取,查看圖像,以及交互 |
| VolumeRendering
| 體繪制技術(shù) |
| Graphics
| 三維幾何處理 |
| GenericFiltering
| 非線性三維幾何處理 |
| Imaging
| 圖像處理管線 |
| Hybrid
| 同時要求使用圖形學(xué)和圖像處理功能的類 |
| Widgets
| 復(fù)雜的交互 |
| IO
| VTK的輸入和輸出 |
| Infovis
| 信息可視化 |
| Parallel
| 并行處理(控制器和通信器) |
| Wrapping
| 對Tcl,Python以及Java的包裹的支持 |
| Examples
| 內(nèi)容廣泛、文檔良好的示例 |
表24.1:VTK的子路徑
VTK一直是一個非常成功的系統(tǒng)。雖然第一行代碼于1993年寫出,但是目前,VTK仍然在不斷成長壯大、其開發(fā)速度也在不斷加快2。本節(jié),我們將談?wù)勔恍┙?jīng)驗(yàn)和將來的挑戰(zhàn)。
VTK發(fā)展歷程中,最令人驚嘆的方面之一就是項(xiàng)目的壽命。開發(fā)的速度歸因于若干主要原因:
雖然成長是令人興奮的,確證軟件系統(tǒng)的建立,預(yù)測VTK的未來,但妥善的管理卻是極其困難的。因此,近期VTK將更多地專注于管理社區(qū)以及軟件的成長。為此,已經(jīng)采取了若干措施。
首先,創(chuàng)立了正式的管理架構(gòu)。創(chuàng)建了架構(gòu)審查委員會(Architectural Review Board),來指導(dǎo)社區(qū)和技術(shù)的發(fā)展,專注于高層次的、戰(zhàn)略性的議題。VTK社區(qū)也正在組建一個由意見領(lǐng)袖組成的公認(rèn)的團(tuán)隊(duì),來指導(dǎo)某些VTK子系統(tǒng)的技術(shù)開發(fā)。
其次,制定了關(guān)于更進(jìn)一步使工具箱模塊化的計劃,尤其是應(yīng)對由git引入的工作流功能,還認(rèn)識到使用者和開發(fā)者一般都想在工作中使用工具箱中小的子系統(tǒng),并且不想構(gòu)建并鏈接整個包。此外,為了支持不斷成長的社區(qū),對新的功能和子系統(tǒng)的支持是很重要的,即使它們并不一定是工具箱的核心部分。通過創(chuàng)建松散的、模塊化的一群模塊,在維持核心的穩(wěn)定性的同時,適應(yīng)外圍的大量代碼貢獻(xiàn)是可能的。
除了軟件過程之外,在開發(fā)管線當(dāng)中還有許多技術(shù)創(chuàng)新。
最后,Kitware和更加廣泛的VTK社區(qū)決定加入Open Science。從務(wù)實(shí)的角度講,它一個這樣的方式,我們將傳播公開的數(shù)據(jù)、公開的發(fā)表、以及公開的源代碼——這是確保我們正在創(chuàng)建可重現(xiàn)的科學(xué)系統(tǒng)所必需的特征。雖然VTK一直以來都以開源和公開數(shù)據(jù)的系統(tǒng)的形式傳播,但是文檔過程卻一直缺乏。在擁有正式書籍[Kit10,SML06]的同時,還一直有各種非正式的方法來收集包括新的源碼在內(nèi)的技術(shù)發(fā)表物。我們正在通過開發(fā)像是VTK Journal3的新的發(fā)表機(jī)制來改善這種狀況,該期刊可以發(fā)表由文檔、源代碼、數(shù)據(jù)、以及有效的測試圖像組成的文章。它還實(shí)現(xiàn)了自動化的代碼審查(利用VTK的高質(zhì)量的軟件測試過程)以及人對遞交文章的審查。
雖然VTK很成功,但是還有許多事情我們沒有處理好:
vtkImageClass
,它內(nèi)部處理像素數(shù)據(jù)組成的數(shù)組。然而,在某些情況下,我們不得不將之重構(gòu)為小的片段,并繼續(xù)這一過程。一個基本的例子就是數(shù)據(jù)處理管線。最初,數(shù)據(jù)管線是通過數(shù)據(jù)和算法對象的交互而隱式實(shí)現(xiàn)的。我們最終認(rèn)識到我們得創(chuàng)建一種顯式的管線執(zhí)行對象來協(xié)調(diào)數(shù)據(jù)與算法之間的交互,并且用于實(shí)現(xiàn)不同的數(shù)據(jù)處理策略。像VTK這樣的開源系統(tǒng)的好處之一是許多這些錯誤能夠并且將會隨著時間而得以糾正。我們擁有一個積極的、有能力的開發(fā)社區(qū),他們每天都在改進(jìn)著這個系統(tǒng),并且我們希望在可預(yù)見的將來,這一狀態(tài)能夠維持下去。
腳注
1.?http://en.wikipedia.org/wiki/Opaque_pointer.
2. See the latest VTK code analysis at?http://www.ohloh.net/p/vtk/analyses/latest.
3.?http://www.midasjournal.org/?journal=35.
更多建議: