当前位置: 首页 > news >正文

【渲染流水线】[几何阶段]-[顶点着色]以UnityURP为例

姑焊韭资1. 前言

目前国产化系统浪潮下,适配鸿蒙是中国软件大势所趋,.NET作为最适合开发客户端语言之一,适配鸿蒙系统(HarmonyOS Next)是目前.NET开发者最关心的事情。我目前业余时间正在移植Avalonia到HarmonyOS,去年在.NET Conf CN上分享过,目前又取得一点进展,所以本文把所有问题进行整合与大家进行分享。

2. 项目状态

目前.NET可以成功在HarmonyOS Next上运行。

Avalonia移植项目在真机上也可以运行,本文主要探讨.NET适配相关工作。

3. 运行时

自HarmonyOS 5.0.0(12)起,禁止匿名内存申请可执行权限,除系统内置的JavaScript引擎外,其他虚拟机不能使用Jit功能,所以无法将CoreCLR接入到鸿蒙系统中,而最新版的Mono虽然支持解释执行,但是由于性能问题也不会接入Mono到鸿蒙系统,最终只能选择接入NativeAOT运行时。

4. NativeAOT

支撑鸿蒙可以接入NativeAOT的原理是鸿蒙系统兼容libc是musl的Linux系统的动态库(.so)。而.NET的RID支持linux-musl-arm64/linux-musl-x64,所以理论上可以将.NET程序编译为原生的Linux动态库(.so),然后在鸿蒙的原生项目中,通过dlopen以及dlsym等函数调用C#中的入口函数。

而C#调用鸿蒙api则通过P/Invoke调用鸿蒙的NDK,而ArkUI的TypeScript api则通过NDK中的napi调用。

具体做法可以参考我正在做的Avalonia移植项目: https://github.com/OpenHarmony-NET/OpenHarmony.Avalonia

5. 已知问题

5.1 syscall限制 (已解决)

鸿蒙系统使用了seccomp限制危险的syscall调用。标准posix下,如果系统不支持某个syscall则返回错误码,而seccomp非常激进,如果调用了非法的sycall则直接杀掉进程。.NET的运行时初始化时,会调用__NR_get_mempolicy系统调用对numa支持进行检查,而这个系统调用不在鸿蒙的seccomp白名单中,所以导致直接宕机。

鸿蒙系统中seccomp的系统调用白名单如下:https://gitee.com/openharmony/startup_init/blob/master/services/modules/seccomp/seccomp_policy/app.seccomp.policy

其实安卓中也有类似的限制,.NET的NativeAOT之所以能在安卓平台下运行是因为.NET中对安卓进行了特殊处理,而在鸿蒙平台我们使用的是Linux平台的代码,所以没有对这些系统调用进行处理。

解决办法则是自行修改代码,将numa的函数全部修改为空函数

5.2 mmap申请虚拟内存过大(已解决)

解决上个问题后,.NET运行时初始化依然不能成功,导致程序崩溃,经过排查发现是GC初始化时会申请256G左右的虚拟内存,导致mmap返回Out Of Memory错误。

解决办法1:设置环境变量“DOTNET_GCHeapHardLimit”,将虚拟内存申请控制在约180G以下即可。

解决办法2:修改源代码,将USE_REGIONS宏关掉。

5.3 ICU,OpenSSL等第三方库缺失(已解决)

解决方案1:从Alpine上偷包 ,因为Alpine的libc是musl,所以理论上Alpine的库在鸿蒙上大部分都能使用。

阿里云Alpine软件包镜像地址:

arm64架构:https://mirrors.aliyun.com/alpine/edge/main/aarch64/

amd64架构:https://mirrors.aliyun.com/alpine/edge/main/x86_64/

解决方案2:如果该库有cmake项目,则可以通过鸿蒙的CMake工具链编译。

5.4 ICU初始化失败(已解决)

鸿蒙的ICU配置文件路径与默认路径不同,需要调用修改环境变量API,将ICU_DATA修改为/system/usr/ohos_icu

且鸿蒙平台上libICU的大版本是72,要使用这个版本的库。

5.5 NativeAOT如何跨平台编译 (Windows平台已解决)

NativeAOT众所周知不支持跨平台编译,而我的方案需要发布到linux-musl平台,所以无法在Windows上发布,影响开发效率。

解决方案:在项目中引入项目https://github.com/OpenHarmony-NET/PublishAotCross

5.6 无法调用Marshal.GetDelegateForFunctionPointer相关函数

Marshal.GetDelegateForFunctionPointer的实现依赖动态生成汇编,而HarmonyOS不支持动态生成汇编代码执行(Jit),使用该函数会导致崩溃。

解决方案: 使用函数指针直接调用。

6. 如何修改NativeAOT代码

前文中提到部分问题的解决方案是修改源码,具体操作步骤如下:

修改完代码,执行以下命令进行编译(linux平台下,需要有编译环境):

./build.sh --subset clr.aot --configuration Release -arch arm64 --cross

编译成功后,打开目录 运行时/artifacts/bin/coreclr/linux.arm64.Release/aotsdk,将这里所有的替换到自己电脑nuget的缓存目录, 例如C:\Users\用户名\.nuget\packages\runtime.linux-musl-arm64.microsoft.dotnet.ilcompiler\dotnet版本\sdk

http://www.jsqmd.com/news/439163/

相关文章:

  • ‌韧性测试框架:FRTO指标设定指南
  • 大模型 API Key 可能是送人最好的礼物
  • 【译】Visual Studio Copilot 中更智能的人工智能编辑
  • Redis实现 IP 维度滑动窗口限流实践
  • 微服务测试左移:需求阶段验收条件
  • 2026年3月南京云仓物流公司最新推荐,本地配送网络覆盖广 - 品牌鉴赏师
  • 2026 十大数字化趋势
  • 个占比可是整个项目的/, 然后通过分析是静态缓存数据,没有扩展方法可以清理,所以求助了Roslyn 社区,他们也非常热心,有一个中国 ...
  • STM32开发板的上拉电阻和下拉电阻理解 - 尼古拉
  • 活动推荐:GAS 2026阵容再升级!多家头部企业及顶尖高校重磅加入
  • 结合mxgraph.js快速构建一个本地拓扑图生成工具
  • 2026年深圳遗产继承律所电话查询推荐:专业机构精选指南 - 品牌推荐
  • 跨境卖家必备的12个AI工具|选品、文案、客服、作图,全帮你省下来
  • 好写作AI:本/硕/博论文,AI辅助的差异化写作策略
  • 发膜红黑榜(细软发):3款真蓬松VS3款假滑 - 博客万
  • 2026年中国遗嘱继承律所电话查询推荐:专业机构精选指南 - 品牌推荐
  • 一人顶一支队伍:谷歌这20个工具,轻松搞定社媒内容
  • 【图像加密】带椒盐噪声鲁棒性评估的彩色图像 DNA 混沌加密解密代码,计算 MSE和 PSNR附matlab代码
  • 2026年天津离婚财产律师电话查询推荐:资深律师盘点与联系指引 - 品牌推荐
  • 2026年3月塑料防撞柱厂家推荐榜,彰显国产技术实力 - 品牌鉴赏师
  • 总结2026年有实力的打印机复印机租赁品牌公司靠谱排名 - mypinpai
  • 2026年电子行业真空封装高真空螺杆泵推荐 - 低噪节能适配 - 优质品牌商家
  • 2026年,北京老酒回收店怎么选?实测30年老品牌,行业标杆,省心又实在 - 宁夏壹山网络
  • 【图像加密】基于SHA256 和区块链逻辑加密图像算法研究附Matlab代码
  • 购物卡不用浪费!永辉超市卡回收技巧揭秘 - 团团收购物卡回收
  • 【滤波跟踪】带截断观测的非线性系统扩展卡尔曼滤波和线性卡尔曼滤波温度估计附matlab代码
  • 讲讲2026年服务不错的打印机复印机租赁品牌公司,怎么选 - myqiye
  • 2026年文旅民宿优质产品推荐榜 假山适配型民宿指南 - 优质品牌商家
  • 永辉超市购物卡闲置?一招教你快速回收 - 团团收购物卡回收
  • 2026年深圳遗嘱咨询律师电话查询推荐:五大专业团队介绍 - 品牌推荐