Three.js渲染较大的模型之解决方案

文章目录

    • Three.js渲染较大的模型 解决方案
    • 视锥体剔除实例 和 遮挡剔除 实例
      • 视锥体剔除(Frustum Culling)实例
        • 原理概述
        • 代码示例
        • 解释
      • 遮挡剔除(Occlusion Culling)实例
        • 原理概述
        • 代码示例
        • 解释
    • three.js 模型压缩

Three.js渲染较大的模型 解决方案

一、模型优化方面

  1. 简化模型结构

    • 对于复杂的3D模型,可以使用专业的3D建模软件(如Blender、Maya等)来减少模型的面数和顶点数。例如,在不影响模型整体外观的前提下,将高细节的装饰部分进行简化,将复杂的曲线用更简单的几何形状近似。
    • 利用建模软件中的减面工具,这些工具可以根据设定的参数,自动减少模型的多边形数量。比如将一个具有数百万个面的高精度角色模型,通过合理的减面操作,降低到数十万面,同时保留主要的外形特征。
  2. 使用LOD(Level of Detail)技术

    • LOD是一种根据物体与摄像机的距离来切换模型细节程度的技术。在Three.js中,可以创建多个具有不同细节层次的模型版本。
    • 例如,对于一个大型的建筑模型,当摄像机距离建筑较远时,使用一个低细节版本的模型,它可能只有简单的几何形状和较少的纹理;当摄像机靠近建筑时,切换到高细节版本的模型,显示更多的细节,如门窗的细节、建筑表面的装饰纹理等。通过这种方式,可以有效地减少远处模型的渲染负担。
    • 可以使用THREE.LOD对象来实现。首先创建不同细节层次的模型,然后将它们添加到THREE.LOD对象中,并设置相应的距离范围。例如:
    const lod = new THREE.LOD();
    const lowDetailModel = new THREE.Mesh(lowDetailGeometry, lowDetailMaterial);
    const mediumDetailModel = new THREE.Mesh(mediumDetailGeometry, 
    mediumDetailMaterial);
    const highDetailModel = new THREE.Mesh(highDetailGeometry, highDetailMaterial);
    lod.addLevel(lowDetailModel, 200); // 当距离大于200时显示低细节模型
    lod.addLevel(mediumDetailModel, 100); // 当距离小于200大于100时显示中细节模型
    lod.addLevel(highDetailModel, 0);   // 当距离小于100时显示高细节模型
    scene.add(lod);
    
  3. 压缩纹理

    • 对于模型的纹理,如果纹理文件较大,可以使用图像编辑软件(如Photoshop)或专门的纹理压缩工具来减小纹理文件的大小。
    • 例如,将高分辨率的纹理(如4096x4096像素)转换为更合适的分辨率(如2048x2048像素),同时采用合适的纹理压缩格式,如DXT(DirectX Texture Compression)或ETC(Ericsson Texture Compression)格式,这些格式可以在保持一定纹理质量的同时显著减小文件大小。在Three.js中,加载纹理时可以指定压缩后的纹理文件路径。

二、渲染优化方面

  1. 视锥体剔除(Frustum Culling)

    • Three.js会自动进行视锥体剔除,它的原理是只渲染位于摄像机视锥体内的物体。但是对于复杂的场景和大型模型,确保正确设置模型的包围盒(Bounding Box或Bounding Sphere)可以提高视锥体剔除的效率。
    • 例如,对于一个由多个部分组成的大型机械模型,为每个可分离的部分设置准确的包围盒,这样当某个部分完全在视锥体外时,Three.js可以快速地跳过对该部分的渲染。在模型加载或初始化阶段,可以通过计算模型的最小包围盒或包围球来实现更精确的视锥体剔除。
  2. 遮挡剔除(Occlusion Culling)

    • 遮挡剔除是指不渲染被其他物体完全遮挡的物体。在Three.js中,可以使用一些插件或自定义算法来实现遮挡剔除。
    • 一种简单的方法是基于深度缓冲来实现近似的遮挡剔除。首先渲染场景的深度信息,然后在后续渲染过程中,对于那些深度值大于当前像素深度的物体部分,可以认为是被遮挡的,从而不进行渲染。不过这种方法有一定的局限性,对于复杂的透明物体等情况可能需要更复杂的算法。
  3. 使用实例化(Instancing)技术

    • 如果模型中有大量重复的元素,例如森林中的树木、城市中的路灯等,使用实例化可以显著提高渲染效率。
    • 在Three.js中,可以使用THREE.InstancedMesh来实现实例化渲染。它允许使用一个单一的几何体和材质来渲染多个相同的物体实例。例如,要渲染一片森林,可以先创建一个树的几何体和材质,然后使用THREE.InstancedMesh来创建大量的树实例,通过设置每个实例的位置、旋转和缩放等变换矩阵,就可以高效地渲染整个森林。代码示例如下:
    const treeGeometry = new THREE.BoxGeometry(1, 2, 1);
    const treeMaterial = new THREE.MeshLambertMaterial({ color: 0x00ff00 });
    const treeInstances = new THREE.InstancedMesh(treeGeometry, treeMaterial,1000); // 1000个树实例
    for (let i = 0; i < 1000; i++) {const matrix = new THREE.Matrix4();matrix.setPosition(new THREE.Vector3(Math.random() * 100 - 50, 0, Math.random() * 100 - 50));matrix.setRotationFromAxisAngle(new THREE.Vector3(0, 1, 0),Math.random() * 2 * Math.PI);matrix.scale(new THREE.Vector3(Math.random() * 0.5 + 0.5, Math.random() * 0.5 + 0.5, Math.random() * 0.5 + 0.5));treeInstances.setMatrixAt(i, matrix);
    }
    scene.add(treeInstances);
    
  4. 优化渲染循环(Render Loop)

    • 在渲染循环中,避免不必要的计算和渲染操作。例如,只有当模型的属性(如位置、旋转、材质等)发生变化时,才重新计算和渲染相关部分。
    • 可以使用节流(Throttle)或防抖(Debounce)技术来控制渲染频率。如果模型的动画更新频率不需要非常高,可以使用节流函数来限制每秒的渲染次数。例如,使用lodash库中的throttle函数来控制渲染循环的执行频率:
    import throttle from 'lodash/throttle';
    function render() {renderer.render(scene, camera);
    }
    const throttledRender = throttle(render, 1000 / 30); // 限制每秒渲染30次
    function animate() {// 模型更新等操作throttledRender();requestAnimationFrame(animate);
    }
    animate();
    

视锥体剔除实例 和 遮挡剔除 实例

视锥体剔除(Frustum Culling)实例

原理概述

视锥体剔除是指只渲染位于摄像机视锥体内的物体,Three.js本身内置了对视锥体剔除的基本支持,但我们可以通过合理设置物体的包围盒(Bounding Box或Bounding Sphere)来优化这个过程,提高剔除效率。

代码示例
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Frustum Culling Example</title><style>body {margin: 0;overflow: hidden;}</style><script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r134/three.min.js"></script>
</head><body><script>// 创建场景const scene = new THREE.Scene();// 创建摄像机const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);camera.position.z = 5;// 创建渲染器const renderer = new THREE.WebGLRenderer();renderer.setSize(window.innerWidth, window.innerHeight);document.body.appendChild(renderer.domElement);// 创建多个立方体(模拟多个物体)const cubeGeometry = new THREE.BoxGeometry(1, 1, 1);const cubeMaterial = new THREE.MeshBasicMaterial({ color: 0x00ff00 });const numCubes = 10;for (let i = 0; i < numCubes; i++) {const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);cube.position.x = (Math.random() - 0.5) * 10;cube.position.y = (Math.random() - 0.5) * 10;cube.position.z = (Math.random() - 0.5) * 10;// 为每个立方体设置包围盒//(这里使用包围盒辅助对象可视化展示,实际应用中不需要可视化部分)const box = new THREE.Box3().setFromObject(cube);scene.add(cube);}// 渲染函数const render = () => {renderer.render(scene, camera);};// 动画循环const animate = () => {requestAnimationFrame(animate);// 模拟摄像机移动camera.position.x += 0.01;camera.position.y += 0.01;camera.lookAt(scene.position);render();};animate();</script>
</body></html>
解释
  1. 首先创建了一个基本的Three.js场景,包含了透视摄像机、渲染器等基础元素。
  2. 通过循环创建了多个立方体(模拟多个物体),并为每个立方体设置了随机的位置。
  3. 对于每个立方体,使用THREE.Box3().setFromObject(cube)创建了包围盒,这里额外添加了THREE.Box3Helper来可视化包围盒(在实际的应用中,如果不需要可视化展示,这一步只是为了内部计算包围盒范围,不需要添加这个辅助对象)。Three.js会基于这个包围盒自动进行视锥体剔除,在渲染时,只有处于摄像机视锥体内的立方体会被渲染(以及它们对应的可视化包围盒辅助对象,如果有的话)。
  4. 在动画循环中,模拟了摄像机的移动,随着摄像机位置变化,视锥体范围改变,视锥体剔除机制持续生效,决定哪些立方体被渲染出来。

遮挡剔除(Occlusion Culling)实例

原理概述

遮挡剔除是指不渲染被其他物体完全遮挡的物体,下面的示例是一种基于深度缓冲来实现近似遮挡剔除的简单方法。基本思路是先渲染场景的深度信息,然后在后续渲染过程中,对于那些深度值大于当前像素深度的物体部分,认为是被遮挡的,从而不进行渲染。不过这种方法对于复杂的透明物体等情况有一定局限性。

代码示例
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Occlusion Culling Example</title><style>body {margin: 0;overflow: hidden;}</style><script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r134/three.min.js"></script>
</head><body><script>// 创建场景const scene = new THREE.Scene();// 创建透视摄像机const camera = new THREE.PerspectiveCamera(75,window.innerWidth / window.innerHeight, 0.1, 1000);camera.position.z = 5;// 创建渲染器const renderer = new THREE.WebGLRenderer();renderer.setSize(window.innerWidth, window.innerHeight);document.body.appendChild(renderer.domElement);// 创建地板平面(作为遮挡物示例)const floorGeometry = new THREE.PlaneGeometry(10, 10);const floorMaterial = new THREE.MeshBasicMaterial({ color: 0xcccccc });const floor = new THREE.Mesh(floorGeometry, floorMaterial);floor.rotation.x = -Math.PI / 2;scene.add(floor);// 创建多个球体(模拟被遮挡物体)const sphereGeometry = new THREE.SphereGeometry(0.5, 32, 32);const sphereMaterial = new THREE.MeshBasicMaterial({ color: 0x00ff00 });const numSpheres = 5;for (let i = 0; i < numSpheres; i++) {const sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);sphere.position.x = (Math.random() - 0.5) * 5;sphere.position.y = (Math.random() * 0.5) + 0.5;sphere.position.z = (Math.random() - 0.5) * 5;scene.add(sphere);}// 渲染深度缓冲的渲染目标const depthRenderTarget = new THREE.WebGLRenderTarget(window.innerWidth,window.innerHeight);// 渲染深度信息的函数const renderDepth = () => {renderer.setRenderTarget(depthRenderTarget);renderer.clear();renderer.render(scene, camera);renderer.setRenderTarget(null);};// 正常渲染函数const renderScene = () => {renderer.render(scene, camera);};// 动画循环const animate = () => {requestAnimationFrame(animate);// 先渲染深度信息renderDepth();// 再渲染场景,此时可以基于深度信息进行简单的遮挡判断//(Three.js内部基于深度缓冲有一定的机制来辅助实现部分遮挡剔除效果)renderScene();};animate();</script>
</body></html>
解释
  1. 同样先构建了基础的Three.js场景,包含摄像机、渲染器等,并且创建了一个地板平面(作为遮挡物)以及多个球体(作为可能被遮挡的物体),设置了它们的位置和几何形状、材质等属性。
  2. 创建了一个WebGLRenderTarget对象作为渲染深度缓冲的目标,它的大小与窗口大小一致。
  3. 在动画循环中,首先调用renderDepth函数,这个函数将渲染器的目标设置为之前创建的深度渲染目标,先清空它,然后渲染整个场景到这个深度渲染目标中,这样就获取了场景的深度信息(实际上是深度缓冲的内容),之后再将渲染器的目标设置回默认(null,即渲染到屏幕上)。
  4. 接着调用renderScene函数正常渲染整个场景,此时Three.js会基于之前渲染得到的深度缓冲信息,在一定程度上自动进行一些简单的遮挡判断,不渲染那些深度值大于当前像素深度的物体部分(不过要注意这种方法对于复杂情况有局限性,比如透明物体的遮挡关系处理就比较复杂,还需要更复杂的算法来完善)。

three.js 模型压缩

  1. Draco在Three.js中的应用

    • Draco压缩原理
      • Draco是一种高效的3D数据压缩格式。它主要通过预测和量化技术来减少3D模型数据的大小。例如,对于模型的顶点位置和法向量等几何信息,Draco会分析其分布规律,利用相邻顶点之间的相关性进行预测编码。在量化过程中,它会将高精度的数值转换为较低精度的表示形式,从而大大减少数据量。
    • Three.js中的Draco加载流程
      • 设置加载器
        • 首先需要引入DRACOLoaderGLTFLoaderDRACOLoader用于处理Draco压缩的数据,GLTFLoader用于加载GLTF模型格式(因为Draco通常用于压缩GLTF模型)。
        import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
        import { DRACOLoader} from 'three/examples/jsm/loaders/DRACOLoader.js';
        
      • 配置解码器路径
        • 初始化DRACOLoader后,需要设置解码器路径。解码器可以从Google的官方服务器获取,也可以下载到本地使用。
        const dracoLoader = new DRACOLoader();
        dracoLoader.setDecoderPath
        ('https://www.gstatic.com/draco/v1/decoders/');
        
      • 关联加载器
        • DRACOLoader关联到GLTFLoader上,这样GLTFLoader就能识别和处理Draco压缩的GLTF模型。
        const gltfLoader = new GLTFLoader();
        gltfLoader.setDRACOLoader(dracoLoader);
        
      • 加载模型
        • 最后使用gltfLoader.load方法加载模型。这个方法接受模型文件路径、加载成功回调函数、加载进度回调函数和加载失败回调函数。
        gltfLoader.load('draco_compressed_model.gltf', function (gltf) {const model = gltf.scene;scene.add(model);
        }, function (xhr) {console.log((xhr.loaded / xhr.total * 100) + '% loaded');
        }, function (error) {console.log('An error occurred', error);
        });
        
  2. gltf - pipeline

    • gltf - pipeline概述
      • gltf - pipeline是一个用于处理GLTF模型的工具集。它允许开发者在模型加载前或加载后对GLTF模型进行各种优化操作,如压缩、转换、添加或删除特定的模型属性等。
    • 主要功能和应用场景
      • 模型压缩
        • 可以使用gltf - pipeline进一步压缩已经是GLTF格式的模型。例如,通过优化纹理、量化顶点数据等方式,在Draco压缩的基础上进一步减小模型文件大小。它可以将模型的几何数据、纹理数据等进行更精细的处理,以达到更好的压缩效果。
      • 模型转换和优化
        • 有时候,原始的GLTF模型可能包含一些不必要的信息或者不符合特定的渲染要求。gltf - pipeline可以用于转换模型,比如将模型的坐标系进行调整,或者将模型的材质属性进行统一优化。例如,将多个不同类型的材质转换为更适合WebGL渲染的材质类型,提高渲染效率。
    • 使用示例(命令行工具)
      • 安装
        • 首先需要在项目目录下通过npm安装gltf - pipeline。
        npm install -g gltf-pipeline
        
      • 基本用法 - 模型压缩
        • 假设要压缩一个GLTF模型,可以使用以下命令。这个命令会对输入的模型进行一系列优化处理,包括几何数据和纹理数据的优化,然后输出一个新的压缩后的模型。
        gltf-pipeline -i input_model.gltf -o output_model.gltf -d
        
        • 其中-i指定输入模型路径,-o指定输出模型路径,-d表示进行Draco压缩(如果已经是Draco压缩的模型,这个选项可能会进一步优化)。
    • 在JavaScript代码中集成(高级用法)
      • 安装依赖
        • 除了安装gltf - pipeline,还需要安装相关的JavaScript库,如@gltf - pipeline/functions等。
        npm install @gltf-pipeline/functions
        
      • 代码示例 - 模型优化
        • 以下代码片段展示了如何在JavaScript代码中使用gltf - pipeline的函数来优化模型。
        const { optimize } = require('@gltf-pipeline/functions');
        const fs = require('fs');
        const gltfPipeline = require('gltf-pipeline');
        const { GLTF } = gltfPipeline;
        // 读取GLTF模型文件
        const inputGltf = JSON.parse(fs.readFileSync('input_model.gltf'));
        const options = {dracoOptions: {compressionLevel: 7}
        };
        // 对模型进行优化
        optimize(inputGltf, options).then((optimizedGltf) => {// 将优化后的模型保存为新的文件fs.writeFileSync('optimized_model.gltf', JSON.stringify(optimizedGltf));
        });
        
        • 这段代码首先读取一个GLTF模型文件,然后设置优化选项(这里包括Draco压缩的级别),接着使用optimize函数对模型进行优化,最后将优化后的模型保存为一个新的文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/887750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWS账户是否支持区域划分?

在云计算的世界中&#xff0c;亚马逊网络服务&#xff08;AWS&#xff09;凭借其全球化的基础设施和丰富的服务选项受到许多企业和开发者的青睐。一个常见的问题是&#xff1a;AWS账户是否支持区域划分&#xff1f;为了回答这个问题&#xff0c;我们九河云一起深入了解AWS的区域…

鼠标前进后退键改双击,键盘映射(AutoHotkey)

初衷&#xff1a; 1.大部分鼠标为不可自定义按键&#xff0c;可以自定义的又很贵。 鼠标左键是双击是很频类很高的操作&#xff0c;鼠标前进/后退按键个人感觉使用频率很低&#xff0c;因此把鼠标前进/后退改为双击还是很合适的。 2.有些短款的键盘没有Home或End键&#xff0c;…

华为海思2025届校招笔试面试经验分享

目前如果秋招还没有offer的同学&#xff0c;可以赶紧投递下面这些公司&#xff0c;都在补招。争取大家年前就把后端offer拿下。如果大家在准备秋招补录取过程中有任何问题&#xff0c;都可以私信小编&#xff0c;免费提供帮助。如果还有部分准备备战春招的同学&#xff0c;也可…

Springboot项目搭建(7)-Layout界面布局

1.概要 初步搭建了Layout界面的布局&#xff0c;其中包括左侧导航栏及其路由功能&#xff0c;和右侧头、体、脚部分的大致排版。最后在头部分中的昵称与头像替换成动态数据。 2.Layout主页布局 文件地址&#xff1a;src\views\Layout.vue 2.1 script行为模块 从elementUI中…

c语言的qsort函数理解与使用

介绍&#xff1a;qsort 函数是 C 标准库中用于排序的快速排序算法函数。它的用法非常灵活&#xff0c;可以对任意类型的元素进行排序&#xff0c;只要提供了比较函数即可。 qsort 函数原型及参数解释&#xff1a; void qsort ( void* base, //指向要排序的数组的首元素…

#渗透测试#红蓝攻防#HW#漏洞挖掘#漏洞复现01-笑脸漏洞(vsftpd)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

(73)脉冲幅度调制PAM调制解调通信系统的MATLAB仿真

文章目录 前言一、PAM调制的基本原理二、PAM调制的步骤三、PAM调制示例四、PAM调制的应用五、MATLAB仿真1. 仿真代码2. 仿真结果 总结 前言 PAM&#xff08;Pulse Amplitude Modulation&#xff0c;脉冲振幅调制&#xff09;是一种模拟信号到数字信号的转换方式&#xff0c;它…

算法的NPU终端移植:深入探讨与实践指南

目录 ​编辑 引言 算法选择 模型压缩 权重剪枝 量化 知识蒸馏 硬件适配 指令集适配 内存管理 并行计算 性能测试 速度测试 精度测试 功耗测试 案例分析 图像识别算法的NPU移植案例 结论 引言 在人工智能技术的浪潮中&#xff0c;神经网络处理器&#xff08;…

汽车免拆诊断案例 | 2017款捷豹F-PACE车发动机偶尔怠速不稳

故障现象  一辆2017款捷豹F-PACE车&#xff0c;搭载2.0 L GTDi发动机&#xff0c;累计行驶里程约为16万km。车主反映&#xff0c;车辆组合仪表上发动机故障灯点亮&#xff08;图1&#xff09;&#xff0c;且发动机偶尔怠速不稳。 图1 发动机故障灯点亮 故障诊断 接车后试车…

不建模,无代码,如何快速搭建VR虚拟展厅?

不建模、无代码搭建虚拟展厅&#xff0c;可以借助一些专业的虚拟展厅搭建平台或工具来实现。以下是一些具体的步骤和建议&#xff1a; 一、选择平台或工具 首先&#xff0c;需要选择一个适合的平台或工具来搭建虚拟展厅。这些平台通常提供预设的展厅模板、拖拽式编辑工具和丰富…

数星星 (C++ 树状数组)

1265. 数星星 - AcWing题库 分析&#xff1a; 星星是按纵坐标递增给我们的&#xff0c;如果纵坐标相同&#xff0c;就按横坐标来给 所以星星是从低到高&#xff0c;一行一行来给的 题目要求我们去求每个等级的星星各有多少个 星星的等级由它左下角&#xff08;包括左边和下…

AIGC培训讲师人工智能培训讲师叶梓Python深度学习与AIGC培训提纲

【课程时长】 8天&#xff08;6小时/天&#xff09; 【课程简介】 随着AIGC&#xff08;基于AI的内容生成&#xff09;技术的崛起&#xff0c;以ChatGPT为代表的人工智能技术正引领全球科技潮流。为了帮助学员更好地理解和应用这一技术&#xff0c;特推出了本课程。 本课程…

GB28181系列三:SIP消息格式

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、SIP消息Header字段 二、SIP URI(URL) 三、SIP路由机制 1、路由机制介绍 2、严格路由&#xff08;Strict Routing&#xff09;与松散路由&#xff08;Louse Routing&#xff09; 3、总结 四、SIP消…

STM32-C语言基础知识

C语言基础知识 stdint.h简介 给寄存器某个位赋值 给位6赋值为1流程&#xff1a;先清0&#xff0c;再赋值 带参数的宏定义 建议使用do {…}while(0)来构造宏定义 条件编译 条件编译后面必须跟宏语句&#xff0c;如#if _LED_H 指针使用常见的2大问题 1、未初始化 2、越界使…

计算机网络 实验八 应用层相关协议分析

一、实验目的 熟悉CMailServer邮件服务软件和Outlook Express客户端软件的基本配置与使用&#xff1b;分析SMTP及POP3协议报文格式和SMTP及POP3协议的工作过程。 二、实验原理 为了观察到邮件发送的全部过程&#xff0c;需要在本地计算机上配置邮件服务器和客户代理。在这里我…

若依解析(一)登录认证流程

JWTSpringSecurity 6.X 实现登录 JWT token只包含uuid ,token 解析uuid&#xff0c;然后某个常量加UUID 从Redis缓存查询用户信息 流程图如下 感谢若依&#xff0c;感谢开源&#xff0c;能有这么好系统供我学习。 设计数据库&#xff0c;部门表&#xff0c;用户表&#xff0c…

阿里巴巴即将超越OpenAI的o1?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

第29天 MCU入门

目录 MCU介绍 MCU的组成与作用 电子产品项目开发流程 硬件开发流程 常用元器件初步了解 硬件原理图与PCB板 常见电源符号和名称 电阻 电阻的分类 贴片电阻的封装说明&#xff1a; 色环电阻的计算 贴片电阻阻值计算 上拉电阻与下拉电阻 电容 电容的读数 二极管 LED 灯电路 钳位作…

Pump Science平台深度剖析:兴起、优势、影响与未来

在过去的几个月里&#xff0c;人们越来越关注去中心化科学&#xff08;DeSci&#xff09;。DeSci 是一种利用区块链技术进行科学研究的新方法。传统的科学研究经常面临所谓的“死亡之谷”&#xff0c;这指的是基础科学研究与成功开发和造福患者的实施之间的重要时期。DeSci 旨在…

Tülu 3:重新定义开源大模型的后训练范式

一、引言 在大型语言模型&#xff08;LLM&#xff09;的发展历程中&#xff0c;预训练阶段往往受到最多关注&#xff0c;动辄需要数百万美元算力投入和数万亿token的训练数据。然而&#xff0c;一个鲜为人知但同样关键的事实是&#xff1a;预训练完成的模型实际上并不能直接投…