
Taichi GUI 怎么開啟 fast_gui 模式提升 set_image 實時可視化幀率【免費下載鏈接】taichiProductive, portable, and performant GPU programming in Python.項目地址: https://gitcode.com/GitHub_Trending/ta/taichi在 Taichi 中用內置 GUI 做實時可視化時一個常見的卡點是窗口稍大gui.set_image()每幀都刷不動FPS 明顯掉下來。Taichi 的 GUI 系統提供了一個fast_gui模式來解決這個問題——讓圖像數據直接寫入幀緩沖區省掉每幀的格式轉換與拷貝。本文給出開啟方式、該模式對輸入數據的硬性約束以及倉庫測試中使用的核對方法。以下內容基于倉庫中的 GUI System 文檔、GUI 實現源碼 與 fast_gui 測試。為什么 set_image 在窗口較大時幀率上不去按 GUI System 文檔 的說明默認模式下每一次gui.set_image()調用GUI 系統都會把圖像數據轉換成可顯示格式再把結果拷貝到窗口緩沖區。窗口越大這份每幀轉換加拷貝的開銷越大很難維持高 FPS。fast_gui模式針對的正是這種“只調set_image()、不使用任何繪制命令”的場景。開啟后 Taichi GUI 直接把圖像數據寫入幀緩沖區不做額外拷貝文檔原話是這會significantly increases FPS。開啟 fast_gui 模式創建ti.GUI時傳入fast_guiTrue即可文檔給出的寫法gui ti.GUI(Fast GUI, res(400, 400), fast_guiTrue)完整的渲染循環保持與默認模式一致gui.show()必須放在while循環內否則窗口會閃一下就消失gui ti.GUI(Fast GUI, res(400, 400), fast_guiTrue) image ti.Vector.field(3, ti.f32, shape(400, 400)) while gui.running: # 在這里更新 image gui.set_image(image) gui.show()倉庫中的實際用例可參考 marching squares 示例它用ti.GUI(2D Marching Squares, resresolution, fast_guiTrue)在循環里逐幀調用gui.set_image(pixels)渲染等值線。另一種可選路徑如果你不方便修改構造調用ti.GUI的構造實現支持用環境變量TI_GUI_FAST覆蓋fast_gui參數見 GUI 實現 中fast_gui self.get_bool_environ(TI_GUI_FAST, fast_gui)一行。fast_gui 模式對輸入數據的硬性約束fast_gui能否正常工作取決于傳給gui.set_image()的數據格式。文檔要求輸入必須是可顯示格式若是 Taichi field只能是以下兩種兼容 RGB 的向量場ti.field(3, dtype, shape)兼容 RGBA 的向量場ti.field(4, dtype, shape)其中dtype必須是ti.f32、ti.f64或ti.u8之一。此外還有兩條默認模式同樣存在、但 fast_gui 下不能違反的約束圖像 shape 必須與 GUI 窗口分辨率完全一致文檔明確提示 Ensure that the input matches the resolution of the GUI window只能傳ti.Vector.field普通標量場或 NumPy ndarray 在該模式下不受支持。違反時set_image會直接拋出斷言錯誤信息來自 GUI 實現 中的set_image傳入了非ti.Vector.fieldOnly ti.Vector.field is supported in GUI.set_image when fast_guiTrueshape 與窗口分辨率不一致Image resolution does not match GUI resolution通道數不是 3 或 4Only RGB images are supported in GUI.set_image when fast_guiTruedtype 不在ti.f32 / ti.f64 / ti.u8中Only f32, f64, u8 are supported in GUI.set_image when fast_guiTrue也就是說如果你的可視化里還要調gui.line、gui.circle等繪制命令或者數據是灰度場就應保持默認的fast_guiFalse用常規set_image路徑。核對 fast_gui 確實生效倉庫測試 test_set_image_fast_gui_with_offset 提供了可直接借鑒的核對方式構造一個已知顏色的 RGB/RGBA 向量場set_image后檢查 GUI 內部的gui.img緩沖區一個長度為寬*高的uint32數組內容是否與預期一致。核心片段如下import numpy as np import taichi as ti n 300 shape (n, n) color 128 img ti.Vector.field(dtypeti.u8, n3, shapeshape) img.fill(color) gui ti.GUI(nametest, resshape, show_guiFalse, fast_guiTrue) gui.set_image(img) fast_image gui.img rgb_color (color 16) (color 8) color ground_truth np.full(n * n, rgb_color, dtypenp.uint32) assert np.allclose(fast_image, ground_truth)判斷標準np.allclose(fast_image, ground_truth)通過說明圖像數據已經按測試期望的方式寫入了 fast 緩沖區。上面打包格式(color 16) (color 8) color來自測試源碼測試同時注明在 macOS 上像素值會額外疊加 alpha 位0xFF 24即(color 16) (color 8) color (0xFF 24)跨平臺核對時以這個差異為準。測試里show_guiFalse參數用于不實際彈出窗口地完成上述檢查。該測試覆蓋的組合是channel取 3 和 4、dtype取ti.u8 / ti.f32 / ti.f64、color取 0、32、64、128、255并且帶 offset 的向量場也在參數化范圍內都可以按同樣方式核對。適用邊界fast_gui只適用于“純set_image()渲染”的場景需要任何 GUI 繪制命令時不要開啟。輸入必須是 3 或 4 通道、ti.f32 / ti.f64 / ti.u8的ti.Vector.fieldshape 與窗口分辨率一致。文檔只承諾該模式顯著提升 FPS沒有給出具體幀率數值如果你的場景不滿足輸入約束應回到默認模式而不是在 fast_gui 下強行轉換數據類型繞過斷言。【免費下載鏈接】taichiProductive, portable, and performant GPU programming in Python.項目地址: https://gitcode.com/GitHub_Trending/ta/taichi創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考