探索三维世界的奥秘:如何在Cesium中实现惊艳的双面渲染效果

news2024/10/28 19:53:20

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:探索三维世界的奥秘:如何在Cesium中实现惊艳的双面渲染效果

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

文章目录

    • 前言
      • 一、基本概念
        • 1. 什么是双面渲染?
        • 2. 双面渲染的应用场景
        • 3. 渲染原理
        • 4. 性能考虑
      • 二、实现思路
        • 1. 创建几何体
        • 2. 编写自定义着色器
        • 3. 设置材质
        • 4. 创建 Primitive
        • 5. 添加到场景中
        • 6. 性能优化
      • 三、着色器代码示例
        • 1. 顶点着色器
        • 2. 片段着色器
        • 3. 着色器的工作流程
        • 4. 性能考虑
      • 四、在 Cesium 中应用着色器
        • 1. 准备工作
        • 2. 创建几何体
        • 3. 编写着色器代码
        • 4. 创建自定义材质
        • 5. 创建 Primitive
        • 6. 添加到场景中
        • 7. 性能优化
        • 8. 完整示例代码
    • 结论
    • 投票

在这里插入图片描述

前言

  在现代三维可视化技术中,如何真实而生动地呈现复杂的地理和建筑结构是一个重要的研究方向。随着虚拟现实和增强现实的快速发展,用户对三维场景的沉浸感和交互性提出了更高的要求。在这一背景下,双面渲染技术逐渐成为了一个不可或缺的工具,尤其是在处理巷道、隧道等内部结构时。

  Cesium 作为一个强大的开源三维地球引擎,提供了丰富的功能和灵活的扩展性,使得开发者能够轻松实现各种复杂的可视化效果。然而,默认的渲染方式往往无法满足特定场景的需求,特别是在需要区分内外表面的情况下。如何在 Cesium 中实现双面渲染,成为了许多开发者关注的焦点。

  本博文将深入探讨如何在 Cesium 中实现双面渲染的技术细节。我们将从基本概念入手,逐步引导你理解双面渲染的实现思路,并提供详细的着色器代码示例。无论你是刚接触 Cesium 的新手,还是希望提升渲染效果的资深开发者,这篇博文都将为你提供实用的指导和灵感。

  通过掌握双面渲染技术,你将能够为你的三维场景增添更多的细节和真实感,使得用户在探索虚拟世界时,能够获得更加丰富的视觉体验。让我们一起揭开双面渲染的神秘面纱,探索三维世界的无限可能!

一、基本概念

  在三维计算机图形学中,渲染是将三维模型转换为二维图像的过程。渲染的质量和效果直接影响用户的视觉体验。在许多应用场景中,尤其是在建筑可视化、地理信息系统(GIS)和虚拟现实(VR)中,双面渲染技术显得尤为重要。

1. 什么是双面渲染?

  双面渲染(Double-Sided Rendering)是指在渲染过程中同时显示物体的内表面和外表面。传统的渲染方法通常只渲染物体的外表面,这在许多情况下是足够的。然而,在处理某些特定的几何体时,如巷道、隧道、船舶内部等,内外表面的可视化同样重要。

2. 双面渲染的应用场景
  • 建筑可视化:在展示建筑物内部结构时,双面渲染可以帮助用户更好地理解空间布局。
  • 地理信息系统:在展示地下结构(如隧道、管道)时,双面渲染可以提供更全面的信息。
  • 虚拟现实:在沉浸式体验中,用户可能需要查看物体的内部细节,双面渲染可以增强这种体验。
  • 游戏开发:在某些游戏场景中,角色或物体的内部细节可能需要被展示,双面渲染可以实现这一点。
3. 渲染原理

  双面渲染的实现通常依赖于着色器(Shader)的编写。着色器是运行在图形处理单元(GPU)上的小程序,负责计算每个像素的颜色和光照效果。在双面渲染中,我们需要根据法线方向来判断当前渲染的面是内表面还是外表面,从而应用不同的材质或颜色。

  • 法线(Normal):法线是与表面垂直的向量,决定了光照的计算和表面的可见性。在双面渲染中,法线的方向将帮助我们区分内外表面。
  • 光照模型:双面渲染通常需要使用不同的光照模型来处理内外表面的光照效果,以确保渲染结果的真实感。
4. 性能考虑

  虽然双面渲染可以提供更丰富的视觉效果,但它也会增加渲染的计算负担。每个物体都需要进行额外的渲染计算,这可能会影响性能。因此,在实现双面渲染时,开发者需要权衡效果与性能之间的关系,确保在不同设备上都能流畅运行。

二、实现思路

  在 Cesium 中实现双面渲染的过程涉及多个步骤,从几何体的创建到着色器的编写,再到最终的渲染效果。以下是实现双面渲染的详细思路:

1. 创建几何体

  首先,我们需要定义一个几何体,表示需要进行双面渲染的对象。Cesium 提供了多种几何体类型,例如圆柱体、平面、球体等。对于巷道或隧道的可视化,通常使用圆柱体或自定义几何体。

  • 几何体定义:使用 Cesium.CylinderGeometry 或其他几何体构造函数来创建所需的几何体。例如,创建一个圆柱体可以使用以下代码:
const geometry = new Cesium.CylinderGeometry({
    length: 100.0,
    topRadius: 10.0,
    bottomRadius: 10.0,
});
2. 编写自定义着色器

  双面渲染的关键在于着色器的编写。我们需要创建顶点着色器和片段着色器,以便根据法线方向渲染不同的表面。

  • 顶点着色器:负责将顶点位置和法线传递给片段着色器。我们需要确保法线的方向正确,以便在片段着色器中进行光照计算。
// Vertex Shader
attribute vec3 position;
attribute vec3 normal;
varying vec3 v_normal;

void main() {
    v_normal = normal; // 将法线传递给片段着色器
    gl_Position = czm_modelViewProjection * vec4(position, 1.0);
}
  • 片段着色器:根据法线的方向决定渲染的颜色。我们可以使用条件语句来判断法线的方向,从而选择不同的颜色或材质。
// Fragment Shader
varying vec3 v_normal;

void main() {
    vec3 lightDirection = normalize(vec3(0.0, 0.0, 1.0));
    float diff = max(dot(v_normal, lightDirection), 0.0);

    vec3 color;
    if (v_normal.z > 0.0) {
        color = vec3(1.0, 0.0, 0.0); // 外表面为红色
    } else {
        color = vec3(0.0, 0.0, 1.0); // 内表面为蓝色
    }

    gl_FragColor = vec4(color * diff, 1.0);
}
3. 设置材质

  在 Cesium 中,材质是通过 Cesium.Material 来定义的。我们可以创建一个自定义材质,将之前编写的着色器应用于几何体。

const customShader = {
    fragmentShader: fragmentShaderCode,
    vertexShader: vertexShaderCode,
};

const material = Cesium.Material.fromType('CustomShader', {
    shader: customShader,
});
4. 创建 Primitive

  接下来,我们需要将几何体和材质结合起来,创建一个 Cesium.Primitive 对象。这个对象将负责在场景中渲染我们的双面几何体。

const primitive = new Cesium.Primitive({
    geometryInstances: new Cesium.GeometryInstance({
        geometry: geometry,
        modelMatrix: Cesium.Matrix4.fromTranslation(new Cesium.Cartesian3(0, 0, 0)),
    }),
    appearance: new Cesium.EllipsoidSurfaceAppearance({
        material: material,
    }),
    asynchronous: false,
});
5. 添加到场景中

  最后,将创建的 Primitive 对象添加到 Cesium 的场景中,以便进行渲染。

viewer.scene.primitives.add(primitive);
6. 性能优化

  在实现双面渲染时,性能是一个重要的考虑因素。以下是一些优化建议:

  • 减少渲染调用:尽量合并多个几何体为一个 Primitive,减少渲染调用的次数。
  • LOD(细节层次):根据视距动态调整渲染的细节层次,远处的物体可以使用低细节模型。
  • 剔除不必要的渲染:在场景中,如果某些物体不在视野范围内,可以选择不渲染它们。

通过以上步骤,我们可以在 Cesium 中实现双面渲染的效果。这个过程不仅涉及几何体的创建和着色器的编写,还需要考虑性能优化。掌握这些实现思路后,你将能够在项目中灵活应用双面渲染技术,为用户提供更丰富的三维可视化体验。

三、着色器代码示例

  在实现双面渲染的过程中,着色器是关键的组成部分。它们负责计算每个像素的颜色、光照和其他视觉效果。以下将详细阐述顶点着色器和片段着色器的代码示例,以及它们的工作原理。

1. 顶点着色器

  顶点着色器的主要任务是处理每个顶点的属性,包括位置和法线,并将这些信息传递给片段着色器。以下是一个简单的顶点着色器示例:

// Vertex Shader
attribute vec3 position; // 顶点位置
attribute vec3 normal;   // 顶点法线
varying vec3 v_normal;   // 用于传递到片段着色器的法线

void main() {
    v_normal = normalize(normal); // 归一化法线
    gl_Position = czm_modelViewProjection * vec4(position, 1.0); // 计算裁剪空间坐标
}

代码解析

  • attribute vec3 position;:定义顶点的位置属性。
  • attribute vec3 normal;:定义顶点的法线属性。
  • varying vec3 v_normal;:用于将法线传递到片段着色器。
  • v_normal = normalize(normal);:对法线进行归一化,以确保其长度为1,便于后续的光照计算。
  • gl_Position = czm_modelViewProjection * vec4(position, 1.0);:将顶点位置转换为裁剪空间坐标,czm_modelViewProjection 是 Cesium 提供的模型视图投影矩阵。
2. 片段着色器

  片段着色器负责计算每个片段(像素)的最终颜色。它使用从顶点着色器传递来的法线信息来决定光照和颜色。以下是片段着色器的示例代码:

// Fragment Shader
varying vec3 v_normal; // 从顶点着色器传递来的法线

void main() {
    vec3 lightDirection = normalize(vec3(0.0, 0.0, 1.0)); // 定义光源方向
    float diff = max(dot(v_normal, lightDirection), 0.0); // 计算漫反射分量

    vec3 color;
    if (v_normal.z > 0.0) {
        color = vec3(1.0, 0.0, 0.0); // 外表面为红色
    } else {
        color = vec3(0.0, 0.0, 1.0); // 内表面为蓝色
    }

    gl_FragColor = vec4(color * diff, 1.0); // 计算最终颜色
}

代码解析

  • varying vec3 v_normal;:接收从顶点着色器传递来的法线。
  • vec3 lightDirection = normalize(vec3(0.0, 0.0, 1.0));:定义光源的方向,这里假设光源来自于 z 轴正方向。
  • float diff = max(dot(v_normal, lightDirection), 0.0);:计算法线与光源方向的点积,得到漫反射分量。使用 max 函数确保结果不为负值。
  • if (v_normal.z > 0.0):根据法线的 z 分量判断当前渲染的是内表面还是外表面。
    • 如果法线的 z 分量大于0,表示渲染的是外表面,设置颜色为红色。
    • 否则,渲染的是内表面,设置颜色为蓝色。
  • gl_FragColor = vec4(color * diff, 1.0);:计算最终颜色,乘以漫反射分量以实现光照效果,并设置 alpha 值为 1.0(完全不透明)。
3. 着色器的工作流程
  • 顶点处理:在渲染过程中,顶点着色器会被调用一次,对于每个顶点,计算其位置和法线,并将法线传递给片段着色器。
  • 片段处理:片段着色器会被调用多次,对于每个片段(像素),根据传递来的法线和光源方向计算最终颜色,并输出到屏幕上。
4. 性能考虑

  在编写着色器时,性能是一个重要的考虑因素。以下是一些优化建议:

  • 减少条件判断:尽量减少在片段着色器中的条件判断,因为这会影响性能。可以考虑使用纹理或其他方法来实现不同的效果。
  • 使用简单的光照模型:在不需要复杂光照效果的情况下,使用简单的光照模型可以提高性能。
  • 合并渲染调用:如果可能,将多个几何体合并为一个 Primitive,以减少渲染调用的次数。

通过上述着色器代码示例,我们可以看到如何在 Cesium 中实现双面渲染的基本原理。顶点着色器和片段着色器的配合使得我们能够根据法线方向渲染不同的颜色,从而实现内外表面的区分。掌握这些着色器的编写技巧,将为你在三维可视化项目中提供强大的支持。

四、在 Cesium 中应用着色器

  在 Cesium 中应用自定义着色器是实现双面渲染的关键步骤。通过将我们编写的顶点着色器和片段着色器与几何体结合,我们可以实现丰富的视觉效果。以下是详细的步骤和代码示例,帮助你在 Cesium 中成功应用自定义着色器。

1. 准备工作

  在开始之前,确保你已经设置好 Cesium 环境,并且能够创建基本的三维场景。你可以使用 Cesium 的默认视图或自定义视图来展示你的几何体。

2. 创建几何体

  首先,我们需要创建一个几何体,通常是一个圆柱体或其他适合双面渲染的形状。以下是创建圆柱体的代码示例:

const geometry = new Cesium.CylinderGeometry({
    length: 100.0,
    topRadius: 10.0,
    bottomRadius: 10.0,
});
3. 编写着色器代码

  接下来,我们需要编写顶点着色器和片段着色器的代码。可以将这些代码存储在 JavaScript 变量中,以便后续使用。

const vertexShaderCode = `
    attribute vec3 position;
    attribute vec3 normal;
    varying vec3 v_normal;

    void main() {
        v_normal = normalize(normal);
        gl_Position = czm_modelViewProjection * vec4(position, 1.0);
    }
`;

const fragmentShaderCode = `
    varying vec3 v_normal;

    void main() {
        vec3 lightDirection = normalize(vec3(0.0, 0.0, 1.0));
        float diff = max(dot(v_normal, lightDirection), 0.0);

        vec3 color;
        if (v_normal.z > 0.0) {
            color = vec3(1.0, 0.0, 0.0); // 外表面为红色
        } else {
            color = vec3(0.0, 0.0, 1.0); // 内表面为蓝色
        }

        gl_FragColor = vec4(color * diff, 1.0);
    }
`;
4. 创建自定义材质

  在 Cesium 中,我们需要将着色器代码封装成一个自定义材质。使用 Cesium.Material.fromType 方法来创建材质,并将着色器代码传递给它。

const customShader = {
    fragmentShader: fragmentShaderCode,
    vertexShader: vertexShaderCode,
};

const material = Cesium.Material.fromType('CustomShader', {
    shader: customShader,
});
5. 创建 Primitive

  接下来,我们需要将几何体和材质结合起来,创建一个 Cesium.Primitive 对象。这个对象将负责在场景中渲染我们的双面几何体。

const primitive = new Cesium.Primitive({
    geometryInstances: new Cesium.GeometryInstance({
        geometry: geometry,
        modelMatrix: Cesium.Matrix4.fromTranslation(new Cesium.Cartesian3(0, 0, 0)),
    }),
    appearance: new Cesium.EllipsoidSurfaceAppearance({
        material: material,
    }),
    asynchronous: false,
});
6. 添加到场景中

  最后,将创建的 Primitive 对象添加到 Cesium 的场景中,以便进行渲染。

viewer.scene.primitives.add(primitive);
7. 性能优化

在实现双面渲染时,性能是一个重要的考虑因素。以下是一些优化建议:

  • 减少渲染调用:尽量合并多个几何体为一个 Primitive,减少渲染调用的次数。
  • LOD(细节层次):根据视距动态调整渲染的细节层次,远处的物体可以使用低细节模型。
  • 剔除不必要的渲染:在场景中,如果某些物体不在视野范围内,可以选择不渲染它们。
8. 完整示例代码

以下是一个完整的示例代码,将上述步骤整合在一起:

const viewer = new Cesium.Viewer('cesiumContainer');

const geometry = new Cesium.CylinderGeometry({
    length: 100.0,
    topRadius: 10.0,
    bottomRadius: 10.0,
});

const vertexShaderCode = `
    attribute vec3 position;
    attribute vec3 normal;
    varying vec3 v_normal;

    void main() {
        v_normal = normalize(normal);
        gl_Position = czm_modelViewProjection * vec4(position, 1.0);
    }
`;

const fragmentShaderCode = `
    varying vec3 v_normal;

    void main() {
        vec3 lightDirection = normalize(vec3(0.0, 0.0, 1.0));
        float diff = max(dot(v_normal, lightDirection), 0.0);

        vec3 color;
        if (v_normal.z > 0.0) {
            color = vec3(1.0, 0.0, 0.0); // 外表面为红色
        } else {
            color = vec3(0.0, 0.0, 1.0); // 内表面为蓝色
        }

        gl_FragColor = vec4(color * diff, 1.0);
    }
`;

const customShader = {
    fragmentShader: fragmentShaderCode,
    vertexShader: vertexShaderCode,
};

const material = Cesium.Material.fromType('CustomShader', {
    shader: customShader,
});

const primitive = new Cesium.Primitive({
    geometryInstances: new Cesium.GeometryInstance({
        geometry: geometry,
        modelMatrix: Cesium.Matrix4.fromTranslation(new Cesium.Cartesian3(0, 0, 0)),
    }),
    appearance: new Cesium.EllipsoidSurfaceAppearance({
        material: material,
    }),
    asynchronous: false,
});

viewer.scene.primitives.add(primitive);

通过以上步骤,我们成功地在 Cesium 中应用了自定义着色器,实现了双面渲染的效果。掌握这些技术将使你能够在三维可视化项目中创造出更丰富的视觉体验。

结论

  在三维可视化领域,双面渲染技术为我们提供了更为丰富和真实的场景表现,尤其是在处理复杂的地理和建筑结构时。通过在 Cesium 中实现双面渲染,我们不仅能够清晰地展示巷道、隧道等内部结构,还能为用户创造更具沉浸感的体验。

  在本文中,我们详细探讨了双面渲染的基本概念和实现思路,提供了自定义着色器的代码示例,并展示了如何在 Cesium 中应用这些着色器。通过这些步骤,我们可以灵活地控制内外表面的渲染效果,从而满足不同场景的需求。

  值得注意的是,双面渲染不仅仅是技术上的实现,更是对用户体验的深刻理解。随着虚拟现实和增强现实技术的不断发展,用户对三维场景的期望也在不断提高。掌握双面渲染技术,将使开发者能够在这一竞争激烈的领域中脱颖而出,创造出更具吸引力和互动性的应用。

  未来,随着 Cesium 和其他三维可视化工具的不断进步,我们可以期待更多创新的渲染技术和效果的出现。希望本文能够激发你的灵感,帮助你在项目中实现更高水平的可视化效果。无论是学术研究、工程设计,还是游戏开发,双面渲染都将为你的工作增添新的维度。

  让我们继续探索三维世界的奥秘,推动可视化技术的边界,创造出更加引人入胜的虚拟体验!

投票

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

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

相关文章

掌握未来技术:KVM虚拟化安装全攻略,开启高效云端之旅

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 目录 前言&#…

RabbitMQ的Overview Totals是空

一、问题描述 RabbitMQ 版本:4.0.2,Erlang 版本:26.2.5.4。 RabbitMQ 页面管理(rabbitmq_management)的 Overview > Totals 是空: 二、原因分析 RabbitMQ 的配置: management_agent.disable_metrics_collector…

从0到1学习node.js(express模块)

文章目录 Express框架1、初体验express2、什么是路由3、路由的使用3、获取请求参数4、电商项目商品详情场景配置路由占位符规则5、小练习,根据id参数返回对应歌手信息6、express和原生http模块设置响应体的一些方法7、其他响应设置8、express中间件8.1、什么是中间件…

轻松部署自己的AI聊天助手LocalGPT并实现无公网IP远程交互

文章目录 前言环境准备1. localGPT部署2. 启动和使用3. 安装cpolar 内网穿透4. 创建公网地址5. 公网地址访问6. 固定公网地址 前言 本文主要介绍如何本地部署LocalGPT并实现远程访问,由于localGPT只能通过本地局域网IP地址端口号的形式访问,实现远程访问…

雷池社区版中升级雷池遇到问题

关于升级后兼容问题 版本差距过大会可能会发生升级后数据不兼容导致服务器无法起来 跨多个版本(超过1个大版本号)升级做好数据备份,遇到升级失败可尝试重新安装解决 升级提示目录不对 在错误的目录下执行(比如 safeline 的子目…

【WRF数据准备】基于GEE下载静态地理数据-叶面积指数LAI及绿色植被率Fpar

【WRF数据准备】基于GEE下载静态地理数据 准备:WRF所需静态地理数据(Static geographical data)数据范围说明基于GEE下载叶面积指数及绿色植被率GEE数据集介绍数据下载:LAI(叶面积指数)和Fpar(绿色植被率)数据处理:基于Python处理为单波段LAI数据参考GEE的介绍可参见另…

分布式理论基础

文章目录 1、理论基础2、CAP定理1_一致性2_可用性3_分区容错性4_总结 3、BASE理论1_Basically Available(基本可用)2_Soft State(软状态)3_Eventually Consistent(最终一致性)4_总结 1、理论基础 在计算机…

技术周总结 10.21~10.27周日

文章目录 一、10.24 周四 程序员节2.1)问题01: Memory Analysis Tool的使用方法 二、10.27 周日2.1) J2EE架构J2EE 的核心组件与技术J2EE 的多层架构J2EE 的优缺点J2EE 的应用场景 2.2)web应用开发中的 "web服务器" 和 …

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型,实现 API 形式进行聊天对话

AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型,实现 API 形式进行聊天对话 目录 AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型,实现 API 形式进行聊天对话 一、简单介绍 二、创建一个聊…

ReactNative TurboModule(3)

ReactNative TurboModule 简述 ReactNative新架构的两个核心支柱是TurboModule和Fabric渲染器,前者的功能是提供一个Native的模块,比如蓝牙之类的,后者则是提供一个自定义Native UI组件的能力,ReactNative本身虽然提供了非常多的…

Python 中 {} 是 set 还是 dict

先说结论: {} 是 dict 字典。 一、描述 在 Python 中,我们可以用如下,表示一个集合 set my_set {1, 2, 3, 4, 5, 6} 也可以用如下,表示一个字典 dict my_dict {1:10, 2:20, 3:30, 4:40} 不管是集合还是字典,都…

【Ubuntu20.04 Visual Studio Code安装】【VSCODE】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、打开VSCOE官网二、下载VSODE的Ubuntu版本三、安装VSCODE软件包四、导入工作空间(添加工作空间目录)五、安装插件:1.安装简体中文包2.安装ros插件…

NSSCTF刷题篇web部分

源码泄露 [FSCTF 2023]寻找蛛丝马迹 这个源码泄露,可以记录一下,涉及的知识点比较多 打开环境 查看源码, 第一段flag 乱码,恢复一下 乱码恢复网站:乱码恢复 (mytju.com) 剩下的就只说方法 http://node4.anna.nss…

python实现放烟花效果庆祝元旦

马上就要2025年元旦啦,提前祝大家新年快乐 完整代码下载地址:https://download.csdn.net/download/ture_mydream/89926458

uaGate SI——实现OT与IT的安全连接

对于许多制造商来说,诸如工业物联网(IIoT)、信息物理系统(CPS)和大数据等概念已经开始与其智能工厂的愿景紧密相连。智能工厂是将信息技术(IT)的数字世界与运营技术(OT)的…

H5的Canvas绘图——使用fabricjs绘制一个可多选的随机9宫格

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,最近一直被测试…

node升级package.json中的版本

由于项目使用时间过老,升级对应包版本,可以使用新功能 1.使用npm-check-updates这个工具,先全局安装 npm install -g npm-check-updates2.检查package.json中dependencies的最新版本 ncu3.更新dependencies到新版本 ncu -u也是一样的 npx…

微知SOP-定位Linux crash问题的几个常用方面和常用命令?

文章目录 1 背景2 问题描述和SOP2.1 进入目录2.2 安装crasn和vmlinux2.3 使用crash命令进入debug目录2.4 收集主要信息2.5 收集task关键信息2.6 查看堆栈信息2.7 使用反汇编查看crash所在行2.8 根据寄存器获取一些关键数据2.9 根据堆栈获取信息2.10 加载内核模块2.11 收集其他t…

宿舍管理新篇章:基于Spring Boot的系统开发

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

零基础学linux文件管理

目录 引言 基础知识 回顾C语言 fopen fclose 更改进程路径:chdir fwrite可以用来写入 sizeof字符串 C语言默认打开三个输入输出流 过渡到系统 系统调用:open “位字段”或“位掩码” open的使用 关闭文件:close 写入&#xff1…