GLFW跨平台图形库深度解析:入门指南与核心概念

GLFW跨平台图形库深度解析:入门指南与核心概念

【免费下载链接】glfw A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input 【免费下载链接】glfw 项目地址: https://gitcode.com/GitHub_Trending/gl/glfw

本文深入解析GLFW跨平台图形库的设计理念、架构实现和核心功能。GLFW是一个专为OpenGL、OpenGL ES和Vulkan应用程序开发设计的开源多媒体库,提供简单统一的API处理窗口创建、上下文管理和输入处理等底层系统交互任务。文章将从项目概述与设计理念入手,详细分析其多平台支持架构,深入探讨窗口管理、上下文管理和输入处理三大核心模块,并提供全面的编译与集成环境配置指南。

GLFW项目概述与设计理念

GLFW(Graphics Library Framework)是一个开源的、跨平台的多媒体库,专门为OpenGL、OpenGL ES和Vulkan应用程序开发而设计。作为一个轻量级但功能强大的库,GLFW致力于为开发者提供简单、统一的API来处理窗口创建、上下文管理、输入处理等底层系统交互任务。

核心设计哲学

GLFW的设计遵循几个核心原则,这些原则贯穿于整个库的架构和实现中:

1. 平台无关性设计 GLFW采用抽象层架构,将平台特定的实现细节隐藏在统一的API之后。这种设计允许开发者在不同操作系统上使用相同的代码逻辑,而无需关心底层平台的差异。

mermaid

2. 最小化依赖原则 GLFW在设计上尽可能减少外部依赖,仅需要目标操作系统的原生窗口系统和图形API头文件。这种极简主义设计使得GLFW易于集成到各种项目中,不会引入复杂的依赖链。

依赖类型必需依赖可选依赖
编译时依赖CMake 3.16+Doxygen(文档生成)
运行时依赖操作系统原生库各种扩展库(示例程序)
图形API依赖无强制要求OpenGL/OpenGL ES/Vulkan

3. 线程安全与状态管理 GLFW采用明确的状态管理策略,大多数函数只能在库初始化后调用,并且对线程安全性有清晰的规定。这种设计避免了隐式的全局状态问题,使程序行为更加可预测。

// 正确的GLFW使用模式
if (!glfwInit()) {
    // 处理初始化失败
    return -1;
}

// 创建窗口和上下文
GLFWwindow* window = glfwCreateWindow(800, 600, "My Window", NULL, NULL);

// 主循环
while (!glfwWindowShouldClose(window)) {
    glfwPollEvents();
    // 渲染代码
}

// 清理资源
glfwTerminate();

架构设计特色

模块化平台支持 GLFW支持编译时多平台集成,单个库二进制文件可以同时支持多个窗口系统。这种设计通过初始化提示机制实现运行时平台选择:

mermaid

可扩展的分配器系统 GLFW提供了自定义内存分配器的支持,允许开发者注入自己的内存管理策略:

// 自定义内存分配器示例
GLFWallocator customAllocator = {
    .allocate = my_malloc,
    .reallocate = my_realloc, 
    .deallocate = my_free,
    .user = NULL
};

glfwInitAllocator(&customAllocator);

设计目标与约束

GLFW的设计始终围绕以下几个核心目标:

  1. 简单性优先:API设计力求直观易用,避免不必要的复杂性
  2. 性能优化:在保证功能完整性的前提下,尽量减少运行时开销
  3. 向后兼容:保持API稳定性,确保旧代码能够继续工作
  4. 标准符合:遵循C99标准,确保广泛的编译器支持

跨平台实现策略

GLFW采用平台特定的后端实现策略,每个支持的平台都有独立的实现模块:

平台实现语言主要特性
WindowsCWin32 API集成,DirectInput支持
macOSObjective-C/CCocoa框架集成,Metal支持
X11CXlib/XCB支持,传统Unix桌面
WaylandC现代显示协议,libdecor集成
NullC无显示后端,用于测试

这种架构设计使得GLFW能够充分利用每个平台的特性,同时为上层应用提供一致的编程接口。平台特定的优化和特性都通过统一的API暴露,开发者无需关心底层实现细节。

GLFW的设计理念体现了对开发者体验的深度关注,通过精心设计的API和稳健的架构,为图形应用程序开发提供了可靠的基础设施支持。

多平台支持架构分析(Windows、macOS、Linux)

GLFW作为一个真正的跨平台图形库,其架构设计体现了高度的模块化和平台抽象能力。通过深入分析其源代码结构,我们可以清晰地看到GLFW如何在Windows、macOS和Linux三大主流操作系统上实现统一的API接口。

平台抽象层架构设计

GLFW采用了一种巧妙的条件编译架构,通过预处理器宏来区分不同平台的具体实现。在src/platform.h文件中,我们可以看到完整的平台选择机制:

#if defined(_GLFW_WIN32)
 #include "win32_platform.h"
 #define GLFW_EXPOSE_NATIVE_WIN32
 #define GLFW_EXPOSE_NATIVE_WGL
#elif defined(_GLFW_COCOA)
 #include "cocoa_platform.h"
 #define GLFW_EXPOSE_NATIVE_COCOA
 #define GLFW_EXPOSE_NATIVE_NSGL
#elif defined(_GLFW_X11)
 #include "x11_platform.h"
 #define GLFW_EXPOSE_NATIVE_X11
 #define GLFW_EXPOSE_NATIVE_GLX
#elif defined(_GLFW_WAYLAND)
 #include "wl_platform.h"
 #define GLFW_EXPOSE_NATIVE_WAYLAND
#endif

这种设计确保了每个平台都有自己独立的实现文件,同时对外提供完全一致的API接口。

Windows平台实现分析

Windows平台的实现主要位于以下文件中:

  • win32_platform.h - 平台特定定义和结构体
  • win32_init.c - 初始化例程
  • win32_window.c - 窗口管理
  • win32_monitor.c - 显示器管理
  • wgl_context.c - OpenGL上下文管理

Windows平台的核心数据结构:

// win32_platform.h 中的关键结构体
typedef struct _GLFWlibraryWin32 {
    HINSTANCE       instance;
    DWORD           foregroundLockTimeout;
    char*           clipboardString;
    // ... 其他Windows特定状态
} _GLFWlibraryWin32;

typedef struct _GLFWwindowWin32 {
    HWND            handle;
    HICON           bigIcon;
    HICON           smallIcon;
    // ... 窗口相关状态
} _GLFWwindowWin32;

Windows平台使用传统的Win32 API进行窗口创建和管理,通过WGL(Windows GL)接口处理OpenGL上下文。

macOS平台实现分析

macOS平台采用Cocoa框架和Objective-C语言实现,主要文件包括:

  • cocoa_platform.h - Objective-C接口定义
  • cocoa_init.m - 初始化例程
  • cocoa_window.m - 窗口管理
  • cocoa_monitor.m - 显示器管理
  • nsgl_context.m - OpenGL上下文管理

macOS平台的关键特性:

// cocoa_platform.h 中的Objective-C接口
@interface GLFWWindow : NSWindow
- (BOOL)canBecomeKeyWindow;
- (BOOL)canBecomeMainWindow;
@end

@interface GLFWContentView : NSView
- (BOOL)isOpaque;
- (BOOL)canBecomeKeyView;
@end

macOS平台使用NSWindow和NSView来创建和管理窗口,通过NSOpenGL(现在已过渡到Metal)处理图形渲染。

Linux平台实现分析

Linux平台支持X11和Wayland两种显示协议,实现文件包括:

X11实现:

  • x11_platform.h - X11平台定义
  • x11_init.c - X11初始化
  • x11_window.c - X11窗口管理
  • x11_monitor.c - X11显示器管理
  • glx_context.c - GLX上下文管理

Wayland实现:

  • wl_platform.h - Wayland平台定义
  • wl_init.c - Wayland初始化
  • wl_window.c - Wayland窗口管理
  • wl_monitor.c - Wayland显示器管理

Linux平台的核心数据结构:

// x11_platform.h 中的X11特定结构体
typedef struct _GLFWlibraryX11 {
    Display*        display;
    int             screen;
    Window          root;
    // ... X11连接和状态信息
} _GLFWlibraryX11;

typedef struct _GLFWwindowX11 {
    Window          handle;
    Colormap        colormap;
    Cursor          hiddenCursor;
    // ... X11窗口特定状态
} _GLFWwindowX11;

多平台状态管理架构

GLFW使用统一的平台状态管理机制,通过条件编译确保每个平台只包含自己需要的状态信息:

mermaid

平台特定功能对比

下表展示了不同平台在关键功能实现上的差异:

功能特性WindowsmacOSLinux X11Linux Wayland
窗口创建Win32 APICocoa NSWindowXCreateWindowwl_surface
事件处理Window消息循环NSApplication事件循环XNextEventWayland事件循环
OpenGL上下文WGLNSOpenGLGLXEGL
显示器枚举EnumDisplayMonitorsNSScreenXRandRwl_output
输入处理Raw Input/DINSEventXInput2libinput

统一的API接口设计

尽管底层实现完全不同,GLFW通过精心设计的抽象层提供了完全一致的API:

// 跨平台统一的窗口创建函数
GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height,
                                    const char* title,
                                    GLFWmonitor* monitor,
                                    GLFWwindow* share);

// 跨平台统一的事件处理循环
while (!glfwWindowShouldClose(window)) {
    glfwPollEvents();
    // 渲染代码
    glfwSwapBuffers(window);
}

这种设计使得开发者无需关心底层平台差异,只需使用统一的GLFW API即可创建跨平台的图形应用程序。

平台检测与适配机制

GLFW在编译时通过预定义宏自动检测目标平台:

#if defined(_WIN32)
    #define _GLFW_WIN32
#elif defined(__APPLE__)
    #define _GLFW_COCOA
#elif defined(__linux__)
    // 自动检测Wayland或X11
    #if defined(_GLFW_WAYLAND)
        #define _GLFW_WAYLAND
    #else
        #define _GLFW_X11
    #endif
#endif

这种自动检测机制确保了GLFW能够在各种构建环境中正确配置平台特定的实现。

GLFW的多平台架构展现了优秀的软件工程设计理念,通过清晰的层次分离和统一的接口设计,成功实现了在Windows、macOS和Linux三大平台上的无缝跨平台支持。

核心功能模块:窗口、上下文、输入处理

GLFW作为一个轻量级的跨平台图形库,其核心功能围绕三个主要模块构建:窗口管理、OpenGL上下文管理和输入处理。这些模块协同工作,为开发者提供了创建图形应用程序所需的基础设施。

窗口管理:跨平台窗口创建与配置

GLFW的窗口管理模块提供了统一的API来创建和管理原生系统窗口。通过glfwCreateWindow函数,开发者可以轻松创建具有指定尺寸、标题和特性的窗口。

// 创建640x480像素的窗口
GLFWwindow* window = glfwCreateWindow(640, 480, "My Application", NULL, NULL);
if (!window) {
    // 窗口创建失败处理
    glfwTerminate();
    return -1;
}

窗口创建过程涉及复杂的平台特定实现,GLFW为每个支持的平台提供了专门的实现:

平台实现文件核心函数
Windowswin32_window.c_glfwCreateWindowWin32
macOScocoa_window.m_glfwCreateWindowCocoa
X11 (Linux)x11_window.c_glfwCreateWindowX11
Waylandwl_window.c_glfwCreateWindowWayland

窗口配置通过窗口提示(Window Hints)系统实现,允许开发者精细控制窗口特性:

// 配置OpenGL上下文版本
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);  // 禁止调整大小

窗口管理还包括监视器检测、视频模式设置、Gamma校正等高级功能,为多显示器环境和色彩管理提供支持。

OpenGL上下文管理:渲染环境的核心

上下文管理是GLFW的核心功能之一,负责创建和管理OpenGL、OpenGL ES或Vulkan渲染上下文。上下文创建与窗口创建紧密集成,确保渲染表面与显示窗口的正确关联。

// 创建窗口后设置当前上下文
glfwMakeContextCurrent(window);

// 设置垂直同步
glfwSwapInterval(1);

GLFW支持多种上下文创建API,通过统一的接口抽象平台差异:

mermaid

上下文管理还包括版本协商、扩展加载和配置文件选择。GLFW会自动处理不同平台间的API差异,为开发者提供一致的编程接口。

输入处理:统一的事件系统

GLFW的输入处理系统提供了跨平台的键盘、鼠标和游戏手柄输入抽象。通过回调函数机制,开发者可以接收各种输入事件。

键盘输入处理
// 键盘回调函数
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) {
        glfwSetWindowShouldClose(window, GLFW_TRUE);
    }
    
    // 处理修饰键
    if (key == GLFW_KEY_W && action == GLFW_PRESS) {
        if (mods & GLFW_MOD_CONTROL) {
            // Ctrl+W 快捷键
        }
    }
}

// 设置键盘回调
glfwSetKeyCallback(window, key_callback);
鼠标输入处理
// 鼠标位置回调
void cursor_position_callback(GLFWwindow* window, double xpos, double ypos) {
    // 处理鼠标移动
}

// 鼠标按钮回调
void mouse_button_callback(GLFWwindow* window, int button, int action, int mods) {
    if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) {
        // 左键点击处理
    }
}

// 设置鼠标回调
glfwSetCursorPosCallback(window, cursor_position_callback);
glfwSetMouseButtonCallback(window, mouse_button_callback);
输入状态查询

除了回调机制,GLFW还提供状态查询函数,允许按需获取输入设备状态:

// 查询按键状态
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) {
    // 空格键被按下
}

// 获取鼠标位置
double xpos, ypos;
glfwGetCursorPos(window, &xpos, &ypos);

// 检查鼠标按钮状态
if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT) == GLFW_PRESS) {
    // 右键被按下
}

事件处理与消息循环

GLFW采用经典的事件驱动架构,需要开发者实现消息循环来处理事件和渲染:

while (!glfwWindowShouldClose(window)) {
    // 处理事件
    glfwPollEvents();
    
    // 渲染场景
    renderScene();
    
    // 交换缓冲区
    glfwSwapBuffers(window);
}

事件处理系统支持多种处理模式:

处理模式函数特点
立即处理glfwPollEvents()非阻塞,立即返回
等待事件glfwWaitEvents()阻塞,直到有事件
超时等待glfwWaitEventsTimeout()带超时的阻塞等待

错误处理与调试

GLFW提供了完善的错误处理机制,通过错误回调函数报告运行时错误:

void error_callback(int error, const char* description) {
    fprintf(stderr, "GLFW Error %d: %s\n", error, description);
}

// 设置错误回调(可在初始化前调用)
glfwSetErrorCallback(error_callback);

错误代码涵盖了各种可能的故障情况,从初始化失败到窗口创建错误,为调试提供了详细的信息。

多窗口支持

GLFW支持创建和管理多个窗口,每个窗口都有独立的上下文和输入状态:

// 创建主窗口
GLFWwindow* mainWindow = glfwCreateWindow(800, 600, "Main Window", NULL, NULL);

// 创建辅助窗口
GLFWwindow* secondaryWindow = glfwCreateWindow(400, 300, "Secondary Window", NULL, NULL);

// 在不同窗口间切换上下文
glfwMakeContextCurrent(mainWindow);
// 渲染主窗口内容

glfwMakeContextCurrent(secondaryWindow);
// 渲染辅助窗口内容

多窗口管理需要仔细处理上下文切换和资源分配,GLFW提供了必要的工具来简化这一过程。

平台抽象层

GLFW的强大之处在于其平台抽象层,该层隐藏了底层操作系统的差异:

mermaid

这种设计使得应用程序代码可以在不同平台间无缝移植,而无需修改核心逻辑。开发者只需关注业务逻辑的实现,而将平台特定的细节交给GLFW处理。

通过这三个核心模块的紧密协作,GLFW为图形应用程序开发提供了稳定、高效且易于使用的 foundation,使得开发者能够专注于创造性的图形编程任务,而不是陷入平台差异的复杂性中。

编译与集成环境配置指南

GLFW作为跨平台图形库,提供了灵活的编译选项和多种集成方式。本节将详细介绍在不同平台下编译GLFW的方法,以及如何将GLFW集成到您的项目中。

编译环境准备

GLFW使用CMake作为构建系统,支持多种编译器和平台。在开始编译前,需要确保系统已安装以下工具:

  • CMake 3.16或更高版本
  • C99兼容的编译器(GCC、Clang、MSVC等)
  • 平台相关的开发工具链
各平台依赖项

Windows平台:

  • Visual Studio 2013或更高版本
  • 或MinGW/MinGW-w64工具链
  • Windows SDK

macOS平台:

  • Xcode命令行工具
  • macOS 10.11或更高版本

Linux/Unix平台:

# Ubuntu/Debian
sudo apt install build-essential cmake

# Fedora/RHEL
sudo dnf install gcc-c++ cmake

# 对于X11后端
sudo apt install xorg-dev libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev

# 对于Wayland后端  
sudo apt install libwayland-dev libxkbcommon-dev wayland-protocols

CMake配置选项详解

GLFW提供了丰富的CMake配置选项,允许开发者根据需求定制库的功能:

核心构建选项
选项名称默认值描述
BUILD_SHARED_LIBSOFF构建共享库(DLL/so/dylib)
GLFW_LIBRARY_TYPE覆盖库类型(STATIC/SHARED/OBJECT)
GLFW_BUILD_EXAMPLESON构建示例程序
GLFW_BUILD_TESTSON构建测试程序
GLFW_BUILD_DOCSON构建文档
平台特定选项

mermaid

编译流程详解

标准编译流程

mermaid

步骤1:获取源码

git clone https://gitcode.com/GitHub_Trending/gl/glfw.git
cd glfw

步骤2:配置构建环境

# 创建构建目录(推荐使用out-of-tree构建)
mkdir build
cd build

# 配置CMake(基本配置)
cmake -S .. -B . -DCMAKE_BUILD_TYPE=Release

# 自定义配置示例
cmake -S .. -B . \
    -DCMAKE_BUILD_TYPE=Release \
    -DBUILD_SHARED_LIBS=ON \
    -DGLFW_BUILD_EXAMPLES=OFF \
    -DGLFW_BUILD_TESTS=OFF

步骤3:编译库

# 使用make(Linux/macOS)
make -j$(nproc)

# 使用Visual Studio(Windows)
cmake --build . --config Release

# 使用Ninja(跨平台)
cmake -S .. -B . -G Ninja
ninja
跨平台编译配置

Windows MSVC编译:

cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release

Windows MinGW编译:

cmake -S . -B build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release
mingw32-make -C build

macOS编译:

cmake -S . -B build -G "Xcode" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11
xcodebuild -project build/GLFW.xcodeproj -configuration Release

Linux多后端选择:

# 仅使用X11后端
cmake -S . -B build -DGLFW_BUILD_WAYLAND=OFF -DGLFW_BUILD_X11=ON

# 仅使用Wayland后端
cmake -S . -B build -DGLFW_BUILD_WAYLAND=ON -DGLFW_BUILD_X11=OFF

# 同时支持两种后端(默认)
cmake -S . -B build -DGLFW_BUILD_WAYLAND=ON -DGLFW_BUILD_X11=ON

安装与部署

编译完成后,可以将GLFW安装到系统目录或自定义位置:

标准安装:

cmake --install build --prefix /usr/local

自定义安装路径:

cmake --install build --prefix ${HOME}/.local

生成包配置文件: GLFW会自动生成以下配置文件,便于其他项目使用:

  • glfw3Config.cmake - CMake包配置文件
  • glfw3Targets.cmake - 目标导出文件
  • glfw3.pc - pkg-config文件

项目集成指南

CMake项目集成

在CMake项目中集成GLFW非常简单:

# 查找GLFW包
find_package(glfw3 REQUIRED)

# 添加可执行文件
add_executable(my_app main.cpp)

# 链接GLFW库
target_link_libraries(my_app glfw)

# 添加包含目录
target_include_directories(my_app PRIVATE ${GLFW_INCLUDE_DIRS})
手动集成

如果使用手动编译的库,可以这样配置:

# 设置GLFW路径
set(GLFW_DIR /path/to/glfw/install)

# 查找库文件
find_library(GLFW_LIBRARY glfw3 PATHS ${GLFW_DIR}/lib)
find_path(GLFW_INCLUDE_DIR GLFW/glfw3.h PATHS ${GLFW_DIR}/include)

# 添加目标
add_executable(my_app main.cpp)
target_link_libraries(my_app ${GLFW_LIBRARY})
target_include_directories(my_app PRIVATE ${GLFW_INCLUDE_DIR})
子模块集成

将GLFW作为git子模块集成:

# 添加子模块
git submodule add https://gitcode.com/GitHub_Trending/gl/glfw.git extern/glfw

# CMakeLists.txt配置
add_subdirectory(extern/glfw)
target_link_libraries(my_app glfw)

编译问题排查

常见问题及解决方案

问题1:找不到Wayland开发包

# Ubuntu解决方案
sudo apt install libwayland-dev libxkbcommon-dev wayland-protocols

# 或者禁用Wayland支持
cmake -DGLFW_BUILD_WAYLAND=OFF ..

问题2:X11开发包缺失

# Ubuntu解决方案
sudo apt install xorg-dev libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev

# 或者禁用X11支持(仅限Wayland)
cmake -DGLFW_BUILD_X11=OFF ..

问题3:macOS框架链接错误 确保正确链接Cocoa框架:

target_link_libraries(my_app "-framework Cocoa" "-framework IOKit" "-framework CoreFoundation")

问题4:Windows符号冲突 使用静态库时避免符号冲突:

# 在包含glfw3.h前定义此宏
add_definitions(-DGLFW_STATIC)

高级编译配置

交叉编译配置

GLFW支持交叉编译到不同架构:

Linux到Windows交叉编译:

cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=../CMake/x86_64-w64-mingw32.cmake

架构特定优化:

# 启用SSE优化
cmake -S . -B build -DCMAKE_C_FLAGS="-msse4.2"

# 针对特定CPU优化
cmake -S . -B build -DCMAKE_C_FLAGS="-march=native"
调试版本配置
# 调试版本带符号信息
cmake -S . -B build-debug -DCMAKE_BUILD_TYPE=Debug -DGLFW_BUILD_EXAMPLES=ON

# 发布版本带调试信息
cmake -S . -B build-relwithdebinfo -DCMAKE_BUILD_TYPE=RelWithDebInfo

通过以上详细的编译和集成指南,您可以轻松地在各种平台上构建和配置GLFW,并根据项目需求进行定制化设置。GLFW的模块化设计和清晰的CMake配置使得集成过程变得简单而灵活。

总结

GLFW作为一个轻量级但功能强大的跨平台图形库,通过精心设计的架构和统一的API接口,成功实现了在Windows、macOS和Linux三大平台上的无缝支持。其核心设计理念包括平台无关性、最小化依赖原则、线程安全与状态管理,这些原则贯穿于整个库的实现中。GLFW的模块化平台支持架构、可扩展的分配器系统以及清晰的错误处理机制,为开发者提供了稳定可靠的图形应用程序开发基础。通过详细的编译指南和集成配置说明,开发者可以轻松地在各种环境中构建和使用GLFW,专注于创造性的图形编程任务,而无需陷入平台差异的复杂性中。

【免费下载链接】glfw A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input 【免费下载链接】glfw 项目地址: https://gitcode.com/GitHub_Trending/gl/glfw

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值