news 2026/10/15 9:48:32

Unity3D嵌入WPF:基于D3D11共享纹理的深度集成方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Unity3D嵌入WPF:基于D3D11共享纹理的深度集成方案

简介:本资源是一套完整的Unity3D嵌入WPF桌面应用的工程实践方案,面向具备C#和WPF基础的中高级开发者,解决在Windows平台融合Unity实时3D渲染与WPF丰富UI交互的核心技术难题,适用于数字孪生可视化、工业仿真界面、AR/VR桌面端集成等场景。压缩包共140个文件,49.44MB,包含32个C#源码文件(含UnityPlayer宿主封装、WPF窗口通信逻辑)、23个关键DLL(含Unity导出的.NET托管库及插件依赖)、6个可执行文件(含调试用Host程序)、4个XAML界面定义及4个CSProj项目配置,完整呈现从Unity场景导出、WPF宿主构建到双向事件通信的全链路结构。已有940人学习下载,资源提供开箱即用的双项目协同架构、WindowsFormsHost嵌入Unity渲染窗口的稳定实现、Unity与WPF间基于委托与事件的低耦合通信机制,以及典型性能调优注释,大幅降低跨引擎集成门槛。

1. Unity3D嵌入WPF:不是“把Unity窗口塞进WPF”,而是让Unity渲染画布真正成为WPF控件树里可布局、可绑定、可响应事件的一等公民

你试过在WPF主界面里拖一个<local:UnityHostControl />,然后像设置Margin、Visibility、RenderTransform一样控制Unity场景的显示位置和缩放吗?不是靠Win32子窗口硬套壳,不是靠HwndSource粗暴托管,而是让Unity的渲染输出——确切地说,是Unity Player的原生渲染上下文(D3D11或OpenGL共享纹理)——被WPF的Composition引擎直接消费。这意味着:Unity场景能随WPF窗口无闪烁缩放、能被Clip裁剪、能参与OpacityMask混合、甚至能和MediaElement同层Z-order叠加。某高校实验室用这套方案重构了工业仿真教学平台,把原本卡顿的3D设备拆解动画嵌入WPF参数配置面板后,教师拖拽滑块实时调整电机转速时,3D模型旋转帧率稳定在60FPS,且UI响应延迟低于15ms。它适合需要将Unity高保真3D交互深度集成进成熟WPF业务系统(如MES看板、数字孪生监控台、医疗影像工作站)的开发者,而不是只想“弹个Unity窗口”的临时需求。


2. 技术选型与架构设计:为什么必须绕开HwndSource,直通D3D11共享纹理

2.1 核心矛盾:WPF的渲染管线与Unity Player的隔离性

WPF默认使用自己的D3D9/D3D11渲染器(取决于.NET Framework版本),而Unity Standalone Player启动时会独占D3D11设备并创建独立交换链。若用传统HwndSource方案,本质是让Unity在WPF窗口句柄上绘制——这导致两个严重问题:一是WPF无法感知Unity渲染内容,无法做硬件加速合成(所有Unity区域被当作位图光栅化处理);二是窗口重绘/缩放时出现撕裂、闪烁,且RenderTransform缩放会触发CPU软缩放,3D模型边缘锯齿明显。本项目采用D3D11共享纹理桥接,让Unity Player将每一帧渲染结果写入一个ID3D11Texture2D,再通过DXGI_KEYED_MUTEX同步机制,由WPF侧的D3DImage对象安全获取该纹理并提交给WPF渲染管线。整个过程不经过GDI/GDI+位图拷贝,全程GPU内存直通。

2.2 关键组件职责划分

  • Unity侧(C# Script):实现SharedTextureRenderer.cs,负责创建共享纹理、绑定到Unity Camera的RenderTexture、在OnPostRender中调用CopyTexture确保帧数据就绪;
  • WPF侧(C#):UnityHostControl.xaml.cs继承自FrameworkElement,内部封装D3DImage,通过P/Invoke调用OpenSharedResource获取Unity侧纹理句柄,并在CompositionTarget.Rendering事件中触发D3DImage.Lock()/SetBackBuffer()/Unlock();
  • 跨进程通信层(可选):若Unity以独立进程运行(如Unity Standalone EXE),需通过命名管道或内存映射文件传递共享纹理名(L"UnitySharedTexture_0x12345678")及同步键(keyed_mutex_key),本项目默认采用同一进程内DLL注入模式,避免IPC开销。

2.3 为什么放弃OpenGL路径?

虽然Unity支持OpenGL ES共享上下文,但WPF在Windows上不原生支持OpenGL纹理绑定(D3DImage仅接受D3D9/D3D11资源)。尝试用wglShareLists创建共享上下文后,WPF侧无法将OpenGL纹理转换为ID3D11Texture2D,最终仍需CPU端glReadPixels拷贝——实测帧率从60FPS暴跌至12FPS。D3D11路径是唯一满足性能与集成度双重要求的方案。

提示:本项目要求Unity 2019.4 LTS及以上版本(需启用Player Settings > Other Settings > Color Space = Linear),WPF工程目标框架为.NET Framework 4.7.2或.NET 6+(需安装Microsoft.Windows.Compatibility包)。


3. 目录结构与核心文件解析:从Unity插件到WPF控件的完整链路

3.1 项目目录树(精简关键路径)

/Unity3D-Embedded-WPF/ ├── /UnityProject/ # Unity 2021.3.15f1 工程 │ ├── Assets/Plugins/ # 原生插件目录 │ │ ├── Win64/ # 编译后的x64 DLL │ │ │ ├── UnityWPFBridge.dll # 核心桥接库(含D3D11共享纹理创建/同步逻辑) │ │ │ └── d3d11.dll # D3D11运行时依赖(已静态链接) │ │ └── UnityWPFBridge.cs # C#脚本入口,注册Native API │ ├── Assets/Scripts/ # Unity侧逻辑 │ │ ├── SharedTextureRenderer.cs # 主渲染器:创建共享纹理、绑定Camera、同步帧 │ │ └── TextureSyncManager.cs # 纹理生命周期管理(避免GC导致纹理句柄失效) │ └── ProjectSettings/ # 关键设置:Color Space=Linear, Graphics API=D3D11 ├── /WPFHostApp/ # WPF .NET 6 应用 │ ├── Controls/ # 自定义控件 │ │ └── UnityHostControl.xaml # 用户可拖拽的WPF控件(含DependencyProperty) │ ├── Native/ # P/Invoke声明 │ │ └── D3D11Interop.cs # OpenSharedResource、CreateKeyedMutex等函数声明 │ ├── ViewModels/ # MVVM绑定支持 │ │ └── UnityViewModel.cs # 暴露Start/Stop/Reset命令及状态属性 │ └── App.xaml.cs # 启动时初始化Unity Player(非独立进程) └── /Build/ # 构建产物 ├── UnityPlayer.dll # Unity Runtime(已剥离Editor功能) └── UnityWPFBridge.dll # 与UnityProject中同名DLL一致

3.2 Unity侧核心:SharedTextureRenderer.cs

// Assets/Scripts/SharedTextureRenderer.cs using UnityEngine; using System.Runtime.InteropServices; public class SharedTextureRenderer : MonoBehaviour { [DllImport("UnityWPFBridge.dll")] private static extern bool CreateSharedTexture( int width, int height, out IntPtr sharedHandle, out long keyedMutexKey); [DllImport("UnityWPFBridge.dll")] private static extern void ReleaseSharedTexture(IntPtr handle); public RenderTexture renderTexture; // 在Inspector中指定尺寸(建议匹配WPF控件大小) private IntPtr _sharedTextureHandle; private long _keyedMutexKey; private bool _isTextureReady; void Start() { // 1. 创建共享纹理(D3D11_TEXTURE2D_DESC中BindFlags包含D3D11_BIND_SHADER_RESOURCE) if (!CreateSharedTexture( renderTexture.width, renderTexture.height, out _sharedTextureHandle, out _keyedMutexKey)) { Debug.LogError("Failed to create shared texture!"); return; } // 2. 将共享纹理绑定到RenderTexture(关键!) var nativeTexturePtr = renderTexture.GetNativeTexturePtr(); // 调用Unity内部API将nativeTexturePtr指向_sharedTextureHandle // (具体实现见UnityWPFBridge.dll的SetRenderTextureSharedHandle函数) SetRenderTextureSharedHandle(nativeTexturePtr, _sharedTextureHandle); } void OnPostRender() // 确保每帧渲染后同步纹理状态 { if (_isTextureReady && _sharedTextureHandle != IntPtr.Zero) { // 通知WPF侧该帧数据已就绪(通过keyed mutex释放key) SignalTextureReady(_keyedMutexKey); } } void OnDestroy() { if (_sharedTextureHandle != IntPtr.Zero) { ReleaseSharedTexture(_sharedTextureHandle); _sharedTextureHandle = IntPtr.Zero; } } [DllImport("UnityWPFBridge.dll")] private static extern void SetRenderTextureSharedHandle( IntPtr nativeTexturePtr, IntPtr sharedHandle); [DllImport("UnityWPFBridge.dll")] private static extern void SignalTextureReady(long key); }

逻辑说明:

  • CreateSharedTexture在Unity Player的D3D11设备上创建ID3D11Texture2D,并返回其HANDLE和keyed_mutex_key(用于跨线程同步);
  • SetRenderTextureSharedHandle是桥接库的关键函数,它通过Unity内部Texture::SetNativeTexturePtr机制,将RenderTexture的底层D3D11资源指针替换为共享纹理句柄;
  • OnPostRender中调用SignalTextureReady,本质是调用ID3D11Query或keyed_mutex->ReleaseSync(key),告知WPF侧“当前帧数据已写入共享纹理,可安全读取”。

3.3 WPF侧核心:UnityHostControl.xaml.cs

// Controls/UnityHostControl.xaml.cs using System; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Interop; using System.Windows.Media; using System.Windows.Media.Imaging; public partial class UnityHostControl : FrameworkElement { private D3DImage _d3dImage; private IntPtr _sharedTextureHandle; private long _keyedMutexKey; private bool _isInitialized; static UnityHostControl() { DefaultStyleKeyProperty.OverrideMetadata( typeof(UnityHostControl), new FrameworkPropertyMetadata(typeof(UnityHostControl))); } public UnityHostControl() { _d3dImage = new D3DImage(); this.Source = _d3dImage; // 绑定到WPF渲染管线 CompositionTarget.Rendering += OnRendering; // 每帧触发 } public void Initialize(string sharedTextureName, long keyedMutexKey) { _sharedTextureHandle = GetSharedTextureHandle(sharedTextureName); _keyedMutexKey = keyedMutexKey; _isInitialized = true; } private void OnRendering(object sender, EventArgs e) { if (!_isInitialized || _sharedTextureHandle == IntPtr.Zero) return; try { // 1. 锁定D3DImage(防止WPF渲染线程访问未就绪纹理) _d3dImage.Lock(); // 2. 等待Unity侧信号:keyed_mutex->AcquireSync(key, INFINITE) if (WaitForTextureReady(_keyedMutexKey)) { // 3. 将共享纹理绑定到D3DImage _d3dImage.SetBackBuffer(D3DResourceType.ID3D11Texture2D, _sharedTextureHandle); } } catch (Exception ex) { Debug.WriteLine($"D3DImage update failed: {ex.Message}"); } finally { _d3dImage.Unlock(); // 必须调用,否则WPF渲染挂起 } } [DllImport("UnityWPFBridge.dll")] private static extern IntPtr GetSharedTextureHandle(string name); [DllImport("UnityWPFBridge.dll")] private static extern bool WaitForTextureReady(long key); }

参数说明:

  • GetSharedTextureHandle:通过OpenSharedResource从名称获取Unity创建的共享纹理句柄;
  • WaitForTextureReady:调用keyed_mutex->AcquireSync(key, timeout),超时时间设为16ms(对应60FPS),避免WPF线程阻塞;
  • SetBackBuffer:将D3D11纹理直接注入WPF的Composition引擎,后续所有WPF变换(ScaleTransform、RotateTransform)均作用于该纹理。

4. 运行与调试:从零构建可执行环境的完整步骤

4.1 环境准备(Windows 10/11 x64)

  1. 安装Unity Hub,添加Unity 2021.3.15f1(LTS);
  2. 安装Visual Studio 2022,工作负载勾选:
    • .NET desktop development(含.NET 6 SDK)
    • Desktop development with C++(编译D3D11桥接库必需)
  3. 下载DirectX SDK for Windows 10(实际使用Windows 10 SDK内置的d3d11.h,无需单独安装旧版SDK);
  4. 克隆项目仓库,确保/UnityProject/和/WPFHostApp/在同一父目录下。

4.2 构建Unity侧桥接库(UnityWPFBridge.dll)

# 进入 /UnityProject/Assets/Plugins/Win64/ 目录 # 使用VS2022 Developer Command Prompt执行: cl /c /O2 /EHsc /I"C:\Program Files\Windows Kits\10\Include\10.0.22621.0\um" ^ /I"C:\Program Files\Windows Kits\10\Include\10.0.22621.0\shared" ^ UnityWPFBridge.cpp link /DLL /OUT:UnityWPFBridge.dll ^ /LIBPATH:"C:\Program Files\Windows Kits\10\Lib\10.0.22621.0\um\x64" ^ UnityWPFBridge.obj d3d11.lib dxgi.lib

关键编译参数说明:

  • /EHsc:启用C++异常处理,与Unity C#异常机制兼容;
  • /I:指定Windows SDK头文件路径(根据实际安装路径调整);
  • link命令中/DLL生成动态库,d3d11.lib和dxgi.lib提供D3D11 API符号。

4.3 配置Unity工程并构建Player

  1. 打开/UnityProject/,在Edit > Project Settings > Player中:
    • Other Settings > Color Space = Linear(Gamma模式会导致WPF侧颜色失真);
    • Publishing Settings > Target Graphics API = D3D11(禁用Vulkan/Metal);
    • Configuration > Scripting Backend = IL2CPP(.NET 6互操作更稳定);
  2. 将SharedTextureRenderer.cs挂载到主摄像机(Main Camera);
  3. File > Build Settings,Platform选PC, Mac & Linux Standalone,Architecture选x64,点击Build生成StandaloneWindows64.exe;
  4. 关键步骤:将生成的StandaloneWindows64.exe重命名为UnityPlayer.dll,复制到/Build/目录(覆盖原有文件)。

4.4 构建并运行WPF Host应用

  1. 打开/WPFHostApp/WPFHostApp.csproj,确认<TargetFramework>net6.0-windows</TargetFramework>;
  2. 在App.xaml.cs中添加Unity Player初始化:
// App.xaml.cs protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); // 加载UnityPlayer.dll并初始化Player LoadUnityPlayer(); // 创建主窗口 var mainWindow = new MainWindow(); mainWindow.Show(); }
  1. 在MainWindow.xaml中使用控件:
<!-- MainWindow.xaml --> <local:UnityHostControl x:Name="unityControl" Width="800" Height="600" Margin="20" />
  1. 按Ctrl+F5启动,观察WPF窗口中是否显示Unity场景——若黑屏,检查Output窗口是否有D3DImage update failed日志。

注意:首次运行可能触发Windows SmartScreen警告,需手动点击“更多信息”→“仍要运行”。这是因UnityWPFBridge.dll未签名导致,生产环境需申请代码签名证书。


5. 避坑指南:5个真实踩坑记录与血泪解决方案

5.1 现象:WPF窗口最大化时Unity画面撕裂,且缩放后模型边缘严重锯齿

原因:WPF默认使用BitmapScalingMode.LowQuality对D3DImage进行缩放,且未启用硬件加速的RenderOptions.BitmapScalingMode。
解决:在UnityHostControl.xaml根元素中强制设置:

<local:UnityHostControl RenderOptions.BitmapScalingMode="HighQuality" SnapsToDevicePixels="True" />

并在OnRendering方法中,每次SetBackBuffer前调用:

_d3dImage.IsFrontBufferAvailable = true; // 强制启用双缓冲

5.2 现象:Unity场景初始黑屏,但Console显示“Shared texture created”,且WPF侧WaitForTextureReady始终返回false

原因:Unity Player未正确初始化D3D11设备,常见于Player Settings > Graphics API未锁定为D3D11,或Unity工程中存在其他插件抢占D3D设备。
解决:在Unity脚本中添加设备验证:

void CheckD3D11Device() { var graphicsDevice = SystemInfo.graphicsDeviceType; Debug.Log($"Graphics Device: {graphicsDevice}"); // 必须输出"D3D11" if (graphicsDevice != GraphicsDeviceType.Direct3D11) { Debug.LogError("D3D11 not active! Check Player Settings."); } }

5.3 现象:WPF应用关闭后,UnityPlayer.dll崩溃并弹出“Access Violation”错误框

原因:WPF侧未在Application.Exit事件中显式调用ReleaseSharedTexture,导致Unity Player销毁时尝试访问已释放的共享纹理句柄。
解决:在App.xaml.cs中添加清理逻辑:

private void OnExit(object sender, ExitEventArgs e) { // 调用UnityWPFBridge.dll中的Cleanup函数 CleanupUnityResources(); }

并在桥接库中实现CleanupUnityResources,内部调用ReleaseSharedTexture和CloseHandle。

5.4 现象:Unity场景在WPF中显示正常,但鼠标悬停时WPF按钮无法响应点击(事件被Unity“吃掉”)

原因:D3DImage默认捕获所有鼠标事件,需显式设置IsHitTestVisible="False"。
解决:在XAML中为UnityHostControl添加:

<local:UnityHostControl IsHitTestVisible="False" />

若需Unity响应鼠标,改用UnitySendMessage将WPF侧MouseDown事件坐标转发给Unity C#脚本。

5.5 现象:多显示器环境下,Unity场景在副屏显示为纯黑,主屏正常

原因:D3D11设备绑定到特定GPU(如NVIDIA独显),而副屏连接在核显输出口,导致共享纹理跨GPU无效。
解决:强制Unity使用与WPF窗口同GPU的D3D设备——在Player Settings > Other Settings > GPU Skinning启用,并在SharedTextureRenderer.Start()中插入:

// 查询当前WPF窗口所在GPU的Adapter LUID var adapterLuid = GetAdapterLuidFromHwnd(hWndOfWPFWindow); SetD3D11Adapter(adapterLuid); // 调用桥接库函数

(需在桥接库中实现SetD3D11Adapter,通过IDXGIFactory2::EnumAdapters1匹配LUID)


6. 二次开发实战:为UnityHostControl添加实时参数绑定与热重载支持

6.1 实现WPF ViewModel到Unity C#的双向绑定

目标:在WPF中拖动Slider实时修改Unity中灯光强度,同时Unity脚本修改材质颜色后自动更新WPF侧ColorPicker。

步骤1:定义WPF ViewModel

// ViewModels/UnityViewModel.cs public class UnityViewModel : INotifyPropertyChanged { private float _lightIntensity = 1.0f; public float LightIntensity { get => _lightIntensity; set { _lightIntensity = value; OnPropertyChanged(); // 向Unity发送消息 SendToUnity("LightController", "SetIntensity", _lightIntensity.ToString()); } } private Color _materialColor = Colors.Red; public Color MaterialColor { get => _materialColor; set { _materialColor = value; OnPropertyChanged(); SendToUnity("MaterialController", "SetColor", $"{value.R},{value.G},{value.B},{value.A}"); } } [DllImport("UnityWPFBridge.dll")] private static extern void SendToUnity(string objName, string methodName, string param); }

步骤2:Unity侧接收消息并更新

// Assets/Scripts/LightController.cs public class LightController : MonoBehaviour { public Light directionalLight; void Start() { // 注册消息处理器(Unity 2021+支持) Application.ExternalCall("RegisterMessageHandler", "LightController"); } // 此方法会被WPF通过SendToUnity调用 public void SetIntensity(string intensityStr) { if (float.TryParse(intensityStr, out float intensity)) { directionalLight.intensity = intensity; } } }

步骤3:Unity向WPF回传数据(需桥接库支持)
在UnityWPFBridge.dll中导出函数:

extern "C" __declspec(dllexport) void UpdateWPFProperty( const char* propertyName, const char* valueString);

Unity脚本中调用:

[DllImport("UnityWPFBridge.dll")] private static extern void UpdateWPFProperty(string prop, string val); // 在材质颜色变更后 UpdateWPFProperty("MaterialColor", $"#{color.r:X2}{color.g:X2}{color.b:X2}");

6.2 热重载Unity场景:避免每次修改Shader都要重启WPF

痛点:Unity中修改Shader后,需重新构建Player并重启WPF,开发效率极低。

解决方案:分离Shader资源加载

  1. 在Unity中将Shader打包为AssetBundle(Assets/Shaders/MyShader.shader→shaders.bundle);
  2. WPF侧提供ReloadShaderCommand:
public ICommand ReloadShaderCommand => new RelayCommand(() => { // 通过桥接库通知Unity重新加载AssetBundle ReloadUnityAssetBundle("shaders.bundle"); });
  1. Unity侧监听命令,动态加载:
public void ReloadShaderBundle(string bundleName) { var bundle = AssetBundle.LoadFromFile($"Assets/Bundles/{bundleName}"); var shader = bundle.LoadAsset<Shader>("MyShader"); material.shader = shader; // 动态替换 }

6.3 性能优化技巧:按需激活Unity渲染

当UnityHostControl被Visibility=Collapsed或不在视口内时,应暂停Unity渲染以节省GPU资源。

实现方式:

  • WPF侧监听IsVisibleChanged事件:
private void OnIsVisibleChanged(object sender, DependencyObject e) { if (this.IsVisible) { ResumeUnityRendering(); // 调用桥接库Resume函数 } else { PauseUnityRendering(); // 调用桥接库Pause函数 } }
  • Unity侧在SharedTextureRenderer.OnPostRender中添加开关:
void OnPostRender() { if (_isPaused) return; // 新增标志位 // ... 原有同步逻辑 }

从那以后我每次集成Unity到WPF项目,都强制走一遍「D3D11共享纹理创建→WPF D3DImage绑定→跨线程同步验证」三步检查清单,哪怕只是临时Demo。因为90%的黑屏、撕裂、崩溃问题,根源都在这三步的任意一环没对齐。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 9:48:14

Spring Boot整合AI模型构建智能客服系统实战

1. 项目概述&#xff1a;当Spring遇上AI的化学反应去年我在电商平台技术部带队重构客服系统时&#xff0c;发现传统规则引擎每天要维护上千条对话规则&#xff0c;但用户满意度始终卡在72%上不去。直到我们将Spring Boot与AI模型结合&#xff0c;才真正实现了智能对话的突破。这…

作者头像 李华
网站建设 2026/10/15 9:47:20

Revit二次开发调试效率提升:AddInManager插件热重载实战指南

1. 从一次插件加载失败说起&#xff1a;AddInManager 到底解决了什么问题如果你写过 Revit 二次开发&#xff0c;大概率经历过这个场景&#xff1a;代码编译通过&#xff0c;.dll文件也生成了&#xff0c;但打开 Revit 后功能区里死活找不到自己的按钮。重启 Revit、重新编译、…

作者头像 李华
网站建设 2026/10/15 9:47:19

HyperFrames深度拆解:GPU驱动渲染、可见性缓冲与虚拟纹理实践

1. 从Humus的仓库说起&#xff1a;HyperFrames在图形技术版图里的位置如果你在GitHub上搜索"HyperFrames"这个词&#xff0c;大概率会看到一位ID叫Humus的开发者留下的仓库。Humus本名Emil Persson&#xff0c;是EA DICE时期Frostbite引擎渲染架构的核心人物之一&…

作者头像 李华
网站建设 2026/10/15 9:46:38

CSS渐变背景全解析:从linear-gradient到多色混合实战

1. 从一行CSS说起&#xff1a;为什么渐变背景值得单独拎出来讲很多人第一次接触CSS渐变&#xff0c;是在某个深夜赶项目的时候——设计师丢过来一张背景图&#xff0c;说“就这个渐变效果&#xff0c;你切一下”。你打开一看&#xff0c;从左上角的深蓝到右下角的浅紫&#xff…

作者头像 李华
网站建设 2026/10/15 9:45:34

数据库一体机技术演进与实战指南

1. 数据库一体机的前世今生我第一次接触数据库一体机是在2012年某银行的系统升级项目中。当时客户指着机房角落里一台冰箱大小的黑色机柜说&#xff1a;"这是我们新上的数据仓库&#xff0c;花了两千多万。"那台机器就是Teradata的数据仓库一体机&#xff0c;它让我第…

作者头像 李华
网站建设 2026/10/15 9:45:32

Vue.js创始人发布Void:Vite生态的全栈托管平台

1. 项目背景与核心价值前端开发者们最近迎来了一个重磅消息&#xff1a;Vue.js 创始人尤雨溪正式发布了 Void——一个专为 Vite 生态打造的全栈应用托管平台。这标志着 Vite 生态终于拥有了对标 Next.js Vercel 的完整解决方案。作为一名长期使用 Vite 的前端工程师&#xff0…

作者头像 李华