Chapter 09 · 引擎基础

平台能力查询

运行时检测 GPU 型号、最大纹理尺寸、平台后端类型、输入设备支持情况,编写自适应代码。

09

概念:为什么需要能力查询

XGE 运行在 8+ 个平台上,GPU 能力差异巨大——桌面 RTX 4090 支持 16384×16384 纹理,而嵌入式 GPU 可能只支持 2048。通过能力查询,你可以编写"降级但不崩溃"的自适应代码。

API 速查

函数说明
int xgeGpuCapsGet(xge_gpu_caps_t*)GPU 能力(后端、版本、最大纹理、厂商信息)
int xgePlatformCapsGet(xge_platform_caps_t*)平台能力(后端类型、输入设备、功能支持)
int xgePlatformRuntimeGet(xge_platform_runtime_t*)运行时状态(窗口/帧缓冲尺寸、DPI、事件计数)

xge_gpu_caps_t 结构体

typedef struct xge_gpu_caps_t {
    int  iBackend;          // GPU 后端(OPENGL33/GLES30/WEBGL2)
    int  iMajorVersion;     // GL 主版本号
    int  iMinorVersion;     // GL 次版本号
    int  iMaxTextureSize;   // 最大纹理尺寸(像素)
    char sVendor[64];       // GPU 厂商(如 "NVIDIA")
    char sRenderer[128];    // GPU 型号(如 "RTX 4090")
    char sVersion[64];      // GL 版本字符串
    char sShadingLanguage[64]; // GLSL 版本
} xge_gpu_caps_t;

编译本章示例

gcc -O2 -I. -o ch09.exe ch09_main.c build\xge.lib -lm -lws2_32 -liphlpapi -lgdi32 -luser32 -lshell32 -lopengl32 -lole32 -lwinmm -lavrt
.\ch09.exe

示例:打印完整能力信息

#include "xge.h"
#include <stdio.h>

static void printCaps(void) {
    xge_gpu_caps_t gpu;
    xgeGpuCapsGet(&gpu);

    printf("=== GPU ===\n");
    printf("Backend:  %d\n", gpu.iBackend);
    printf("Version:  %d.%d\n", gpu.iMajorVersion, gpu.iMinorVersion);
    printf("Max Tex:  %d\n", gpu.iMaxTextureSize);
    printf("Vendor:   %s\n", gpu.sVendor);
    printf("Renderer: %s\n", gpu.sRenderer);
    printf("GLSL:     %s\n", gpu.sShadingLanguage);

    xge_platform_caps_t plat;
    xgePlatformCapsGet(&plat);

    printf("\n=== Platform ===\n");
    printf("Platform: %s\n", plat.sPlatformName);
    printf("Graphics: %s\n", plat.sGraphicsName);
    printf("Touch: %d | Mouse: %d | Keyboard: %d\n",
           plat.bTouch, plat.bMouse, plat.bKeyboard);
    printf("Gamepad: %d | Audio: %d | HighDPI: %d\n",
           plat.bGamepad, plat.bAudio, plat.bHighDPI);
}
XGE 平台能力状态灯示例
图:本章权威示例在 xgeInit 后读取当前平台能力,并将窗口、RenderTarget、键盘、鼠标、音频和 HighDPI 状态绘为状态灯;具体启用项随设备变化。

自适应代码示例

// 根据最大纹理尺寸决定加载策略
xge_gpu_caps_t gpu;
xgeGpuCapsGet(&gpu);

int maxTex = gpu.iMaxTextureSize;
if (imageWidth > maxTex || imageHeight > maxTex) {
    // 降级:缩小图像或使用分块加载
    xgeLogWrite(XGE_LOG_WARN, "Tex",
        "Image exceeds GPU max texture size, downscaling");
    // ... 缩小逻辑 ...
}

要点与陷阱

  • 必须在 xgeInit 之后调用——能力查询需要 GL 上下文已创建。
  • iMaxTextureSize 是硬限制——超过此尺寸的纹理创建会失败。始终检查。
  • bTouch / bMouse 是编译时能力——表示该平台后端是否支持,不代表当前设备一定有。移动端 bMouse=0 但可能有蓝牙鼠标。
  • 平台后端类型:XGE_PLATFORM_BACKEND_SOKOL(桌面/移动)、EGL(嵌入式 Linux)、MINIPROGRAM(小程序/WASM)。

进阶练习

  1. 在窗口标题栏显示 GPU 型号和 GL 版本。
  2. 检测 bGamepad 能力,如果支持则打印 "手柄可用"。
  3. 用 xgePlatformRuntimeGet 获取 DPI 缩放,在 HIGHDPI 显示器上验证值为 1.5 或 2.0。