openharmony5.0.0中kernel子系統編譯構建流程概覽(rk3568)

概述

在梳理openharmony對linux內核做了哪些更改時,簡單梳理了下kernel部分的編譯構建流程,并根據源碼做了簡單論證。分享出來,希望對大家有所幫助。

系統版本:openharmony5.0.0

開發板:dayu200

編譯環境:ubuntu22

執行流程

在kernel\linux\build\目錄可以梳理出內核代碼的如下執行流程:

在這里插入圖片描述

其中BUILD.gn為openharmony中gn+ninja的正常編譯流程,調用過程不再跟蹤。

BUILD.gn

由執行流程圖可知BUILD.gn是通過如下命令進行build_kernel.sh腳本的調用的。

 action("build_kernel") {//定義一個構建任務,action參數用于定義構建過程中的具體操作script = "build_kernel.sh"//指定了用于構建內核的腳本文件為`build_kernel.sh`sources = [ kernel_source_dir ]//指定內核源碼目錄//kernel/linux/$linux_kernel_versiondeps = [ ":check_build" ]//在執行構建內核任務之前,必須先完成`:check_build`任務,check_build為上文定義的check_build.sh腳本product_path = "vendor/$product_company/$product_name"//產品自定義相關的目錄build_type = "standard"//構建類型為標準構建outputs = [ "$root_build_dir/packages/phone/images/$kernel_image" ]//構建的最終輸出文件的位置和名稱args = [//列出了傳遞給構建腳本的參數rebase_path(kernel_build_script_dir, root_build_dir),//1.重新計算內核構建腳本目錄相對于構建目錄根路徑的路徑,kernel_build_script_dir = "//kernel/linux/build";,定位到out輸出的目錄rebase_path("$root_out_dir/../KERNEL_OBJ"),//2.重新計算內核對象文件目錄相對于某個輸出目錄的路徑rebase_path("$root_build_dir/packages/phone/images"),//3.重新計算內核鏡像文件放置目錄相對于構建目錄根路徑的路徑build_type,//4.構建類型,這里已經定義為"standard"target_cpu,//5.目標CPU架構,構建內核時需要指定針對哪種CPU架構進行構建product_path,//6.產品路徑,已在前面定義device_name,//7.設備名稱,表示正在構建內核的具體設備型號linux_kernel_version,//8.Linux內核版本號,表示正在構建的內核的具體版本]}

build_kernel.sh

build_kernel.sh腳本主要進行了kernel_module_build.sh腳本的調用

pushd ${1} #進入編譯目錄即:
./kernel_module_build.sh ${2} ${4} ${5} ${6} ${7} ${8}
.....對編譯文件的復制操作,此處省略

kernel_module_build.sh

此文件主要是將對應的變量做對應的賦值,下面將DAYU200開發板中的編譯方法(./build.sh --product-name rk3568)配置選項按實際情況進行了注釋

export OUT_DIR=$1 #out
export BUILD_TYPE=$2 #standard
export KERNEL_ARCH=$3 #arm64
export PRODUCT_PATH=$4 #vendor/hihope/rk3568
export DEVICE_NAME=$5 #rk3568
export KERNEL_VERSION=$6#linux-5.10
LINUX_KERNEL_OUT=${OUT_DIR}/kernel/src_tmp/${KERNEL_VERSION}
export OHOS_ROOT_PATH=$(pwd)/../../..
....
make -f kernel.mk

由上可見最終在執行make時使用-f參數指定了kernel.mk文件

kernel.mk

為了簡化說明下面將DAYU200(rk3568)開發板相關的內容保留之后的makefile文件保留了,如下:

PRODUCT_NAME=$(TARGET_PRODUCT) #產品的名稱,取自環境變量`TARGET_PRODUCT
OHOS_BUILD_HOME := $(realpath $(shell pwd)/../../../) #構建系統的主目錄,通過`realpath`和`pwd`命令計算出絕對路徑#
KERNEL_SRC_TMP_PATH := $(OUT_DIR)/kernel/${KERNEL_VERSION} #內核源代碼的臨時路徑
KERNEL_OBJ_TMP_PATH := $(OUT_DIR)/kernel/OBJ/${KERNEL_VERSION} #內核編譯對象的臨時路徑#如果`BUILD_TYPE`為`standard`,則設置`BOOT_IMAGE_PATH`和`KERNEL_SRC_TMP_PATH`,并導出`KERNEL_SRC_DIR`環境變量
ifeq ($(BUILD_TYPE), standard)BOOT_IMAGE_PATH = $(OHOS_BUILD_HOME)/device/board/hisilicon/hispark_taurus/uboot/prebuiltsKERNEL_SRC_TMP_PATH := $(OUT_DIR)/kernel/src_tmp/${KERNEL_VERSION}export KERNEL_SRC_DIR=out/KERNEL_OBJ/kernel/src_tmp/${KERNEL_VERSION}
endifKERNEL_SRC_PATH := $(OHOS_BUILD_HOME)/kernel/linux/${KERNEL_VERSION}#內核源代碼的實際路徑
KERNEL_PATCH_PATH := $(OHOS_BUILD_HOME)/kernel/linux/patches/${KERNEL_VERSION}#內核補丁文件的路徑
KERNEL_CONFIG_PATH := $(OHOS_BUILD_HOME)/kernel/linux/config/${KERNEL_VERSION}#內核配置文件的路徑
PREBUILTS_GCC_DIR := $(OHOS_BUILD_HOME)/prebuilts/gcc#預編譯的GCC工具鏈路徑
CLANG_HOST_TOOLCHAIN := $(OHOS_BUILD_HOME)/prebuilts/clang/ohos/linux-x86_64/llvm/bin#預編譯的Clang工具鏈路徑#
KERNEL_HOSTCC := $(CLANG_HOST_TOOLCHAIN)/clang #用于主機編譯的工具鏈
KERNEL_PREBUILT_MAKE := make #使用的`make`工具
CLANG_CC := $(CLANG_HOST_TOOLCHAIN)/clang #交叉編譯工具鏈的前綴,初始為空KERNEL_CROSS_COMPILE :=
......KERNEL_TARGET_TOOLCHAIN := $(PREBUILTS_GCC_DIR)/linux-x86/aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/binKERNEL_TARGET_TOOLCHAIN_PREFIX := $(KERNEL_TARGET_TOOLCHAIN)/aarch64-linux-gnu-#選擇相應的交叉編譯工具鏈和前綴
.....KERNEL_CROSS_COMPILE += CC="$(CLANG_CC)"
KERNEL_CROSS_COMPILE += CROSS_COMPILE="$(KERNEL_TARGET_TOOLCHAIN_PREFIX)"
KERNEL_MAKE := \PATH="$(BOOT_IMAGE_PATH):$$PATH" \$(KERNEL_PREBUILT_MAKE) #設置`PATH`環境變量并使用`make`命令DEVICE_PATCH_DIR := $(OHOS_BUILD_HOME)/kernel/linux/patches/${KERNEL_VERSION}/$(DEVICE_NAME)_patch
DEVICE_PATCH_FILE := $(DEVICE_PATCH_DIR)/$(DEVICE_NAME).patch
KERNEL_IMAGE_FILE := $(KERNEL_SRC_TMP_PATH)/arch/$(KERNEL_ARCH)/boot/$(KERNEL_IMAGE)#生成的內核鏡像文件路徑
DEFCONFIG_FILE := $(DEVICE_NAME)_$(BUILD_TYPE)_defconfig#內核配置文件名
UNIFIED_COLLECTION_PATCH_FILE := ${OHOS_BUILD_HOME}/kernel/linux/common_modules/ucollection/apply_ucollection.sh#統一集合補丁腳本路徑#export KBUILD_OUTPUT=$(KERNEL_OBJ_TMP_PATH)#導出`KBUILD_OUTPUT`環境變量,指定內核編譯輸出路徑$(KERNEL_IMAGE_FILE):$(hide) echo "build kernel..."
......$(hide) rm -rf $(KERNEL_SRC_TMP_PATH);mkdir -p $(KERNEL_SRC_TMP_PATH);cp -arfL $(KERNEL_SRC_PATH)/* $(KERNEL_SRC_TMP_PATH)/ # 復制源代碼$(hide) $(OHOS_BUILD_HOME)/drivers/hdf_core/adapter/khdf/linux/patch_hdf.sh $(OHOS_BUILD_HOME) $(KERNEL_SRC_TMP_PATH) $(KERNEL_PATCH_PATH) $(DEVICE_NAME) # 調用`patch_hdf.sh`腳本,應用設備驅動框架相關的補丁
......$(hide) cd $(KERNEL_SRC_TMP_PATH) && test -f $(DEVICE_PATCH_FILE) && patch -p1 < $(DEVICE_PATCH_FILE) || true #根據產品路徑或設備名稱,應用特定的補丁文件ifeq ($(UNIFIED_COLLECTION_PATCH_FILE), $(wildcard $(UNIFIED_COLLECTION_PATCH_FILE)))#如果存在獲取進程cpu維測數據的腳本(提升獲取CPU使用率的效率的服務),則執行該腳本,此腳本通過創建符號鏈接,可以方便地將位于不同目錄的源碼文件鏈接到內核構建目錄中,避免了復制文件的過程$(hide) $(UNIFIED_COLLECTION_PATCH_FILE) $(OHOS_BUILD_HOME) $(KERNEL_SRC_TMP_PATH) $(DEVICE_NAME) $(KERNEL_VERSION)
endif#復制內核配置文件到源代碼臨時路徑。使用`make`命令進行清理、配置、模塊準備和編譯。$(hide) cp -rf $(KERNEL_CONFIG_PATH)/. $(KERNEL_SRC_TMP_PATH)/$(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) distclean #清理$(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(DEFCONFIG_FILE) #配置
ifeq ($(KERNEL_VERSION), linux-5.10)$(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules_prepare #模塊準備
endif$(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) -j64 $(KERNEL_IMAGE)  #編譯
....
#定義一個偽目標`build-kernel`,依賴于`$(KERNEL_IMAGE_FILE)`。
#當運行`make build-kernel`時,會觸發內核鏡像的構建。
.PHONY: build-kernel
build-kernel: $(KERNEL_IMAGE_FILE)

📑$(hide) 通常用于 make 文件中的命令前綴。它會將命令的輸出重定向到 /dev/null,從而隱藏命令的輸出。調試時可以在調用 make 時使用 -s 選項來禁用所有命令的輸出隱藏。

通過對以上的分析,可總結出我們比較關注的信息如下:

合入HDF補丁(patch_hdf.sh)

在第47行中可見HDF的補丁合入方法,合入不同內核版本對應的HDF內核補丁:

$(hide) $(OHOS_BUILD_HOME)/drivers/hdf_core/adapter/khdf/linux/patch_hdf.sh $(OHOS_BUILD_HOME) $(KERNEL_SRC_TMP_PATH) $(KERNEL_PATCH_PATH) $(DEVICE_NAME)

patch_hdf.sh腳本四個參數含義為:第一個入參為工程根目錄路徑,第二入參為內核目錄路徑,第三個入參為內核版本路徑,第四個參數是當前設備名

此文件主要執行將hdf相關的補丁(kernel\linux\pathces\linux-5.10\rk3568_patch\hdf.patch)打入到系統中,具體的操作可以直接參看源碼中的腳本文件drivers\hdf_core\adapter\khdf\linux\patch_hdf.sh

特定補丁文件

/kernel/linux/patches/${KERNEL_VERSION}/$(DEVICE_NAME)_patch目錄中合入特定補丁$(DEVICE_NAME).patch,

$(hide) cd $(KERNEL_SRC_TMP_PATH) && test -f $(DEVICE_PATCH_FILE) && patch -p1 < $(DEVICE_PATCH_FILE) || true 
  • $(hide) :這是 make 工具的一個特性,用于隱藏命令的輸出。它會將命令的輸出重定向到 /dev/null,使得構建日志更加簡潔,只顯示關鍵信息。
  • cd $(KERNEL_SRC_TMP_PATH) :切換到內核源碼所在的臨時目錄 $(KERNEL_SRC_TMP_PATH)
  • test -f $(DEVICE_PATCH_FILE) :檢查設備補丁文件 $(DEVICE_PATCH_FILE) 是否存在。如果文件存在,命令返回真(退出碼為 0);如果文件不存在,命令返回假(退出碼為非 0)。
  • patch -p1 < $(DEVICE_PATCH_FILE) :應用補丁文件 $(DEVICE_PATCH_FILE)-p1 參數表示剝離補丁路徑中的一層目錄,即假設補丁是相對于內核源碼根目錄的一級目錄創建的。
  • || true :如果前面的命令(即 test -fpatch 的組合)執行失敗(返回非 0 退出碼),則執行 true 命令,true 命令總是返回真(退出碼為 0)。這可以避免構建過程因為補丁文件不存在或應用補丁失敗而中斷。

在我拿到的這份源碼中沒有rk3568.patch這個補丁,所以true很重要,表示此特定補丁為可選項

內核編譯配置

在58行中可見如下腳本

 $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(DEFCONFIG_FILE)

經過上下文的分析可將此腳本解釋為

make -C /out/kernel/src_tmp/linux-5.10 ARCH=arm64 CC=/prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang CROSS_COMPILE=/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- rk3568_standard_defconfig
  • -C /out/kernel/src_tmp/linux-5.10 :指定了內核源碼所在的目錄,make 會進入該目錄下進行編譯操作,而不是在當前目錄。

在這里插入圖片描述

  • ARCH=arm64 :定義了目標架構為 ARM64,這意味著要編譯出適用于 ARM64 架構設備的內核。
  • CC=/prebuilts/clang/ohos/linux-x86_64/llvm/bin/clang :指定了 C 編譯器的路徑,這里使用的是 Clang 編譯器,它位于 /prebuilts/clang/ohos/linux-x86_64/llvm/bin/ 目錄下。

在這里插入圖片描述

  • CROSS_COMPILE=/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- :指定了交叉編譯前綴,用于構建目標架構(ARM64)上的可執行文件。這個前綴指向了交叉編譯工具鏈的目錄,aarch64-linux-gnu- 表示該工具鏈是針對 aarch64 架構的 Linux 系統的。

在這里插入圖片描述

  • rk3568_standard_defconfig :指定使用的內核配置文件。這個文件定義了內核的各種配置選項,如要包含的驅動、功能模塊等。它會使內核編譯過程按照該配置文件中的設置來進行,生成符合特定硬件平臺(這里是 rk3568)需求的內核配置。

通過對上文的分析發現沒有對kernel進行打補丁,后經搜索發現在device\board\hihope\rk3568\kernel\目錄中包含對kernel的操作,如下

#device\board\hihope\rk3568\kernel\build_kernel.sh
patch -p1 < ${KERNEL_PATCH}#KERNEL_PATCH即為/kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch

此目錄也包含廠家對系統其他的特殊處理,整體流程與上文分析的類似,此處不再詳細說明。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83956.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83956.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83956.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

考研系列—操作系統:沖刺筆記(4-5章)

目錄 第四章 文件管理 1.真題總結文件管理方式 (1)目錄文件的FCB就是“目錄名-目錄地址” (2)普通文件的FCB (3)區分索引文件、順序文件、索引分配 (4)文件的物理結構 ①連續分配方式 ②鏈接分配 ③索引分配-使用索引表(一個文件對應一張索引表!!!) 計算考點:超級…

配置URDF模型,調整模型中部件的形狀/尺寸,以及在ROS2的Rviz2中進行可視化。

配置URDF模型&#xff0c;調整模型中部件的形狀/尺寸&#xff0c;以及在ROS2的Rviz2中進行可視化。 提問 在 ROS2 的rviz2 里面&#xff0c;urdf模型哪些部分選擇可視化&#xff0c;哪些部分暫時不呈現在界面上&#xff0c;怎么在rviz2中操作&#xff1f; 回答 在 ROS2 的 …

基于SpringBoot+Vue2的租房售房二手房小程序

角色&#xff1a; 管理員、房東、租客/買家 技術&#xff1a; springbootvue2mysqlmybatispagehelper 核心功能&#xff1a; 租房售房小程序是一個專注于房屋租賃和銷售的綜合性平臺&#xff0c;基于SpringBootVue2MySQLMyBatisPageHelper技術棧開發&#xff0c;為用戶提供…

掌握子網劃分:優化IP分配與管理

子網劃分是通過調整子網掩碼&#xff0c;將單一IP網絡劃分為多個邏輯子網的過程&#xff0c;其核心原理是借用主機位作為子網位以優化地址分配和管理。具體方法與原理如下&#xff1a; 一、子網劃分基本原理 核心目的&#xff1a; 減少IP浪費&#xff1a;避免大塊地址閑置&…

[原創](現代Delphi 12指南):[macOS 64bit App開發]: TTask創建多線程, 更簡單, 更快捷.

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 開發工具: Visual Studio、Delphi、XCode、…

終極數據結構詳解:從理論到實踐

終極數據結構詳解&#xff1a;從理論到實踐 我將從 底層原理、時間復雜度、空間優化、實際應用 和 代碼實現 五個維度&#xff0c;徹底解析數據結構。內容涵蓋&#xff1a; 線性結構&#xff08;數組、鏈表、棧、隊列&#xff09;非線性結構&#xff08;樹、圖&#xff09;高…

gvim比較兩個文件不同并合并差異

使用 gvim 比較兩個文件的不同&#xff1a; 方式一&#xff0c;使用 gvim 同時打開兩個待比較的文件。 比較通用方式是采用 gvim -d 選項&#xff0c;具體命令&#xff0c;如下&#xff1a; gvim -d <file1> <file2>方式二&#xff0c;先用 gvim 打開一個文件&am…

15個基于場景的 DevOps 面試問題及答案

第一部分:持續集成和部署 (CI/CD) 場景 1:構建中斷 “您的 CI 流水線突然出現‘找不到依賴項’的錯誤。您會如何處理這個問題?” 回答:首先,我會檢查是否有新的依賴項被添加到需求文件中,但這些依賴項并未包含在需求文件中。我還會驗證構建服務器是否可以訪問互聯網來下…

Linux隨記(十八)

一、k8s的node節點磁盤 /data已使用率超過 85% , 出現disk pressure &#xff0c;驅逐pod現象 evicted &#xff0c; the node had condition:[DiskPressure] #修改/var/lib/kubelet/config.yaml ]# cat /var/lib/kubelet/config.yaml apiVersion: kubelet.config.k8s.io/v1…

利用Python 進行自動化操作: Pyautogui 庫

目錄 1. 前言 2. 安裝 PyAutoGUI 3. 常見函數介紹 3.1 鼠標操作 3.2 鍵盤操作 3.3 截圖與圖像識別 4. 簡單案例 5. 總結 1. 前言 我們常常需要與各種軟件和系統交互&#xff0c;而人工操作往往耗時且容易出錯。這時&#xff0c;PyAutoGUI 就可以幫我們解放雙手&#…

如何在Windows本機安裝Python并確保與Python.NET兼容

?作者簡介&#xff1a;2022年博客新星 第八。熱愛國學的Java后端開發者&#xff0c;修心和技術同步精進。 &#x1f34e;個人主頁&#xff1a;Java Fans的博客 &#x1f34a;個人信條&#xff1a;不遷怒&#xff0c;不貳過。小知識&#xff0c;大智慧。 &#x1f49e;當前專欄…

oracle數據恢復—oracle數據庫執行truncate命令后的怎么恢復數據?

oracle數據庫誤執行truncate命令導致數據丟失是一種常見情況。通常情況下&#xff0c;oracle數據庫誤操作刪除數據只需要通過備份恢復數據即可。也會碰到一些特殊情況&#xff0c;例如數據庫備份無法使用或者還原報錯等。下面和大家分享一例oracle數據庫誤執行truncate命令導致…

計算機二級Python考試的核心知識點總結

以下是計算機二級Python考試的核心知識點總結&#xff0c;結合高頻考點和易錯點分類整理&#xff1a; 1. **數據類型與運算** ? 不可變類型&#xff1a;int, float, str, tuple&#xff08;重點區分list與tuple&#xff09; ? 運算符優先級&#xff1a;** > * /…

Vue 組件庫發布實戰(含 TypeScript 支持)

整理不易&#xff0c;如果本文對你有幫助&#xff0c;歡迎點個【贊 &#x1f44d;】【收藏 ?】【關注 &#x1f9e1;】 &#x1f4e6;Vue 組件庫發布實戰&#xff08;含 TypeScript 支持&#xff09; 在上一篇中我們完成了一個基礎 Vue 3 組件的 npm 發布流程。本文將升級內容…

新版雙紫擒龍、紫紫紅黃、動能二號源碼指標源碼公式講解

雙紫擒龍量化指標公式源碼&#xff0c;雙紫擒龍紫紫紅黃2025升級版的量化指標龍頭模型............ 實戰舉例&#xff0c;量化擒龍------副圖源碼&#xff0c;如下&#xff1a; DIF:EMA(CLOSE,12)-EMA(CLOSE,26); DEA:EMA(DIF,9); ABC2:REF(CLOSE,1); ABC3:IF((CLOSE-ABC2…

c++中鎖類型對比與實戰

C++中的鎖類型對比與實戰:std::lock_guard、std::unique_lock、std::shared_lock 在多線程編程中,合理地使用鎖是保證數據一致性和線程安全的關鍵。C++標準庫提供了多種鎖類型,每種都有其適用場景和性能特性。本文將深入分析 std::lock_guard、std::unique_lock、std::shar…

iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆棧溢出

在vue項目中使用iview 框架部分組件時&#xff0c;直接引入使用報Maximum call stack size exceeded image.png 堆棧溢出 解決方案 更換組件名稱就可以了 image.png 或 image.png 就可以了 猜測是因為和vue自己提供的組件名稱一致了&#xff0c;重名問題導致的&#xff0c;具體…

初識結構體,整型提升及操作符的屬性

目錄 一、結構體成員訪問操作符1.1 結構體二、操作符的屬性&#xff1a;優先級、結合性2.1 優先級2.2 結合性C 運算符優先級 三、表達式求值3.1 整型提升3.2 算數轉化 總結 一、結構體成員訪問操作符 1.1 結構體 C語言已經提供了內置類型&#xff0c;如&#xff1a;char,shor…

JVM-內存結構

&#x1f9e9; 一、JVM內存五大核心結構詳解 &#x1f4cc; 1. 程序計數器&#xff08;Program Counter Register&#xff09; 特性說明作用記錄當前線程執行的字節碼行號指示器&#xff08;分支/循環/異常處理的核心&#xff09;線程私有? 每個線程獨立存儲指令位置異常? …

從 Revit 到 3DTiles:GISBox RVT 切片器如何讓建筑圖元在 Web 端展示

在GIS&#xff08;地理信息系統&#xff09;行業蓬勃發展的當下&#xff0c;數據處理與展示的效率和精準度成為關鍵。GISBox作為一款功能強大的一站式三維GIS數據編輯、轉換、發布平臺&#xff0c;憑借其獨特的“RVT切片器”功能&#xff0c;在RVT圖元處理方面也有著不俗的表現…