服务端3月2日 00:12
WebGL 中的光照模型有哪些?如何实现 Phong 光照模型?## WebGL 光照模型有哪些?
WebGL 中常用的光照模型分为两类:**局部光照模型**和**全局光照模型**。面试中重点考察的是局部光照模型,核心有三种:
| 光照模型 | 特点 | 典型用途 |
|---------|------|---------|
| Lambert(漫反射) | 仅计算漫反射,无高光 | 粗糙表面如墙壁、布料 |
| Phong | 环境光 + 漫反射 + 镜面反射 | 通用物体渲染 |
| Blinn-Phong | Phong 改进版,用半角向量替代反射向量 | 实际项目首选 |
此外还有基于物理的 PBR(Physically Based R...服务端3月2日 00:20
WebGL 中的后期处理(Post-processing)是如何实现的?## 为什么面试会问后期处理
后期处理是 WebGL 从「能渲染」到「能做出好效果」的关键一步。面试官问这个问题,本质上是想确认你是否理解渲染管线的完整流程,以及是否具备在帧缓冲区和着色器层面解决实际问题的能力。
## 后期处理的核心原理
后期处理的核心思路只有三步:
1. 把场景渲染到纹理(离屏渲染),而不是直接渲染到屏幕
2. 用着色器对这张纹理做图像处理
3. 把处理后的结果画到屏幕上
整个流程可以理解为:
```
场景渲染 → 颜色纹理(FBO) → 后期处理着色器链 → 屏幕
↓
深度/法线纹理(可选)
```
这...服务端3月1日 23:29
WebGL 中的矩阵变换有哪些?MVP 矩阵是什么?## WebGL 中的矩阵变换
3D 渲染的本质是将顶点从模型局部坐标一步步变换到屏幕像素坐标,而矩阵就是描述这些变换的数学工具。WebGL 中所有坐标变换都通过 4×4 齐次矩阵完成,理解这些矩阵的含义和组合方式是掌握 3D 图形编程的基础。
## 三种基本变换矩阵
### 平移矩阵
平移将物体沿 X、Y、Z 轴移动指定距离,是最直观的变换:
```
| 1 0 0 tx |
| 0 1 0 ty |
| 0 0 1 tz |
| 0 0 0 1 |
```
由于 3×3 矩阵无法表示平移(线性变换不包含偏移),所以必须引入齐次坐标——用 4D 向...服务端2月28日 21:40
什么是 Spring Boot 的自动配置原理?## Spring Boot 的自动配置原理是什么?
Spring Boot 的自动配置,简单说就是:根据你引入的依赖和已有的配置,自动帮你把该配的 Bean 都配好。你不用手写一堆 XML,也不用挨个注册 Bean,Spring Boot 帮你搞定。
这个能力背后靠的是三个核心机制:**SPI 发现配置类 → 条件注解过滤 → 属性绑定定制**。下面逐一拆解。
## 入口:@SpringBootApplication 做了什么?
启动类上的 `@SpringBootApplication` 是个复合注解,拆开来看:
```java
@SpringBootConfigurati...服务端2月28日 21:52
Spring Boot 中如何实现缓存?## 核心回答
Spring Boot 通过 **Spring Cache Abstraction** 提供统一的缓存抽象,开发者只需添加 `@EnableCaching` 注解和对应缓存实现依赖,即可用 `@Cacheable`、`@CachePut`、`@CacheEvict` 等注解实现声明式缓存。常用实现方案有三种:
- **ConcurrentMapCache**:基于 `ConcurrentHashMap`,零依赖,适合单机开发测试
- **Caffeine**:高性能本地缓存,支持过期策略和容量限制,适合单机生产环境
- **Redis**:分布式缓存,支持持久化和集群...服务端3月1日 23:22
Solidity 中如何实现一个去中心化交易所(DEX)的核心功能?去中心化交易所(DEX)是 DeFi 的基础设施,其核心依赖自动做市商(AMM)机制完成无订单簿交易。实现 DEX 的关键在于理解恒定乘积公式 x * y = k 如何驱动价格发现、流动性池如何管理代币储备、LP Token 如何表示份额,以及闪电贷如何在同一笔交易中完成借款与还款。以下从面试高频考点出发,逐层拆解 DEX 的合约实现。
## 恒定乘积公式与价格计算
AMM 的定价基础是恒定乘积公式:池中两种代币的储备量乘积始终为常数 k。当用户用 token0 换 token1 时,token0 储备增加、token1 储备减少,乘积不变,价格因此自动调整。实际交易还需扣除手续费(...服务端3月1日 22:42
Solidity 中 ERC20 和 ERC721 代币标准的核心实现原理是什么?ERC20 实现同质化代币,核心是 balanceOf/transfer/approve/transferFrom 四个函数加上双映射存储(_balances 和 _allowances);ERC721 实现非同质化代币,核心是 ownerOf(tokenId) 加上 tokenId→owner 的单映射,配合 tokenApprovals 和 operatorApprovals 两层授权机制。两者的根本区别在于:ERC20 按金额操作,ERC721 按 tokenId 操作。
## ERC20:同质化代币的存储与流转
ERC20 的状态只有三个:`mapping(address =...服务端3月1日 18:48
cURL 中 -d 和 --data 有什么区别?## -d 和 --data 是什么关系?
`-d` 和 `--data` 是同一个参数的短格式和长格式,功能完全等价,没有任何行为差异。
```bash
# 下面两条命令完全等价
curl -d "name=value" https://api.example.com
curl --data "name=value" https://api.example.com
```
cURL 的大多数参数都有这种短/长格式对应关系,比如 `-X` 和 `--request`、`-H` 和 `--header`。选择哪种写法纯属个人偏好:命令行简短操作用 `-d`,脚本中为了可读性用 `--...服务端3月1日 23:00
Solidity 中如何实现合约升级模式?有哪些常见的升级方案?核心思路:利用 delegatecall 将存储与逻辑分离,通过代理合约转发调用、逻辑合约可替换来实现升级。主流方案有三种——透明代理、UUPS、钻石模式,加上信标代理共四种。
### 直接回答:四种升级方案对比
| 方案 | 升级逻辑位置 | Gas 开销 | 复杂度 | 适用场景 |
|------|------------|---------|--------|---------|
| 透明代理 | 代理合约 | 高 | 中 | 通用场景,OpenZeppelin 默认推荐 |
| UUPS | 逻辑合约 | 低 | 低 | 追求 Gas 效率的简单升级 |
| 信标代理 | ...服务端3月1日 22:28
Solidity 中事件(Event)的作用是什么?如何优化 Gas 成本?事件(Event)是 Solidity 合约与外部世界通信的核心机制——它将数据写入交易收据的日志区域,而非合约 storage,因此 Gas 成本远低于链上存储。理解事件的工作原理和优化手段,是写好智能合约的基本功。
## 事件的底层原理:EVM LOG 操作码
Solidity 中的 `event` 在 EVM 层面对应 LOG0 ~ LOG4 五条指令。LOG 后的数字表示 topics 的数量:
- **LOG0**:没有 topic,只有 data,用于匿名事件
- **LOG1**:1 个 topic(事件签名哈希)+ data
- **LOG2**:2 个 topic...