3D图形开发实战:从坐标变换到渲染管线与性能优化
1. 从“2. 3D图形”这个标题说起为什么它值得单独拎出来讲看到“2. 3D图形”这个标题很多人第一反应可能是这不就是计算机图形学里最基础的一章吗教科书目录里排第二章前面讲完数学基础后面接着讲渲染管线平平无奇。但如果你真的在一线做过3D相关的项目——不管是游戏、数字孪生、工业仿真还是最近两年火起来的Web端3D展示——你就会发现这个看似朴素的标题背后藏着一整套从数学到工程、从硬件到软件的完整知识链条而且每一个环节都有大量“书上不写、踩过才知道”的细节。我自己第一次系统接触3D图形是在做一个工业设备的三维可视化项目。当时的需求听起来很简单把一台设备的模型加载到网页里能旋转、能缩放、能点击某个零件弹出信息。我心想这有什么难的找个3D库加载模型加个轨道控制器完事。结果真正上手之后问题一个接一个模型面数太高导致页面卡死、光照方向不对导致金属质感全无、坐标系搞混导致零件飞到屏幕外面、深度测试没开导致前后遮挡关系错乱。那段时间我几乎把3D图形的基础知识重新学了一遍才明白“2. 3D图形”这个标题下面真正要掌握的不是某个API怎么调用而是空间思维、坐标变换、渲染流程、性能权衡这几件事。所以这篇内容我想从一个实际从业者的角度把3D图形这个主题拆开来讲。不是照本宣科地复述教科书而是把那些真正影响你项目成败的核心点讲透。无论你是刚接触3D图形的新手还是已经能写Shader但总觉得底层逻辑不够扎实的开发者都能从下面这些内容里找到对自己有用的部分。我会从最基础的空间认知讲起一路讲到渲染管线、性能优化和实际项目中的取舍中间穿插大量我在真实项目里踩过的坑和总结出来的经验。2. 三维空间到底难在哪从二维思维到三维思维的跨越2.1 为什么很多人卡在“空间想象”这一关3D图形学习的第一道门槛其实不是代码而是空间想象力。我们平时写二维界面坐标就是x和y左上角是原点往右x增大往下y增大非常直观。但到了三维空间事情一下子复杂了多了一个z轴而且这个z轴的方向在不同系统里还不一样。有的系统里z轴指向屏幕外有的指向屏幕里有的用右手坐标系有的用左手坐标系。我第一次在项目里混合使用两个不同的3D库时就因为坐标系约定不同导致模型加载进来之后整个是镜像翻转的折腾了大半天才定位到问题。这里有一个很实用的判断方法伸出你的右手让拇指、食指、中指互相垂直。拇指指向x轴正方向食指指向y轴正方向那么中指指向的就是z轴正方向——这就是右手坐标系。OpenGL传统上使用右手坐标系而DirectX传统上使用左手坐标系。Web端的Three.js默认是右手坐标系但它的相机默认朝向是-z方向这一点如果没搞清楚你会发现自己明明把物体放在原点相机也在原点附近但屏幕上什么都看不到。提示在任何一个3D项目开始之前先花五分钟确认三件事——坐标系是左手还是右手、相机的默认朝向、模型的单位尺度。这三件事没对齐后面全是坑。2.2 坐标变换链一个顶点从模型到屏幕的完整旅程理解3D图形最核心的一条线索就是坐标变换链。一个三维模型上的顶点要最终显示在二维屏幕上需要经过一系列变换。这个过程听起来抽象但你可以把它想象成拍照片模型空间就像你手里拿着的那个小摆件世界空间就像你把摆件放到桌子的某个位置相机空间就像你举起相机对准摆件裁剪空间就像你调整取景框决定哪些部分入镜屏幕空间就是最终洗出来的照片。具体来说一个顶点坐标要依次乘以模型矩阵、视图矩阵、投影矩阵最后经过透视除法得到归一化设备坐标再映射到屏幕像素坐标。每一步都有明确的几何意义模型矩阵把顶点从模型自身的局部坐标系变换到世界坐标系。它包含了平移、旋转、缩放信息。比如你把一个立方体从原点移动到(10, 0, 5)再绕y轴旋转45度这些操作全部编码在模型矩阵里。视图矩阵把世界坐标系中的点变换到以相机为原点的坐标系。它的本质是相机变换的逆矩阵。你可以理解为“把整个世界反向移动让相机回到原点并朝向-z方向”。投影矩阵决定透视效果。正交投影不会产生近大远小的效果适合工程制图透视投影模拟人眼视觉适合大多数3D场景。透视投影矩阵的关键参数是视场角、宽高比、近裁剪面和远裁剪面。透视除法把齐次坐标的w分量除掉得到归一化设备坐标。这一步是透视效果真正生效的地方——离相机越远的物体w越大除完之后坐标越靠近中心看起来就越小。我在实际项目里遇到过一个典型问题两个物体明明在三维空间里一前一后但渲染出来后面的物体盖住了前面的。排查后发现是投影矩阵的近裁剪面设得太小导致深度精度不够两个物体的深度值在归一化之后几乎一样深度测试无法正确区分。把近裁剪面从0.0001调整到0.1之后问题立刻消失。这个经验告诉我投影矩阵的参数不是随便填的它直接决定了深度缓冲的精度分布。2.3 法线、切线、副切线容易被忽略但至关重要的属性除了位置坐标三维模型上每个顶点通常还携带法线、切线、副切线等属性。法线决定光照计算的方向切线空间用于法线贴图的正确采样。很多新手在加载模型后发现光照效果很奇怪表面一块亮一块暗往往就是因为法线数据有问题——要么模型导出时没有包含法线要么法线没有归一化要么法线空间和着色器里假设的不一致。我个人的习惯是在模型导入管线里加一道检查遍历所有顶点的法线确认它们的长度接近1并且方向大致朝外。如果发现法线长度偏差超过阈值就在导入时自动重新计算。这个检查帮我省去了无数次“光照看起来不对劲”的调试时间。3. 渲染管线拆解每个阶段到底在做什么3.1 应用阶段CPU端的准备工作渲染管线的第一阶段是应用阶段运行在CPU上。这个阶段的主要任务包括场景管理、视锥剔除、渲染状态排序、绘制调用准备。很多人觉得这些是“引擎该做的事”自己写Demo时不太在意但一旦场景规模上去应用阶段的优化空间其实非常大。视锥剔除是最基础的优化手段把相机看不到的物体直接排除在渲染列表之外。我做过一个测试在一个包含两千个物体的场景里开启视锥剔除后绘制调用从两千次降到三百次左右帧率直接翻倍。实现视锥剔除的原理并不复杂把物体的包围盒和相机的六个裁剪面做相交测试如果完全在某个裁剪面之外就剔除。包围盒可以用轴对齐包围盒计算简单虽然不够精确但足够快。渲染状态排序同样关键。每次切换Shader、切换纹理、切换混合模式都会带来状态切换开销。合理的做法是把使用相同材质和纹理的物体排在一起渲染减少状态切换次数。我在一个数字孪生项目里把场景中所有使用同一套材质参数的设备排在一起绘制调用次数没变但帧率提升了将近百分之四十原因就是状态切换大幅减少。3.2 几何阶段顶点着色器与图元装配几何阶段从顶点着色器开始。顶点着色器对每个顶点执行一次主要工作是坐标变换和传递数据给后续阶段。这里有一个常见的性能陷阱在顶点着色器里做过于复杂的计算。顶点着色器虽然并行度很高但如果每个顶点都要做几十次三角函数运算顶点数量一多就会成为瓶颈。图元装配阶段把顶点组装成三角形。这里有一个容易被忽视的点三角形的绕序决定了正面和背面。默认情况下逆时针绕序的三角形被认为是正面。如果你的模型绕序反了开启背面剔除后会发现模型“消失”了——因为所有面都被当成背面剔除了。我在导入一个外部模型时就遇到过这个问题模型在Blender里看起来正常导入引擎后一片空白最后发现是导出时绕序设置反了。3.3 光栅化阶段从三角形到像素光栅化是把三角形转换成屏幕上的像素片段的过程。这个阶段的核心任务是确定每个三角形覆盖了哪些像素以及每个像素的重心坐标。重心坐标用于在三角形内部插值顶点属性比如颜色、法线、纹理坐标。光栅化阶段有一个重要规则像素中心点落在三角形内部才算覆盖。这导致非常细的三角形可能一个像素都覆盖不到产生闪烁或断裂。我在做细长管道类模型时就遇到过这个问题管道壁很薄远看时断断续续。解决方案是开启多重采样抗锯齿或者适当增加模型厚度。3.4 片元阶段像素着色器与最终输出片元阶段对每个像素片段执行一次片元着色器。这里进行纹理采样、光照计算、阴影计算、雾效等。片元着色器是性能消耗的大头因为它执行的次数等于屏幕像素数乘以过度绘制率。过度绘制是一个隐形杀手。如果场景中有大量半透明物体层层叠加同一个像素可能被着色几十次。我在一个粒子特效场景里测过关闭深度测试后过度绘制率高达8倍帧率从60掉到20。解决办法是尽量让不透明物体先渲染并写入深度半透明物体按从远到近排序后渲染并且尽量控制半透明层的数量。4. 光照与材质让3D物体看起来“像那么回事”4.1 从Lambert到PBR光照模型的演进逻辑最基础的光照模型是Lambert漫反射它假设光线在粗糙表面均匀散射亮度只和光线方向与法线夹角的余弦值有关。这个模型计算简单但看起来非常“塑料”没有高光没有环境反射金属和木头看起来一模一样。后来出现了Phong模型和Blinn-Phong模型加入了高光项。Blinn-Phong用半程向量代替反射向量计算更高效高光形状也更自然。但Blinn-Phong仍然是一个经验模型参数需要手动调不同光照环境下效果不一致。现在主流的方案是PBR基于物理的渲染。PBR的核心思想是用一组物理上有意义的参数来描述材质反照率、金属度、粗糙度、法线。这些参数在不同光照环境下都能给出一致的结果。我在项目里切换到PBR之后最大的感受是材质调参变得有据可依了——以前调高光强度全靠感觉现在只需要调整粗糙度金属感不对就调金属度逻辑非常清晰。4.2 法线贴图用两张三角形骗过眼睛法线贴图是3D图形里最“划算”的技术之一。它用一张纹理存储每个像素的法线方向让低面数模型在光照下呈现出高面数模型的细节。原理其实很直观原本一个平面上的所有像素法线都朝同一个方向光照计算出来是均匀的用法线贴图之后每个像素的法线方向都不同光照计算出来就有了凹凸感。但法线贴图有一个关键前提切线空间必须正确。法线贴图里存储的法线是相对于切线空间的如果模型的切线数据不对法线贴图的效果就会完全错乱。我在一个项目里发现角色脸上的法线贴图看起来像“糊了一层泥”排查后发现是模型导出时没有生成切线引擎自动计算的切线和UV方向不匹配。重新导出并勾选切线生成后细节立刻清晰了。4.3 阴影从Shadow Map到级联阴影阴影是增强3D场景真实感的关键。最常用的阴影技术是Shadow Map从光源视角渲染一张深度图然后在主渲染时把每个像素变换到光源空间比较深度值判断是否在阴影中。Shadow Map的经典问题是锯齿和阴影痤疮。锯齿是因为深度图分辨率有限阴影边缘呈阶梯状阴影痤疮是因为深度比较时的精度误差导致物体表面出现条纹状自阴影。解决锯齿可以用百分比渐近过滤解决痤疮可以加深度偏移或者用法线偏移。对于大场景单张Shadow Map不够用需要级联阴影把相机视锥按距离分成几段每段用不同分辨率的Shadow Map。近处用高分辨率保证细节远处用低分辨率节省性能。我在一个室外场景项目里用三级级联阴影把阴影质量提升了明显一个档次而性能开销只增加了不到百分之十五。5. 性能优化3D项目绕不开的硬仗5.1 Draw Call合并从一千次到一百次Draw Call是CPU向GPU发送绘制命令的开销。每次Draw Call都有固定的CPU开销如果场景里有几千个独立物体每个物体一次Draw CallCPU很快就会成为瓶颈。合并Draw Call的核心思路是把使用相同材质的物体合并成一个批次。静态合批适用于不会移动的物体在加载时把多个网格合并成一个大的网格一次绘制。动态合批适用于会移动但使用相同材质的小物体每帧在CPU端把它们的顶点变换到世界空间合并后一次绘制。GPU Instancing适用于大量相同的物体一次Draw Call绘制多个实例每个实例有不同的变换矩阵。我在一个仓库可视化项目里场景中有上千个货架单元最初每个货架一次Draw Call帧率只有二十多。后来用GPU Instancing把相同规格的货架合并Draw Call降到个位数帧率稳定在六十。这里的关键是相同规格——如果每个货架的尺寸、材质都不同Instancing就用不了只能考虑纹理图集加静态合批。5.2 LOD距离越远细节越少LOD是Level of Detail的缩写思路非常朴素物体离相机远的时候用低面数模型离得近的时候用高面数模型。这样可以在不影响视觉体验的前提下大幅减少三角形数量。LOD的难点在于切换时的“跳变”。如果高低模差异太大切换瞬间用户会看到物体突然变形。解决办法是设置合理的切换距离并且在切换时做平滑过渡。我在项目里通常会把LOD切换距离设在物体屏幕占比百分之十左右这个比例下切换几乎察觉不到。5.3 纹理压缩与内存管理纹理是显存占用的主要来源。一张4096乘4096的RGBA纹理未压缩时占用64MB显存。如果场景里有几十张这样的纹理显存很快就会爆掉。纹理压缩可以把显存占用降低到原来的四分之一到六分之一。常见的压缩格式有ETC、ASTC、BC系列。选择哪种格式取决于目标平台移动端通常用ETC2或ASTC桌面端用BC7。我在一个跨平台项目里同一套纹理资源针对不同平台导出不同压缩格式显存占用从原来的1.2GB降到了300MB左右加载速度也快了很多。注意纹理压缩是有损的压缩质量需要根据纹理内容调整。法线贴图对压缩误差特别敏感通常需要比颜色贴图更高的压缩质量设置。6. 实际项目中的取舍没有最优解只有最合适6.1 实时渲染 vs 离线渲染的选择不是所有3D项目都需要实时渲染。如果你的场景是产品展示、建筑漫游这类对交互性要求不高的场景离线渲染可以给你电影级的画质代价是渲染时间长。但如果需要用户自由旋转、缩放、点击交互就必须用实时渲染。我做过一个对比同一个工业设备模型用离线渲染出图单帧渲染时间大约三分钟画质极佳用实时渲染帧率稳定在六十画质虽然不如离线但完全满足展示需求。最终项目选择了实时渲染因为客户需要能够自由查看设备的各个角度。6.2 Web端3D的独特挑战Web端3D和原生应用相比有几个独特的限制JavaScript的执行效率、浏览器的内存限制、网络传输带宽。这些限制决定了Web端3D项目必须做更多的取舍。模型面数要严格控制通常单个模型不超过十万个三角形纹理尺寸要压缩单张不超过2048要充分利用浏览器的缓存机制把模型和纹理做合理的分包加载。我在一个Web端3D展示项目里把模型从三十万面减到八万面纹理从4096降到1024视觉上几乎看不出差别但加载时间从十几秒降到了三秒以内。6.3 移动端3D的功耗与发热移动端3D最大的敌人不是性能而是功耗和发热。手机GPU持续高负载运行几分钟就会降频帧率断崖式下跌。所以移动端3D项目的优化目标不是峰值帧率而是稳定帧率。我的经验是移动端3D场景的GPU负载控制在百分之六十左右比较合适留出余量应对突发计算。具体手段包括降低渲染分辨率、减少每帧的绘制调用、避免复杂的后处理效果、控制同屏三角形数量。在一个移动端AR项目里我把渲染分辨率从原生降到百分之七十画面几乎看不出模糊但帧率稳定性提升了一倍。7. 一些让我印象深刻的踩坑记录7.1 深度冲突当两个面“打架”的时候深度冲突是3D渲染里非常经典的问题两个面靠得非常近时深度缓冲的精度不足以区分它们导致渲染结果出现闪烁的条纹。我在一个建筑可视化项目里地板和地毯两个面几乎重合相机移动时地毯上出现大量闪烁的斑块。解决办法有几种一是拉开两个面的距离这是最直接的二是使用深度偏移在渲染其中一个面时给它的深度值加一个微小偏移三是提高深度缓冲的精度比如用24位或32位深度缓冲代替16位。我最终选择了深度偏移因为地板和地毯的间距在视觉上不能改而深度缓冲精度已经用满了。7.2 透明物体的排序难题透明物体不能写入深度缓冲否则会遮挡后面的透明物体。但不写深度又会导致透明物体之间的前后关系无法自动确定必须手动按从远到近排序。问题是当透明物体互相穿插时按物体中心排序也不对。我在一个玻璃器皿展示项目里就遇到了这个问题几个玻璃杯叠在一起按中心排序后有的杯子的前半部分被另一个杯子的后半部分错误遮挡。最终的解决方案是开启深度预通道先渲染所有不透明物体写入深度然后对透明物体做逐像素排序——虽然开销大但效果正确。如果性能不允许就只能接受一定程度的错误或者调整相机角度避开穿插。7.3 法线贴图在移动端的精度问题移动端GPU对法线贴图的精度支持不如桌面端。我在一个移动端项目里发现同样的法线贴图在桌面浏览器上效果正常在手机上却出现明显的块状伪影。原因是移动端GPU的纹理采样精度较低法线贴图的压缩格式也有影响。解决办法是法线贴图使用更高精度的压缩格式或者在片元着色器里对采样结果做一次归一化。归一化虽然增加了一点计算量但消除了大部分伪影。这个经验让我意识到跨平台3D项目不能假设所有平台的渲染结果一致必须在目标设备上实际测试。8. 写给正在入门3D图形的朋友如果你刚开始接触3D图形我的建议是不要一上来就啃厚重的图形学教材。先从一个小项目做起加载一个模型加一个方向光让模型能旋转。这个过程中你会自然遇到坐标变换、光照计算、相机控制这些核心概念带着问题去查资料理解会深刻得多。然后逐步增加复杂度加法线贴图、加阴影、加多个光源、加后处理。每加一个功能都去理解它背后的原理而不是复制粘贴代码。3D图形是一个实践性极强的领域看十遍不如写一遍。最后养成用工具分析问题的习惯。RenderDoc可以抓取一帧的完整渲染过程看到每个Draw Call的状态和输出Spector.js可以在浏览器里做类似的事情。这些工具能帮你快速定位问题比盲目改代码高效得多。我在实际项目里最深的体会是3D图形的知识体系像一座冰山水面之上是各种API和效果水面之下是数学、硬件架构和工程权衡。只学水面之上的部分遇到复杂问题就会束手无策理解了水面之下的逻辑很多问题会变得有迹可循。希望这篇内容能帮你看到更多水面之下的东西。

相关新闻

物联网复杂无线通信场景下,天线系统如何成为连接能力的关键组件

物联网复杂无线通信场景下,天线系统如何成为连接能力的关键组件

1. 引言 在物联网加速落地的今天,设备能否稳定联网,往往不取决于主控芯片有多快,而取决于天线系统能不能在多频段、多协议、高密度、严苛环境中保持干净、高效、可靠的信号传输。尤其当设备被压缩到手机大小、需要同时运行蜂窝、GNSS、Wi-Fi、…

2026/10/9 5:28:34 阅读更多 →
虚拟机安装Linux 步骤

虚拟机安装Linux 步骤

一.利用vmware安装Linux操作系统的详细步骤(图文字注解)1.软件安装在网络中找到vmware-workstartion的安装包,推荐大家安装17.6版本。2.软件运行身份选择右键选择软件图标,选择列表中的属性,在快捷方式中点击高级&…

2026/10/9 5:28:34 阅读更多 →
AnyPS5:一种面向高性能交互体验的系统级优化方法论

AnyPS5:一种面向高性能交互体验的系统级优化方法论

项目标题:“AnyPS5”这个名称本身带有强烈的指向性与模糊性并存的特征——它既像一个技术代号,又像一句口号;既暗示兼容性、泛用性(“Any”),又锚定在特定硬件生态(“PS5”)。但问题…

2026/10/9 5:28:34 阅读更多 →

最新新闻

SSR 前端项目 Docker 本地部署实战:从 Dockerfile 到 compose 编排

SSR 前端项目 Docker 本地部署实战:从 Dockerfile 到 compose 编排

如果你写过或者接手过 SSR 前端项目,大概都有过这种经历:本地npm run dev跑得飞起,可真要让项目在另一台电脑上跑起来,或者部署到服务器上验证,就开始连环翻车——Node 版本不对、系统库缺失、环境变量没配、数据库连不…

2026/10/9 6:05:01 阅读更多 →
波士顿房价预测实战:正规方程原理、矩阵推导与代码实现

波士顿房价预测实战:正规方程原理、矩阵推导与代码实现

波士顿房价预测这个项目,入门机器学习的朋友基本都绕不过去。而我更想说的是,越是那种“代码实现看起来只有几行”的项目,越值得把原理抠明白。拿正规方程(Normal Equation)来解线性回归,很多时候代码就是矩…

2026/10/9 6:05:01 阅读更多 →
微服务分布式事务与幂等设计:从原理到Seata实战

微服务分布式事务与幂等设计:从原理到Seata实战

半夜两点被电话叫起来,运营语气很急:商品A的库存变成负数了。打开数据库一看,下单记录两条——用户点了一次下单按钮,前端超时后自动重试了一次,网关层的重试机制又补了一刀,三笔请求最终都执行了库存扣减&…

2026/10/9 6:05:01 阅读更多 →
MySQL Host not allowed连接错误的原理与全场景排查指南

MySQL Host not allowed连接错误的原理与全场景排查指南

1. 问题本质与真实场景还原:这不是连接失败,而是权限拦截的明确信号“Host xxx.xx.xx-xx.xx.com is not allowed to connect to this MySQL server”——这行报错在某高校数据库运维组、某SaaS公司后端团队、某外包项目交付现场,几乎每周都会…

2026/10/9 6:05:01 阅读更多 →
AI论文写作全流程工具链:从选题到答辩的效率革命

AI论文写作全流程工具链:从选题到答辩的效率革命

从选题卡壳到终稿交上,我带着两届本科生的论文打磨经验,把AI工具按“全链路”重新趟了一遍。这篇不讲虚的,直接告诉你:哪个环节用哪款工具、怎么提问才能拿到能用的话、哪些坑踩了会出事。不管你是刚开题还是deadline逼近&#xf…

2026/10/9 6:05:01 阅读更多 →
AI系统扩容避坑指南:横向扩容还是纵向扩容?从原理到决策框架

AI系统扩容避坑指南:横向扩容还是纵向扩容?从原理到决策框架

1. 扩容决策的起点:两个方向,两种代价先聊一个我经常被问的问题:AI系统跑不动了——推理延迟飙升、训练任务排队、GPU显存告急——到底该加机器还是换大机器?这个问题听起来简单,但每次认真回答完,对方都会…

2026/10/9 6:04:00 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →