一、Metal 整体定义与行业定位

1.1 基础概念释义

Metal 是苹果公司自主研发,专为苹果全系硬件生态打造的底层高性能 3D 图形渲染与通用计算 API,是 iOS、iPadOS、macOS、tvOS、watchOS 以及 Apple Silicon 自研芯片设备唯一官方标准图形底层接口,彻底替代老旧的 OpenGL ES 与 OpenGL,成为苹果生态所有图形程序、游戏、高清渲染软件、移动端大型应用的核心底层渲染标准。

Metal 并非独立游戏引擎,而是直接对接苹果 GPU 硬件驱动、深度适配 A 系列、M 系列全架构芯片的裸金属级图形接口,具备极低 CPU 开销、极致硬件调度效率、原生多线程并行渲染能力。当下苹果平台主流游戏引擎均全面适配 Metal,Unity 引擎移动端与 Mac 端默认切换 Metal 渲染后端,Unreal Engine 虚幻引擎在苹果设备上同样以 Metal 作为唯一高性能渲染底层,是苹果生态图形开发不可替代的核心技术。

1.2 Metal 诞生与迭代发展背景

在 Metal 问世之前,苹果移动端与桌面端长期依赖 OpenGL 系列图形接口进行图形开发,而 OpenGL 存在隐式状态冗余、驱动层调度臃肿、多核 CPU 利用率低下、移动端功耗控制差、硬件性能释放不彻底等诸多痛点。随着苹果 A 系列移动端芯片、M 系列桌面端自研芯片算力飞速提升,传统高层图形接口已经无法发挥芯片峰值图形算力,大型手游、桌面高清渲染、专业视频剪辑、3D 建模软件出现严重性能瓶颈。

为彻底解决老旧图形接口弊端,充分压榨苹果自研 GPU 全部性能,统一苹果全平台图形开发标准,苹果正式推出 Metal 图形 API。Metal 全程采用显式资源管控架构,剔除驱动层多余自动处理逻辑,将渲染指令录制、硬件队列调度、显存内存管理、渲染同步逻辑全部交由开发者自主控制,从底层架构上大幅降低 CPU 占用、减少渲染延迟、优化设备功耗,同时统一移动端与桌面端图形开发逻辑,实现苹果全平台图形代码高度复用。

历经多次版本迭代,Metal 从初代基础渲染版本,逐步升级至 Metal 2、Metal 3,新增实时光线追踪、硬件网格着色器、异步计算渲染、动态资源管理、桌面端高性能并行渲染等高端功能,全面覆盖轻量化 2D 绘制、常规 3D 场景渲染、影视级物理渲染、大规模 GPU 并行计算、AI 算力加速等全品类开发需求。

1.3 Metal 核心定位与技术特性划分

基础定位

Metal 属于低层级显式高性能图形 API,技术架构设计理念与 Vulkan、Direct3D 12 高度同源,主打极致性能释放、精细化硬件管控、低延迟渲染输出,摒弃传统图形接口繁琐自动封装,以精简高效的底层逻辑适配苹果全系列芯片架构。

适用开发层级

轻量化 2D 界面渲染、休闲小游戏、移动端短视频特效可使用 Metal 快速实现;中大型 3D 手游、Mac 桌面三维软件、专业图形设计工具依托 Metal 实现高清画质与高帧率平衡;3A 级别移动端大作、影视级实时渲染、AI 图形加速、大型仿真模拟项目,依靠 Metal 底层架构实现硬件算力完全拉满。

1.4 Metal 全平台运行支持范围

  1. 移动端设备:全系列 iPhone、iPad 全系机型,最低支持 iOS 13 及以上系统,老旧苹果设备无法向下兼容;
  2. 桌面端设备:搭载 Intel 芯片与 Apple Silicon M 系列全系 MacBook、iMac、Mac Mini、Mac Studio 等所有 macOS 设备,最低适配 macOS 10.15 及以上系统;
  3. 电视端与穿戴端:Apple TV、高端 Apple Watch 智能设备原生适配;
  4. 跨平台限制仅支持苹果自有生态,无 Windows、Android、Linux 原生适配版本,无法跨安卓、桌面微软生态使用,跨平台项目无法采用 Metal 作为统一渲染后端;
  5. 兼容转换方案:非苹果平台想要使用 Metal 逻辑开发,仅可借助第三方转译工具 MoltenVK 实现 Vulkan 转 Metal,无法直接原生调用 Metal 接口。

1.5 Metal 与主流底层图形 API 核心优劣对比

图形接口 开发难度 CPU 占用率 多线程渲染 专属平台 功耗控制 核心适用场景
Metal 极低 原生满分支持 苹果全生态 移动端极致省电 苹果手游、Mac 桌面渲染、自研苹果端引擎
Direct3D12 极高 极低 原生满分支持 Windows/Xbox 桌面功耗中等 Windows 3A 游戏、主机大型项目
Vulkan 极低 原生满分支持 全平台通用 跨平台功耗均衡 安卓高端手游、跨平台自研引擎
D3D11 中等 基础支持 Windows 桌面功耗偏高 Windows 中小型项目、教学开发
OpenGL 中等 偏高 弱支持 全平台通用 功耗优化差 老旧项目维护、简易轻量化渲染

二、Metal 整体架构与全流程核心模块详解

2.1 Metal 顶层基础核心架构

Metal 采用分层式极简架构设计,整体架构层级清晰,从顶层设备上下文到底层渲染指令执行,模块划分明确,全流程无冗余组件,所有核心操作围绕硬件设备、指令队列、渲染资源三大核心体系展开,是目前架构最精简的底层图形 API 之一。

2.2 核心基础顶层模块

2.2.1 设备对象 MTLDevice

MTLDevice 是 Metal 整个渲染程序的顶层核心入口对象,等同于 Vulkan 物理设备 + 逻辑设备、D3D12 设备对象的整合体,程序启动后首先获取全局 MTLDevice 实例,代表当前设备真实 GPU 硬件。核心作用:枚举 GPU 硬件能力、查询芯片图形特性、创建所有渲染资源、分配显存空间、创建指令队列与渲染管线,是所有 Metal 开发操作的基础载体,一台苹果设备默认获取唯一主 GPU 设备对象。

2.2.2 命令队列 MTLCommandQueue

命令队列是 Metal 调度渲染任务的核心调度单元,负责统一接收开发者录制完成的渲染指令、计算指令,有序提交至 GPU 硬件执行,是连接 CPU 指令与 GPU 执行任务的核心桥梁。相较于传统图形接口,Metal 支持创建多个独立命令队列,分别分管图形渲染任务、GPU 通用计算任务、资源数据传输任务,实现不同类型硬件任务分流执行,互不抢占硬件资源,大幅提升并行执行效率。

2.2.3 命令缓冲区 MTLCommandBuffer

命令缓冲区用于批量录制一帧之内所有渲染操作、资源赋值操作、状态切换操作、数据拷贝操作,开发者在 CPU 端提前将所有 GPU 执行指令录制存入命令缓冲区,录制完成后统一提交至命令队列等待 GPU 执行。Metal 命令缓冲区分为即时录制与预录制两种模式,支持多线程并行创建与录制,充分释放苹果设备多核 CPU 性能,彻底解决传统移动端图形接口单线程录制的性能瓶颈。

2.2.4 渲染通道编码器 MTLRenderCommandEncoder

渲染编码器是执行三维画面绘制的核心功能模块,属于命令缓冲区内部细分功能单元,专门用于绑定渲染资源、设置渲染状态、指定视口裁剪范围、绑定顶点数据、调用绘制指令,是完成三角形、模型网格、场景画面绘制的核心执行组件。

2.2.5 窗口显示层 CAMetalLayer

CAMetalLayer 是 Metal 专属窗口渲染输出组件,专门对接 App 应用窗口图层,承担交换链功能,负责创建后台渲染缓冲区、实现前后画面缓冲切换、避免画面撕裂卡顿,将 GPU 渲染完成的最终画面输出至手机屏幕与 Mac 桌面窗口,是所有可视化图形程序必备核心组件。

2.3 Metal 核心渲染资源模块

2.3.1 顶点缓冲区 MTLBuffer

Metal 中所有顶点坐标、颜色数据、纹理坐标、索引数据、全局常量矩阵数据,全部依靠 MTLBuffer 缓冲区进行存储,缓冲区分为系统内存缓冲区与显存缓冲区,开发者可自主指定内存存储位置,灵活控制数据读写效率,完美适配移动端高速数据交互需求。

2.3.2 纹理资源 MTLTexture

MTLTexture 负责承载图片贴图、法线贴图、高光贴图、渲染目标纹理、深度模板纹理等所有图像类资源,支持 2D 纹理、3D 纹理、立方体贴图、数组纹理多种格式,同时自主配置纹理分辨率、像素格式、多级渐远纹理层数,满足从简易贴图到影视级材质纹理的全场景使用需求。

2.3.3 纹理采样器 MTLSamplerState

采样器专门定义纹理采样读取规则,包含纹理过滤模式、边缘寻址模式、各向异性采样等级、LOD 偏移控制等参数,统一管控模型表面纹理显示效果,实现高清材质、模糊特效、像素风格化渲染等不同视觉表现。

2.3.4 渲染目标与深度模板组件

Metal 内置专属颜色渲染目标、深度测试缓冲区、模板缓冲区组件,自主配置缓冲区清除颜色、深度清除数值、测试比对规则,快速实现三维场景遮挡剔除、画面遮罩绘制、镜面反射、轮廓特效等主流渲染功能。

2.4 Metal 着色器系统模块

2.4.1 专属着色器语言 MSL

Metal 摒弃通用 GLSL、HLSL 着色器语言,自研专属Metal Shading Language(MSL),语法基于 C++ 语法精简优化,深度适配苹果 GPU 硬件架构,编译效率更高、硬件指令匹配度更强,执行效率远超传统着色器语言。

2.4.2 主流着色器阶段

完整支持图形渲染全流程可编程着色器阶段:顶点着色器、片元着色器、几何着色器、曲面细分着色器;同时独立支持计算着色器,脱离三维渲染流程单独运行,用于实现图像处理、物理运算、AI 推理、并行数据运算等 GPU 通用计算业务。

2.4.3 着色器编译机制

MSL 着色器支持离线预编译与运行时编译两种模式,开发阶段可提前编译为苹果 GPU 专属二进制指令文件,程序运行时直接加载调用,省去实时编译耗时,大幅提升程序启动速度与运行流畅度。

2.5 Metal 渲染管线核心模块 MTLRenderPipelineState

渲染管线状态对象是 Metal 核心性能优化组件,等同于 D3D12 的 PSO 管线状态对象,开发者提前将顶点输入规则、着色器组合、光栅化规则、混合模式、多重采样抗锯齿等所有固定渲染状态整合编译为统一管线对象。程序运行过程中仅可切换管线对象,无法实时修改管线内部状态,彻底杜绝运行时管线状态重构带来的巨大性能开销,这也是 Metal 高帧率、低延迟渲染的核心关键。

2.6 Metal 同步管控模块

Metal 采用显式同步机制,开发者自主管控 CPU 与 GPU 执行顺序、多队列任务执行先后顺序,核心同步组件分为事件同步、栅栏同步两大类型,精准规避多线程渲染、多队列任务并行执行出现的资源抢占、渲染错乱、数据读写异常等问题,保障高强度并行渲染场景稳定运行。

三、Metal 官方权威网址、免费学习网站、中文学习平台汇总

3.1 苹果官方权威核心开发站点

  1. Apple Metal 官方总文档中心官方主站地址:https://developer.apple.com/metal/站点作用:Metal 全版本功能介绍、技术迭代日志、硬件适配规范、官方开发白皮书、行业应用案例汇总,是学习 Metal 最核心权威的总入口。

  2. 苹果开发者中文 Metal 开发指南地址:https://developer.apple.com/cn/documentation/graphics-and-games/站点作用:简体中文官方开发文档,涵盖基础 API 讲解、渲染流程教学、移动端性能优化、Mac 桌面端适配规范,国内开发者入门首选官方中文资料。

  3. Metal API 完整函数参考手册地址:https://developer.apple.com/documentation/metal站点作用:最全 Metal 所有类、方法、枚举、结构体详细释义,包含参数说明、使用场景、错误排查方案,日常开发查询 API 必备工具站点。

  4. Xcode 官方开发配套文档地址:https://developer.apple.com/xcode/必备开发环境:Metal 所有项目必须依托 Xcode 开发工具编写编译,Xcode 内置 Metal 调试抓帧工具、着色器编译工具、GPU 性能分析工具,是 Metal 开发唯一标准集成环境。

3.2 国内外优质免费自学教程网站

  1. RayWenderlich Metal 零基础入门教程英文原版地址:https://www.raywenderlich.com/books/metal-by-example/v2.0核心优势:全球最热门 Metal 入门实战教程,从基础窗口创建、彩色三角形绘制,逐步深入 3D 模型渲染、光照系统、粒子特效、后期滤镜,案例贴合移动端手游开发,代码注释详尽,新手极易上手。

  2. LearnMetal 系统化实战教学站网址:https://learnmetal.com/核心优势:专注 Metal 全层级技术教学,区分 iOS 移动端与 macOS 桌面端开发方向,涵盖基础渲染、计算着色器、实时光追、多线程渲染等高阶内容,教程逻辑循序渐进。

  3. 知乎中文 Metal 图形开发专栏中文学习地址:https://zhuanlan.zhihu.com/p/377566966核心优势:国内最全纯中文 Metal 底层原理讲解,梳理 OpenGL 转 Metal、Unity 底层 Metal 渲染优化、苹果自研芯片图形适配等实战干货,避开开发高频踩坑点。

  4. Apple Game Dev 苹果游戏开发社区地址:https://developer.apple.com/forums/categories/games.19/核心优势:苹果官方图形游戏开发交流社区,聚集全球 Metal 开发从业者,可查询疑难 BUG 解决方案、性能优化方案、新版本 API 适配问题。

3.3 视频学习优质平台

  1. B 站中文 Metal 入门教学视频,适配国内开发者学习习惯,快速搭建 Xcode Metal 项目环境;
  2. WWDC 苹果全球开发者大会官方视频,历年 WWDC 均有 Metal 新版本功能详解、硬件性能优化公开课,是进阶拔高的核心学习资源。

四、Metal 优质开源源码仓库与实战项目地址

4.1 苹果官方开源示例源码仓库

  1. Apple Metal 官方基础示例合集GitHub 地址:https://github.com/apple/metal-samples仓库内容:苹果官方出品全套标准 Metal 示例代码,包含基础图元绘制、纹理映射、3D 光照、GPU 计算、实时光追、多线程渲染等官方标准实现案例,代码完全遵循苹果开发规范,是临摹学习最佳范本。

  2. Metal 基础渲染框架官方源码GitHub 地址:https://github.com/apple/swift-metal-examples仓库内容:基于 Swift 语言编写的轻量化 Metal 基础渲染框架,精简高效,适合移动端快速搭建简易图形渲染项目。

  3. Metal Performance Shaders 官方算力加速库GitHub 地址:https://github.com/apple/ml-metal-performance-shaders核心作用:苹果官方推出的 Metal 高性能图形加速库,封装图像滤波、矩阵运算、视觉特效、AI 图像处理等通用功能,大幅减少重复底层代码编写,是商业项目高频使用的必备开源库。

4.2 第三方优质开源实战项目源码

  1. 跨平台 Metal 轻量化渲染引擎GitHub 地址:https://github.com/metallic/metallic项目特点:纯 C++ 编写跨苹果全平台 Metal 渲染引擎,整合场景管理、相机系统、材质系统、简易物理模块,适合自研小型苹果端图形引擎学习参考。

  2. iOS 端 Metal 3D 手游开源 DemoGitHub 地址:https://github.com/robert1994/MetalGameDemo项目特点:完整复刻移动端 3D 手游基础架构,包含角色模型渲染、地形绘制、基础光影、粒子特效,贴合手游商业开发逻辑。

  3. Metal 计算着色器 AI 加速实战项目GitHub 地址:https://github.com/axmol/MetalComputeDemo项目特点:依托 Metal 计算着色器实现 GPU 并行图像处理、AI 图像推理加速,适合学习 Metal 通用计算领域开发技术。

  4. Mac 桌面端 Metal 高清渲染项目GitHub 地址:https://github.com/insidegui/MetalMacRender项目特点:针对 macOS 桌面端优化的高清 3D 渲染项目,适配 M 系列自研芯片,讲解桌面端 Metal 性能调优、高分辨率画面渲染核心方案。

五、Metal 标准开发环境搭建流程

5.1 必备开发软件与设备条件

  1. 开发工具:macOS 系统搭载最新版 Xcode 开发工具,仅支持 Mac 电脑搭建 Metal 开发环境,Windows 电脑无法搭建原生 Metal 开发环境;
  2. 设备调试条件:可使用 iPhone、iPad 真机调试移动端 Metal 程序,使用本机 Mac 调试桌面端 Metal 程序;
  3. 调试辅助工具:Xcode 内置 Metal Frame Capture 抓帧调试工具、GPU 性能检测器、着色器实时调试工具,一站式完成 BUG 排查与性能优化;
  4. 编程语言选择:Metal 支持 Swift、Objective-C、C++ 三种主流开发语言,移动端常用 Swift/OC,自研底层引擎优先选用 C++ 开发。

5.2 项目基础创建与配置步骤

  1. 打开 Xcode,新建 iOS/macOS 空白工程,选择图形游戏专属项目模板;
  2. 项目配置中开启 Metal 硬件渲染支持,设置最低适配系统版本;
  3. 引入 Metal 系统原生头文件,配置 MSL 着色器文件编译规则;
  4. 开启 GPU 图形调试模式,开发阶段实时监控显存占用、CPU 调用耗时、渲染帧率;
  5. 配置 CAMetalLayer 窗口图层参数,设定渲染窗口分辨率、刷新率、后台缓冲数量。

六、Metal 完整极简实战示例(Swift 实现绘制彩色三角形)

6.1 MSL 着色器源码编写

顶点着色器 vertex.metal
#include <metal_stdlib>
using namespace metal;

struct VertexIn
{
    float3 position [[attribute(0)]];
    float3 color    [[attribute(1)]];
};

struct VertexOut
{
    float4 position [[position]];
    float3 color;
};

vertex VertexOut vertexShader(VertexIn inVertex)
{
    VertexOut outVertex;
    outVertex.position = float4(inVertex.position,1.0);
    outVertex.color = inVertex.color;
    return outVertex;
}
片元着色器 fragment.metal
#include <metal_stdlib>
using namespace metal;

struct VertexOut
{
    float4 position [[position]];
    float3 color;
};

fragment float4 fragmentShader(VertexOut inVertex)
{
    return float4(inVertex.color,1.0);
}

6.2 完整 Swift 主程序核心渲染代码

import UIKit
import Metal
import MetalKit

class MetalRenderViewController: UIViewController {
    //Metal核心全局对象
    var device: MTLDevice!
    var commandQueue: MTLCommandQueue!
    var renderPipelineState: MTLRenderPipelineState!
    var vertexBuffer: MTLBuffer!
    var metalView: MTKView!
    
    //顶点数据结构体 三色三角形
    struct Vertex {
        var x: Float, y: Float, z: Float
        var r: Float, g: Float, b: Float
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        initMetalBase()
        initVertexData()
        initRenderPipeline()
    }
    
    //初始化基础Metal设备与命令队列
    func initMetalBase() {
        device = MTLCreateSystemDefaultDevice()
        commandQueue = device.makeCommandQueue()
        //创建Metal渲染视图
        metalView = MTKView(frame: self.view.bounds, device: device)
        metalView.delegate = self
        self.view.addSubview(metalView)
    }
    
    //初始化三角形顶点缓冲区数据
    func initVertexData() {
        let vertices: [Vertex] = [
            Vertex(x: 0.0, y: -0.5, z: 0.0, r: 1.0, g: 0.0, b: 0.0),
            Vertex(x: 0.5, y: 0.5, z: 0.0, r: 0.0, g: 1.0, b: 0.0),
            Vertex(x: -0.5, y: 0.5, z: 0.0, r: 0.0, g: 0.0, b: 1.0)
        ]
        let bufferSize = vertices.count * MemoryLayout<Vertex>.stride
        vertexBuffer = device.makeBuffer(bytes: vertices, length: bufferSize, options: .storageModeShared)
    }
    
    //初始化渲染管线状态
    func initRenderPipeline() {
        //加载默认着色器库
        guard let library = device.makeDefaultLibrary() else { return }
        guard let vertexFunc = library.makeFunction(name: "vertexShader") else { return }
        guard let fragmentFunc = library.makeFunction(name: "fragmentShader") else { return }
        
        //创建管线描述符
        let pipelineDesc = MTLRenderPipelineDescriptor()
        pipelineDesc.vertexFunction = vertexFunc
        pipelineDesc.fragmentFunction = fragmentFunc
        pipelineDesc.colorAttachments[0].pixelFormat = metalView.colorPixelFormat
        
        do {
            renderPipelineState = try device.makeRenderPipelineState(descriptor: pipelineDesc)
        } catch {
            print("渲染管线创建失败:\(error)")
        }
    }
}

//Metal视图帧渲染代理
extension MetalRenderViewController: MTKViewDelegate {
    func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) {}
    
    func draw(in view: MTKView) {
        guard let drawable = view.currentDrawable,
              let renderPassDesc = view.currentRenderPassDescriptor else { return }
        //设置画布清空背景色
        renderPassDesc.colorAttachments[0].clearColor = MTLClearColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 1.0)
        renderPassDesc.colorAttachments[0].loadAction = .clear
        
        //创建命令缓冲区
        guard let commandBuffer = commandQueue.makeCommandBuffer() else { return }
        //创建渲染编码器
        guard let renderEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: renderPassDesc) else { return }
        
        //绑定渲染管线与顶点数据
        renderEncoder.setRenderPipelineState(renderPipelineState)
        renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
        //执行绘制指令
        renderEncoder.drawPrimitives(type: .triangle, vertexStart: 0, vertexCount: 3)
        renderEncoder.endEncoding()
        
        //提交渲染并显示画面
        commandBuffer.present(drawable)
        commandBuffer.commit()
    }
}

创建 iOS 工程后将代码写入控制器,配置好 MSL 着色器文件,直接使用 Xcode 编译运行,即可在手机模拟器或真机上显示标准红、绿、蓝三色填充三角形,完整走完 Metal 从环境初始化、资源创建、管线配置到帧绘制的全基础流程。

七、全文总结与 Metal 系统化学习路线规划

本文全方位系统性讲解了 Apple Metal 图形 API 完整技术体系,涵盖 Metal 诞生背景、生态定位、全平台适配范围、核心架构分层逻辑、所有核心功能模块作用,同时整合苹果官方权威学习站点、国内外优质自学渠道、海量开源实战源码项目,搭配可直接编译运行的基础三角形渲染实战案例,满足技术文档整理、系统化入门学习、苹果端图形开发知识梳理等各类使用需求。

在学习进阶路线上,零基础苹果端图形开发者,首先掌握 Swift/OC 基础语法与 iOS 基础开发逻辑,再从 Metal 基础渲染流程入手,熟练掌握设备创建、命令队列调度、顶点数据绘制、基础材质渲染等入门知识;具备基础渲染能力后,进阶学习 Metal 纹理系统、光照渲染、计算着色器、多线程并行渲染等高阶技术;最后深入钻研 M 系列芯片专属优化、实时光线追踪、移动端功耗优化、大型手游渲染架构搭建等商业项目核心技术。

在实际项目技术选型层面,纯苹果生态移动端手游、iPad 高清图形应用、Mac 桌面端三维设计软件、Apple TV 大屏渲染项目,优先选择 Metal 作为唯一底层渲染 API,最大化发挥苹果自研芯片图形算力,兼顾高帧率运行与设备低功耗;跨平台通用游戏、需要同时适配安卓与 Windows 的图形项目,放弃 Metal 选用 Vulkan 作为统一渲染后端,保障多平台兼容性。

作为苹果生态唯一底层高性能图形接口,Metal 未来会持续跟随苹果硬件迭代不断升级,也是所有深耕苹果端游戏开发、桌面图形软件开发从业者必须掌握的核心底层技术,熟练掌握 Metal 开发逻辑,能够精准把控苹果全平台图形项目的性能上限与画质上限。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐