ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

没有GPU也能流畅跑3D?三步上手SwiftShader,把Vulkan渲染搬到CPU上

没有GPU也能流畅跑3D?三步上手SwiftShader,把Vulkan渲染搬到CPU上 没有GPU也能流畅跑3D三步上手SwiftShader把Vulkan渲染搬到CPU上【免费下载链接】swiftshaderSwiftShader is a high-performance CPU-based implementation of the Vulkan graphics API. Its goal is to provide hardware independence for advanced 3D graphics.项目地址: https://gitcode.com/gh_mirrors/sw/swiftshader服务器没有独立显卡云主机只配了CPU却要运行3D可视化程序——难道只能干瞪眼SwiftShader给出了答案这是一款高性能的CPU渲染引擎用纯软件方式完整实现Vulkan 1.3图形接口让无GPU环境运行3D应用从一句奢望变成一行配置的事。一、先说说那道无GPU的坎3D程序离了显卡真的跑不了吗很多人的第一反应是3D渲染必须靠GPU否则就是巧妇难为无米之炊。这个直觉只对了一半。我们可以把显卡渲染想象成一条生产流水线图形API比如Vulkan负责制定生产规范GPU是流水线上那台专业机器。而SwiftShader做的事情恰恰是证明了一件事——这台机器不是必需品规范才是。只要有人愿意完全可以用一群通用的CPU核心按照同样的规范把活一件件干完。这正是CPU渲染的核心思想放弃专用硬件用纯软件手段执行图形API定义的所有规则。慢吗确实比顶级显卡慢但它解决的是有没有的问题——在根本没有GPU的环境里能跑起来本身就赢了。二、SwiftShader是什么一台装在CPU里的显卡驱动SwiftShader是Google主导的开源项目它的定位一句话就能说清以纯软件方式实现的Vulkan图形API并且通过了Vulkan 1.3的一致性认证这意味着它不是一个看起来像Vulkan的半成品而是正经符合国际规范的完整实现。它带来最直接的价值叫硬件无关。同样的应用代码在NVIDIA、AMD、Intel的显卡上跑在苹果M系列芯片上跑在什么都没有的云服务器上跑表现可以完全一致——因为执行渲染的始终是同一套CPU代码。它在哪些场合最有价值这里列几个典型场景场景为什么需要SwiftShader无头服务器 / 云主机跑3D可视化、批量渲染任务但没有GPU可挂载CI持续集成测试Vulkan功能时不想依赖机器的显卡差异老旧或受限设备显卡驱动不完整、接口过旧跑不动新API需要确定性结果CPU渲染结果可复现便于对比与调试另外提一句如果你需要的是OpenGL ESSwiftShader本身聚焦Vulkan但配合ANGLE这类转换层同样能在CPU上跑起OpenGL ES 3.1的应用。无GPU的图形世界比想象中要完整。三、它到底怎么做到的一张架构图看懂CPU渲染的三层分工理解了是什么再看怎么做。SwiftShader把整条图形流水线拆成了清晰的层次项目文档里这张架构图docs/Index.md一图道破天机从上往下数核心是三层第一层API层。它把应用发来的Vulkan调用翻译成内部渲染指令同时管理资源、编译着色器。对应用来说它见到的还是一个标准Vulkan接口所以你的代码完全不用改。第二层渲染器Renderer层。这一层是生产车间主任负责把每个绘制调用拆解成具体的处理工序并调度到多个CPU核心上并行执行。第三层Reactor JIT层。这是SwiftShader性能的秘密所在。Reactor是一个内嵌在C里的代码生成语言——它不像普通渲染器那样一条指令执行一步操作而是在运行时为每一个绘制调用现写一段专用机器码再交给JIT编译器LLVM或Subzero即时编译成可执行代码。打个比方普通软件渲染像是吃预制菜什么口味都是加热同一包SwiftShader则像一位厨师看到你点单当前渲染状态后立刻按你的口味现炒——不放多余的调料不走多余的分支。正因为生成的代码是针对当前场景特化过的才能在CPU上把性能压榨到极致。四、实战第一步克隆、构建让渲染引擎跑起来说一千道一万不如亲手跑一次。构建SwiftShader需要前置条件CMake3.15以上加一套C编译器Windows、Linux、macOS都支持。先拿到源码git clone https://gitcode.com/gh_mirrors/sw/swiftshader cd swiftshader然后进入构建mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease .. cmake --build . --parallel编译完成后在build目录下你会看到几个关键产物libvk_swiftshader.soLinux或libvk_swiftshader.dllWindows——这是ICD可安装客户端驱动也就是显卡驱动本体vk_swiftshader_icd.json——一份描述驱动位置的清单文件Vulkan加载器靠它找到SwiftShader。想验证引擎本身没问题可以跑一下自带的单元测试./vk-unittests如果使用的是Windows Visual Studio不用敲命令行直接用VS 2019打开项目文件夹等CMake配置完成后在CMake目标视图里选择vk_swiftshader项目编译即可。五、实战第二步让现有3D应用无缝切换到CPU渲染SwiftShader的设计目标之一就是免改代码应用怎么调Vulkan现在还怎么调只是底层驱动被偷偷换血了。怎么换通过加载器机制。Vulkan应用默认会找名为vulkan-1.dllLinux下是vulkan-1.so的加载器加载器再根据ICD清单把调用转发给真正的驱动。我们只要让加载器找到SwiftShader的ICD就行有两条路路线A直接指定ICD文件两平台通用最推荐# Linux export VK_ICD_FILENAMES$PWD/vk_swiftshader_icd.json # WindowsPowerShell $env:VK_ICD_FILENAMESD:\swiftshader\build\vk_swiftshader_icd.json路线B靠动态库搜索路径Linuxexport LD_LIBRARY_PATH$PWD:$LD_LIBRARY_PATH如果应用直接加载vulkan-1.dll也可以把SwiftShader的库改名为vulkan-1.dll放进可执行文件同目录Windows下大多数应用会优先使用同目录的DLL。Windows小贴士更省事的做法是把libvk_swiftshader.dll直接复制到应用exe旁边很多程序就会自动捡到它。设置完成后启动你的3D程序——画面照常渲染而实际干活的已经是CPU了。六、实战第三步一个参数让渲染提速近半认识SwiftShader.ini跑起来只是及格跑得快才是目标。SwiftShader支持一个非常朴素的运行时配置机制在工作目录放一个名为SwiftShader.ini的文本文件注意大小写敏感启动时它会自动被读取。最常见的性能瓶颈是线程数没对齐CPU核心数。默认情况下线程数取可用CPU核心数与16的较小值但在某些容器环境或超线程场景下这个自动值并不理想。手动指定一下往往立竿见影[Processor] ThreadCount8 AffinityMask0xff参数含义如下配置项作用说明ThreadCount调度器使用的渲染线程数设为0表示自动取CPU核心数与16较小值建议设为你的物理核心数AffinityMask线程核心亲和性掩码用十六进制位图指定线程允许跑在哪些核心上EnableSpirvProfiling是否启用SPIR-V性能剖析属于[Profiler]段调试性能瓶颈时开启在8核机器上如果默认自动值被环境干扰导致只用了很少线程把ThreadCount顶满物理核心数渲染耗时减少近半是很常见的。关于全部可配置项可查阅运行时配置文档完整参数清单以src/System/SwiftConfig.hpp为准。七、想更深入按图索骥去看源码和文档实践到这一步你已经有能力让3D应用在无GPU环境跑起来了。如果还想往深了钻下面这些路径能帮你少走弯路Vulkan接口实现src/Vulkan/——一个Vulkan驱动长什么样所有对象与命令的实现都在这里渲染管线src/Pipeline/——顶点、片元、计算等处理流程CPU渲染的车间所在Reactor与JITsrc/Reactor/——动态代码生成的核心Reactor里写Float y 1 - x;生成的是一段待JIT编译的机器码记录而非直接计算非常巧妙架构综述docs/Index.mdReactor设计详解docs/Reactor.md。八、总结从没显卡不能跑到没显卡照样跑回顾整条路线我们只做了三件事构建引擎、切换驱动、调节线程数——就完成了从硬件依赖到CPU渲染的迁移。这背后是SwiftShader硬件无关的承诺它把图形API从硬件的捆绑中解放出来让CPU也成为一等渲染公民。下一步建议你按这三步亲手试一遍先在有GPU的机器上把SwiftShader构建出来跑通vk-unittests再挑一个你自己写的或开源的小型Vulkan示例程序用VK_ICD_FILENAMES把它扳到CPU上跑最后用SwiftShader.ini调一调线程数感受参数对渲染速度的直观影响。当你在一个完全无显卡的服务器上看到3D画面顺利渲染出来时那种把不可能变成可能的成就感正是技术最迷人的地方。【免费下载链接】swiftshaderSwiftShader is a high-performance CPU-based implementation of the Vulkan graphics API. Its goal is to provide hardware independence for advanced 3D graphics.项目地址: https://gitcode.com/gh_mirrors/sw/swiftshader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表