发布时间:2026/7/17 5:34:55
ARKit与RealityKit实战:从零构建可交互AR游戏场景 1. 项目概述从ARKit到你的第一个AR游戏上一期我们聊了iOS AR游戏开发的基础环境和世界观搭建算是把地基给打牢了。这一期我们直接进入实战目标是让你能亲手“搓”出一个看得见、摸得着虚拟意义上的的AR游戏原型。很多朋友在入门时卡就卡在从理论到实践这一步看着ARKit和RealityKit的文档感觉都懂但一打开Xcode就不知道从何下手。我的经验是别想着一口吃成胖子我们先定个小目标在现实世界的桌面上放置一个可以交互的3D模型比如一个点击后会旋转或播放动画的小机器人。这个目标看似简单却涵盖了AR游戏开发最核心的几个环节场景初始化、平面检测、实体放置、用户交互。通过实现它你能把ARKit的会话管理、RealityKit的实体与组件、以及SwiftUI/UIKit的事件响应串联起来形成一个完整的认知闭环。我常跟团队里的新人说AR开发的精髓不在于模型有多炫酷而在于虚拟物体如何“有说服力”地活在真实世界里。这个“说服力”就来自于我们对这几个基础环节的精细控制。2. 核心工具链深度解析不止是Xcode在动手写代码前我们得把“兵器库”里的家伙事儿再摸熟一点。除了必备的Xcode和iOS设备以下几个工具和框架的理解深度直接决定了你的开发效率和质量。2.1 RealityKit不仅仅是渲染引擎很多人把RealityKit简单理解为一个3D渲染引擎这其实低估了它。在我看来RealityKit是苹果为空间计算设计的一套实体组件系统Entity-Component System, ECS。理解这一点至关重要。实体Entity这是场景中的一切。一个立方体是实体一束光是实体甚至一个无形的锚点也是实体。它本身没有形状或行为只是一个容器。组件Component这是实体的“技能包”。ModelComponent赋予实体3D网格和材质让它能被看见CollisionComponent赋予实体碰撞体积让它能被点击PhysicsBodyComponent赋予实体物理属性让它能下落和碰撞。这种设计的好处是高度模块化和可组合。比如我想让一个模型既能被点击又能播放声音我只需要为它添加CollisionComponent和AudioComponent而不需要去修改模型类本身。在项目中我习惯为常用的功能组合比如“可点击的播放器模型”创建自定义的Component这样可以极大提升代码复用率。实操心得初期可以多利用RealityKit自带的组件如OrbitComponent让实体绕某点旋转、BillboardComponent让实体始终面向相机能快速实现很多效果减少自己造轮子的时间。2.2 Reality Composer被低估的快速原型工具我知道很多程序员对可视化编辑工具有抵触觉得不如写代码来得直接。但Reality Composer是个例外尤其是在原型阶段。你完全可以在几分钟内不写一行代码就组合出一个包含动画、物理行为和简单逻辑的交互场景。它的核心价值在于行为Behaviors可视化编排通过触发器如“当被点击时”和动作如“播放动画”、“移动至”的连线就能定义简单的交互逻辑。这对于验证游戏玩法非常高效。资源集成与管理你可以直接导入USDZ格式的3D模型并为其分配材质、调整缩放。用它来管理场景中的初始资产比在代码里硬编码路径要清晰得多。无缝对接Xcode在Reality Composer中保存的.rcproject文件可以直接作为RealityKit资源导入Xcode并通过几行代码加载到AR场景中。我的工作流通常是在Reality Composer里搭出核心交互原型 - 在真机上快速测试感觉 - 再将复杂的逻辑用代码在Xcode中实现。这比一开始就埋头写代码最后发现交互设计有问题要高效得多。2.3 资源格式为什么是USDZ苹果力推USDZ格式作为AR内容的分发标准这不是没有道理的。USDZ本质上是Pixar的USD通用场景描述格式的零压缩、单文件封装版。优势跨平台一致性在iOS的邮件、信息、Safari中预览的效果与在你的App里几乎完全一致。包含丰富信息一个USDZ文件可以打包网格、材质、纹理、动画甚至简单的行为无需额外加载一堆散文件。Apple生态原生支持RealityKit对其有最好的兼容性和性能优化。如何获取与创建转换可以使用苹果官方的Reality Converter工具将常见的GLTF、FBX、OBJ等格式转换为USDZ。命令行工具usdzconvert也很强大。建模软件直接导出最新版的Blender、Maya、Cinema 4D等都已支持直接导出USDZ格式。注意事项转换时务必注意模型的多边形数量面数和纹理尺寸移动设备性能有限。一个复杂的角色模型在桌面端可能很流畅但在手机上就会导致帧率骤降。3. 实战构建可交互的AR游戏场景理论铺垫足够现在我们打开Xcode创建一个新的“Augmented Reality App”项目模板选择“RealityKit”和“SwiftUI”。我们一步步来。3.1 初始化AR会话与平面检测项目模板会生成一个基础的AR视图。我们首先要确保它能稳定地识别环境。核心是配置ARWorldTrackingConfiguration。import SwiftUI import RealityKit import ARKit struct ContentView: View { var body: some View { ARViewContainer().edgesIgnoringSafeArea(.all) } } struct ARViewContainer: UIViewRepresentable { func makeUIView(context: Context) - ARView { let arView ARView(frame: .zero) // 1. 创建世界追踪配置 let config ARWorldTrackingConfiguration() // 2. 启用水平面检测检测桌面、地板等 config.planeDetection [.horizontal] // 3. 启用环境光估计让虚拟物体的光照与真实环境更融合 config.isLightEstimationEnabled true // 4. 运行AR会话 arView.session.run(config) // 5. 可选添加调试选项开发时可视化特征点和平面 #if DEBUG arView.debugOptions [.showFeaturePoints, .showWorldOrigin] #endif // 设置手势识别下一步实现 setupGestures(on: arView) return arView } func updateUIView(_ uiView: ARView, context: Context) {} func setupGestures(on arView: ARView) { // 手势设置代码将在下面实现 } }关键点解析planeDetection: 这里我们只检测水平面对于要在桌上、地上放置物体的游戏足够了。如果需要靠墙放置可以加上.vertical。isLightEstimationEnabled: 强烈建议开启。ARKit会分析摄像头画面估算环境光的强度和颜色并自动调节RealityKit中虚拟物体的明暗这是实现“虚实融合”感的关键一步。debugOptions: 开发阶段的“眼睛”。showFeaturePoints会显示ARKit识别的环境特征点一堆黄色小点showWorldOrigin会显示世界坐标轴帮你理解3D空间。3.2 实现点击放置与基础交互接下来我们要实现当用户点击屏幕时在点击位置检测到一个平面然后在这个位置放置我们的3D模型。首先在setupGestures函数中添加点击识别func setupGestures(on arView: ARView) { let tapGesture UITapGestureRecognizer(target: context.coordinator, action: #selector(Coordinator.handleTap(_:))) arView.addGestureRecognizer(tapGesture) }我们需要一个Coordinator来协调SwiftUI和UIKit并处理手势事件struct ARViewContainer: UIViewRepresentable { func makeUIView(context: Context) - ARView { ... // 在运行会话后设置手势 context.coordinator.arView arView setupGestures(on: arView, coordinator: context.coordinator) ... } func makeCoordinator() - Coordinator { Coordinator() } func setupGestures(on arView: ARView, coordinator: Coordinator) { let tapGesture UITapGestureRecognizer(target: coordinator, action: #selector(Coordinator.handleTap(_:))) arView.addGestureRecognizer(tapGesture) } class Coordinator { weak var arView: ARView? var robotEntity: Entity? // 用于引用我们放置的机器人实体 objc func handleTap(_ recognizer: UITapGestureRecognizer) { guard let arView arView else { return } // 1. 获取点击位置2D屏幕坐标 let tapLocation recognizer.location(in: arView) // 2. 进行命中测试Raycast寻找真实世界中的平面 let results arView.raycast(from: tapLocation, allowing: .estimatedPlane, alignment: .horizontal) // 3. 如果命中了一个平面 if let firstResult results.first { // 4. 放置或移动机器人实体 placeOrMoveRobot(at: firstResult, in: arView) } } func placeOrMoveRobot(at raycastResult: ARRaycastResult, in arView: ARView) { // 1. 创建或获取机器人实体 let robot: Entity if let existingRobot robotEntity { robot existingRobot // 如果已存在则移动到新位置可选动画 robot.move(to: Transform(scale: robot.scale, rotation: robot.orientation, translation: raycastResult.worldTransform.translation), relativeTo: nil, duration: 0.3, timingFunction: .easeInOut) } else { // 首次放置从资源加载或创建 // 方法A从Reality Composer场景加载推荐 // let robotAnchor try! Experience.loadRobot() // robot robotAnchor.robot! // 假设场景中实体名为“robot” // 方法B代码创建简单模型用于测试 let mesh MeshResource.generateBox(size: 0.1) let material SimpleMaterial(color: .blue, isMetallic: false) robot ModelEntity(mesh: mesh, materials: [material]) robot.name InteractiveRobot // **关键添加碰撞组件否则无法被点击** robot.generateCollisionShapes(recursive: true) arView.installGestures([.rotation, .translation], for: robot) robotEntity robot } // 2. 创建锚点并将机器人添加进去 let anchorEntity AnchorEntity(world: raycastResult.worldTransform) anchorEntity.addChild(robot) // 3. 将锚点添加到AR场景中 arView.scene.addAnchor(anchorEntity) // 4. 为机器人添加点击事件如果尚未添加 if robot.children.first(where: { $0 is HasTapInteraction }) nil { setupTapInteraction(for: robot, in: arView) } } func setupTapInteraction(for entity: Entity, in arView: ARView) { // 订阅该实体的碰撞事件由手势触发 arView.installGestures([.all], for: entity).forEach { gesture in if let tapGesture gesture as? EntityGestureRecognizer { // 这里可以更精细地控制但简单起见我们通过手势识别 // 更直接的方式使用RealityKit的UIGestureRecognizer配合自定义逻辑 } } // 更清晰的做法使用UIKit手势识别器但通过3D命中测试判断点击的是哪个实体 // 这里我们用一个简单的通知模式来模拟 let tapRecognizer UITapGestureRecognizer(target: self, action: #selector(handleEntityTap(_:))) arView.addGestureRecognizer(tapRecognizer) } objc func handleEntityTap(_ recognizer: UITapGestureRecognizer) { guard let arView arView else { return } let location recognizer.location(in: arView) // 在点击位置进行实体命中测试 if let entity arView.entity(at: location) as? ModelEntity, entity.name InteractiveRobot || entity.parent?.name InteractiveRobot { // 找到我们的机器人了触发交互 onRobotTapped(entity) } } func onRobotTapped(_ entity: Entity) { print(机器人被点击了) // 实现交互效果例如旋转、播放动画、改变颜色 // 1. 简单旋转 let currentTransform entity.transform let newOrientation simd_quatf(angle: .pi, axis: [0, 1, 0]) // 绕Y轴旋转180度 entity.move(to: Transform(scale: currentTransform.scale, rotation: newOrientation, translation: currentTransform.translation), relativeTo: entity.parent, duration: 1.0, timingFunction: .easeInOut) // 2. 或者如果模型有关联的动画可以播放 // entity.playAnimation(named: dance, transitionDuration: 0.5, startsPaused: false) } } }这段代码的要点与避坑指南命中测试Raycast这是AR中确定屏幕点击对应3D位置的标准方法。allowing: .estimatedPlane意味着即使ARKit没有明确识别出一个平面网格只要它估计那里有个平面比如特征点密集的区域也能成功。这提高了放置的成功率。碰撞形状Collision Shapes这是最容易被忽略也最关键的一步。一个ModelEntity默认只有视觉表现没有物理体积。你必须调用generateCollisionShapes为其生成碰撞体arView.entity(at:)和手势识别才能正确作用到它上面。recursive: true会为所有子实体也生成碰撞体。手势安装arView.installGestures([.rotation, .translation], for: robot)这行代码非常强大它直接为实体添加了旋转和平移的手势支持用户可以用双指旋转、单指拖动机器人。这是RealityKit提供的高层API省去了大量底层手势处理代码。交互逻辑分离我将点击交互的处理单独放在onRobotTapped函数中。在实际游戏中这里可能会触发得分、播放音效、切换状态等复杂逻辑。保持这部分代码清晰且可扩展非常重要。3.3 引入更复杂的3D模型与动画使用代码生成方块毕竟太简陋。让我们引入一个从Reality Composer或外部导入的USDZ模型。步骤一准备资源在Xcode项目中右键选择“Add Files to...”导入你的.usdz文件或.rcproject文件。假设我们有一个Robot.usdz文件将其拖入项目的资源目录Assets.xcassets或直接放在项目文件夹中。步骤二异步加载模型修改placeOrMoveRobot函数中创建机器人的部分func placeOrMoveRobot(at raycastResult: ARRaycastResult, in arView: ARView) { // ... 判断实体是否已存在的逻辑不变 ... if robotEntity nil { // 异步加载USDZ模型 var loadRequest: Entity.LoadRequest? nil if let modelURL Bundle.main.url(forResource: Robot, withExtension: usdz) { loadRequest Entity.loadModelAsync(contentsOf: modelURL) } else { // 如果文件不在Bundle可能是从Reality Composer场景加载 // loadRequest Entity.loadAnchorAsync(named: Experience) // 这里我们先回退到方块 let mesh MeshResource.generateBox(size: 0.1) let material SimpleMaterial(color: .blue, isMetallic: false) robot ModelEntity(mesh: mesh, materials: [material]) } if let request loadRequest { // 这是一个异步操作在实际应用中需要更妥善的处理如显示加载指示器 _ request.sink(receiveCompletion: { completion in // 处理加载错误 if case let .failure(error) completion { print(Failed to load model: \(error)) // 回退到创建基本模型 self.createFallbackRobot(at: raycastResult, in: arView) } }, receiveValue: { [weak self] loadedEntity in DispatchQueue.main.async { guard let self self, let arView self.arView else { return } robot loadedEntity robot.name InteractiveRobot robot.scale [0.5, 0.5, 0.5] // 可能需要调整缩放 robot.generateCollisionShapes(recursive: true) arView.installGestures([.rotation, .translation], for: robot) self.robotEntity robot // 将机器人添加到锚点... let anchorEntity AnchorEntity(world: raycastResult.worldTransform) anchorEntity.addChild(robot) arView.scene.addAnchor(anchorEntity) self.setupTapInteraction(for: robot, in: arView) } }) // 注意需要持有这个Cancellable否则异步请求可能被提前释放。这里为简化省略了存储。 return // 异步加载中先返回 } } // ... 如果实体已存在移动它的逻辑 ... }步骤三处理模型动画如果USDZ模型本身包含动画在Blender等软件中制作并导出你可以通过名称访问并播放它们func onRobotTapped(_ entity: Entity) { // 尝试播放名为“dance”的动画 if let animationResource entity.availableAnimations.first(where: { $0.name dance }) { entity.playAnimation(animationResource.repeat(duration: .infinity), transitionDuration: 0.5) } else { // 没有动画执行默认旋转 let currentTransform entity.transform let newOrientation simd_quatf(angle: .pi, axis: [0, 1, 0]) entity.move(to: Transform(scale: currentTransform.scale, rotation: newOrientation, translation: currentTransform.translation), relativeTo: entity.parent, duration: 1.0, timingFunction: .easeInOut) } }4. 性能优化与调试技巧实录当你的场景变得复杂模型增多交互丰富后性能问题就会浮现。以下是几个我踩过坑后总结的优化要点。4.1 性能瓶颈排查Xcode调试工具Debug Navigator中的性能仪表重点关注“CPU”、“内存”、“帧率FPS”。AR应用理想帧率是60FPS低于30会明显卡顿。Time Profiler用于分析CPU时间都花在哪里了。特别留意ARSession更新、RealityKit渲染、以及你自己的逻辑代码。Memory Graph Debugger检查内存泄漏。AR场景中未正确释放的Entity、Anchor和纹理是常见泄漏源。RealityKit专属工具在ARView的debugOptions中启用.showStatistics。这会在屏幕角落显示一个实时统计面板包括多边形数量Polycount、渲染通道数、帧时间。这是最直接的性能指示器。4.2 常见优化策略优化方向具体措施预期效果模型资源1. 使用LOD多层次细节模型距离远时用低模。2. 压缩纹理尺寸1024x1024对于手机AR通常足够大。3. 减少材质数量合并纹理贴图。大幅降低GPU负载和内存占用提升帧率。渲染1. 减少实时光影数量使用烘焙光照贴图。2. 谨慎使用透明和半透明材质Alpha Blending它们非常耗费性能。3. 控制ARView的renderOptions如非必要禁用运动模糊、景深等后处理。降低每帧渲染复杂度稳定帧时间。逻辑与更新1. 将非实时必要的逻辑如AI计算、路径规划放在后台线程。2. 使用Scene.Update事件进行帧更新避免在render循环中做繁重操作。3. 及时销毁不可见的或远离的实体entity.isEnabled false或直接移除。降低CPU峰值使用率避免主线程阻塞。AR会话1. 根据需求选择配置。如果不需要人脸追踪就不要用ARFaceTrackingConfiguration。2. 在应用进入后台时暂停会话session.pause()回到前台时重新运行。节省电量避免不必要的计算。4.3 调试中遇到的典型问题与解决问题模型放置后位置抖动或漂移。原因ARKit的世界追踪在持续优化空间映射导致锚点的世界变换矩阵发生微调。解决对于需要绝对稳定的物体如游戏棋盘使用ARPlaneAnchor或ARImageAnchor这类与真实世界特征强绑定的锚点而不是仅基于ARRaycastResult。或者考虑使用ARObjectAnchor如果支持。问题点击事件不触发或触发不准确。原因A实体没有CollisionComponent。这是最常见的原因。解决A确保在添加实体后立即调用generateCollisionShapes。原因B碰撞形状太复杂或与视觉模型不匹配。解决B对于复杂模型可以生成简化版本的碰撞体或者使用MeshResource.generateConvex(from:)手动创建凸包碰撞体性能更好。原因C手势识别器冲突。多个UITapGestureRecognizer可能互相干扰。解决C使用arView.installGestures来管理针对3D实体的手势或确保你的自定义手势识别器正确设置了cancelsTouchesInView和delegate。问题应用运行一段时间后崩溃内存暴涨。原因实体、材质、纹理没有被正确释放。每次放置新模型都重新从文件加载旧资源未销毁。解决重用实体像我们上面的代码一样移动已存在的实体而非总是创建新的。使用ModelEntity的model属性来共享网格资源。对于确定不再使用的AnchorEntity调用anchor.removeFromParent()并将其引用置为nil。在Coordinator或视图控制器中使用集合如数组来管理所有创建的锚点和实体在视图销毁时统一清理。5. 从原型到游戏下一步的方向至此你已经拥有了一个可以放置、移动、旋转、点击交互的AR对象。这已经是一个功能完整的AR应用核心了。接下来你可以沿着以下几个方向把它扩展成一个真正的游戏游戏逻辑为你的机器人添加生命值、攻击力等属性。在onRobotTapped中可以不是旋转而是扣血、播放受击动画、甚至“死亡”消失。多实体与交互放置多个不同类型的实体敌人、道具、障碍物。实现实体间的交互例如发射子弹一个移动的球体击中敌人时检测碰撞通过CollisionComponent和PhysicsBodyComponent。状态管理与UI使用SwiftUI创建游戏状态的UI如分数、倒计时、生命条。将游戏逻辑如得分、游戏结束判断与AR视图的渲染逻辑分离。音频与反馈通过AudioResource和AudioPlaybackController添加背景音乐和音效如点击声、爆炸声。利用HapticFeedback提供触觉反馈增强沉浸感。持久化与多人使用ARKit的ARWorldMap保存和恢复AR场景实现游戏进度保存。探索MultipeerConnectivity框架实现简单的本地多人AR体验让两个玩家在同一个物理空间看到和操作同一组虚拟物体。AR游戏开发的乐趣在于你是在模糊现实与虚拟的边界。每一次调试每一次优化都是为了让那个虚拟的小世界更稳固、更生动地叠加在我们熟悉的现实之上。从点击放置一个方块开始到构建一个令人沉浸的完整游戏世界这个过程充满了挑战但每一步实现所带来的成就感也是实实在在的。希望这份手册能帮你跨出坚实的第一步剩下的创意就交给你的想象力了。如果在实现过程中遇到具体问题不妨回头看看平面检测是否稳定、碰撞体是否生成、以及性能统计面板上的数字大多数难题的答案都藏在这些基础的细节里。

相关新闻

2026/7/17 5:29:55

C++引用深度解析:从概念到实战,掌握高效编程核心

1. 项目概述:为什么C的“引用”是初学者的第一道坎?如果你刚开始学习C,在学完变量、数据类型和指针之后,大概率会碰到一个让你既熟悉又陌生的概念——引用。很多教程会告诉你,引用就是“别名”,是某个变量的…

2026/7/17 5:29:55

C++ std::regex 正则表达式实战指南:匹配、搜索、替换与性能优化

1. 项目概述:为什么C程序员必须掌握std::regex?如果你用C处理过文本——无论是解析日志文件、验证用户输入格式,还是从一大段HTML里抠出特定数据——大概率都经历过手动写循环、判断字符、拼接子串的痛苦。这种“刀耕火种”的方式&#xff0c…

2026/7/17 6:44:59

AI与高德MCP打造智能旅行规划系统

1. 项目概述:AI与高德MCP的旅行规划革命去年帮朋友规划云南自驾游时,我花了整整三天时间查攻略、排路线、算时间,最后做出的行程表还是漏洞百出。这种痛苦经历促使我探索用技术解决旅行规划难题,直到发现高德MCP(Model…

2026/7/17 6:44:59

基于IBM TSS库的BLS门限签名实战:从分布式密钥生成到签名验证

1. 项目概述:为什么我们需要BLS门限签名? 如果你在分布式系统、区块链或者多方计算领域摸爬滚打过一阵子,肯定对“签名”这件事又爱又恨。爱的是,它是数字世界里身份和授权的基石;恨的是,传统的单点签名&am…

2026/7/17 6:44:59

FPGA开发板PWM模块设计与Verilog实现

1. 盘古1K开发板与PWM模块设计概述盘古1K开发板作为国产FPGA学习平台,凭借其高性价比和丰富的外设接口,已成为数字电路设计入门的首选工具之一。本次练习聚焦PWM(脉冲宽度调制)模块设计,这是嵌入式系统和电机控制领域的…

2026/7/17 6:44:59

第5章,[Win32 章节] :直线练习程序1

专栏导航 上一篇:第5章,[Win32 章节] :绘制直线(三) 回到目录 下一篇:第5章,[Win32 章节] :直线练习程序2 本节前言 对于本节所讲解的知识,有可能,你会需…

2026/7/17 6:44:59

C++函数化编程实战:学生成绩管理系统设计与算法实现

1. 项目概述与核心价值最近在带几个刚学完C基础语法的学弟学妹做项目,发现他们最头疼的就是不知道如何把书本上的零散知识点(比如数组、函数、结构体)串成一个能实际运行的程序。正好,一个经典的“学生成绩管理系统”需求摆在了面…

2026/7/17 6:39:58

Ubuntu下ChatGLM2-6B环境搭建与P-Tuning微调实战

1. 项目概述最近在Ubuntu系统上搭建ChatGLM2-6B环境并进行P-Tuning微调训练时,踩了不少坑。作为一个开源的中文大语言模型,ChatGLM2-6B在中文处理方面表现优异,但在实际部署和训练过程中会遇到各种问题。本文将详细记录从环境搭建到微调训练的…

2026/7/17 5:59:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/17 1:21:45

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/15 23:18:22

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/17 0:04:23

BiSheng JDK-build性能调优:构建速度提升30%的优化策略

BiSheng JDK-build性能调优:构建速度提升30%的优化策略 【免费下载链接】bishengjdk-build BiSheng JDK build and test scripts - common across all releases/versions 项目地址: https://gitcode.com/openeuler/bishengjdk-build 前往项目官网免费下载&am…

2026/7/16 13:58:36

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…