运行时检测 GPU 型号、最大纹理尺寸、平台后端类型、输入设备支持情况,编写自适应代码。
XGE 运行在 8+ 个平台上,GPU 能力差异巨大——桌面 RTX 4090 支持 16384×16384 纹理,而嵌入式 GPU 可能只支持 2048。通过能力查询,你可以编写"降级但不崩溃"的自适应代码。
| 函数 | 说明 |
|---|---|
int xgeGpuCapsGet(xge_gpu_caps_t*) | GPU 能力(后端、版本、最大纹理、厂商信息) |
int xgePlatformCapsGet(xge_platform_caps_t*) | 平台能力(后端类型、输入设备、功能支持) |
int xgePlatformRuntimeGet(xge_platform_runtime_t*) | 运行时状态(窗口/帧缓冲尺寸、DPI、事件计数) |
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);
}
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");
// ... 缩小逻辑 ...
}XGE_PLATFORM_BACKEND_SOKOL(桌面/移动)、EGL(嵌入式 Linux)、MINIPROGRAM(小程序/WASM)。bGamepad 能力,如果支持则打印 "手柄可用"。xgePlatformRuntimeGet 获取 DPI 缩放,在 HIGHDPI 显示器上验证值为 1.5 或 2.0。