SDL_ttf 核心 API 集合(CategoryAPI)
SDL_ttf 是 SDL 的官方字体渲染扩展库,该分类汇总了 SDL_ttf 全量核心 API,涵盖字体加载/管理、文本渲染(Surface/Renderer/GPU 三种模式)、字形/排版控制、多语言文本处理等功能,是 SDL 生态中实现高质量文本渲染的核心接口集合。
核心 API 列表(按功能分类)
一、基础初始化与版本管理
- TTF_Init:初始化 SDL_ttf 库(必须调用,加载 FreeType/HarfBuzz 依赖)
- TTF_Quit:清理 SDL_ttf 资源(程序退出前调用)
- TTF_WasInit:检查 SDL_ttf 是否已初始化
- TTF_Version:获取当前 SDL_ttf 版本信息
- SDL_TTF_MAJOR_VERSION:SDL_ttf 主版本号宏(如 3 代表 SDL_ttf 3.x)
- SDL_TTF_VERSION:构造版本结构体的宏
- SDL_TTF_VERSION_ATLEAST:编译期检查 SDL_ttf 版本是否满足最低要求
- TTF_GetFreeTypeVersion:获取底层 FreeType 库版本
- TTF_GetHarfBuzzVersion:获取底层 HarfBuzz 排版库版本
二、字体对象(TTF_Font)管理
1. 字体加载/释放
- TTF_OpenFont:从文件加载字体文件(指定字号)
- TTF_OpenFontIO:从 SDL_IOStream 流加载字体(支持内存字体)
- TTF_OpenFontWithProperties:带自定义属性加载字体(如 DPI、字体面索引)
- TTF_CloseFont:关闭并释放字体对象
- TTF_CopyFont:复制字体对象(继承原字体的样式/属性)
- TTF_GetNumFontFaces:获取字体文件中的字体面数量(多字体面文件专用)
2. 字体属性查询
- TTF_FontHasGlyph:检查字体是否包含指定 Unicode 字形
- TTF_FontIsFixedWidth:检查字体是否为等宽字体(如 Consolas)
- TTF_FontIsScalable:检查字体是否为可缩放矢量字体(如 TrueType)
- TTF_GetFontAscent:获取字体上行高度(基线到字形顶部的距离)
- TTF_GetFontDescent:获取字体下行高度(基线到字形底部的距离)
- TTF_GetFontHeight:获取字体总高度(上行+下行)
- TTF_GetFontLineSkip:获取字体行间距(两行文本的基线间距)
- TTF_GetFontFamilyName:获取字体家族名称(如 "Microsoft YaHei")
- TTF_GetFontStyleName:获取字体样式名称(如 "Bold")
- TTF_GetFontSize:获取字体当前字号
- TTF_GetFontWeight:获取字体字重(粗细程度)
- TTF_GetFontStyle:获取字体样式标志(粗体/斜体等)
- TTF_GetFontDPI:获取字体渲染的 DPI 设置
- TTF_GetFontCharSpacing:获取字符间距
- TTF_GetFontKerning:获取字距调整开关状态
- TTF_GetFontOutline:获取字体描边宽度
- TTF_GetFontHinting:获取字体提示模式(影响渲染清晰度)
- TTF_GetFontDirection:获取字体默认排版方向
- TTF_GetFontWrapAlignment:获取文本换行对齐方式
- TTF_GetFontProperties:获取字体完整配置属性
3. 字体属性设置
- TTF_SetFontSize:设置字体字号
- TTF_SetFontSizeDPI:按 DPI 缩放设置字体字号
- TTF_SetFontStyle:设置字体样式(粗体/斜体/下划线等)
- TTF_SetFontWeight:设置字体字重(如 TTF_FONT_WEIGHT_BOLD)
- TTF_SetFontCharSpacing:设置字符间距
- TTF_SetFontKerning:开启/关闭字距调整(优化字符间距)
- TTF_SetFontOutline:设置字体描边宽度
- TTF_SetFontHinting:设置字体提示模式(如 TTF_HINTING_NORMAL)
- TTF_SetFontDirection:设置字体排版方向(LTR/RTL 等)
- TTF_SetFontLanguage:设置字体关联的语言
- TTF_SetFontScript:设置字体关联的文字脚本(如中文/英文)
- TTF_SetFontLineSkip:自定义字体行间距
- TTF_SetFontWrapAlignment:设置文本换行对齐方式
- TTF_SetFontSDF:开启/关闭 SDF(有符号距离场)渲染(适合缩放)
4. 字体回退(Fallback)
- TTF_AddFallbackFont:添加回退字体(主字体无字形时使用)
- TTF_RemoveFallbackFont:移除指定回退字体
- TTF_ClearFallbackFonts:清空所有回退字体
三、字形(Glyph)操作
- TTF_GetGlyphMetrics:获取指定字形的度量信息(宽度、偏移等)
- TTF_GetGlyphKerning:获取两个字形间的字距调整值
- TTF_GetGlyphImage:获取指定字形的渲染图像
- TTF_GetGlyphImageForIndex:按字形索引获取渲染图像
- TTF_GetGlyphScript:获取字形所属的文字脚本
- TTF_RenderGlyph_Solid:渲染单个字形为纯色 Surface
- TTF_RenderGlyph_Shaded:渲染单个字形为带阴影的 Surface
- TTF_RenderGlyph_Blended:渲染单个字形为带alpha混合的 Surface
- TTF_RenderGlyph_LCD:渲染单个字形为 LCD 优化的 Surface
四、文本渲染(基础接口)
- TTF_RenderText_Solid:渲染文本为纯色 Surface(高性能,无抗锯齿)
- TTF_RenderText_Shaded:渲染文本为带阴影的 Surface(有抗锯齿)
- TTF_RenderText_Blended:渲染文本为 alpha 混合 Surface(高质量抗锯齿)
- TTF_RenderText_LCD:渲染文本为 LCD 优化 Surface(高清显示)
- TTF_RenderText_Solid_Wrapped:渲染自动换行的纯色文本
- TTF_RenderText_Shaded_Wrapped:渲染自动换行的带阴影文本
- TTF_RenderText_Blended_Wrapped:渲染自动换行的 alpha 混合文本
- TTF_RenderText_LCD_Wrapped:渲染自动换行的 LCD 优化文本
- TTF_MeasureString:测量文本渲染后的尺寸(不实际渲染)
- TTF_GetStringSize:获取文本的宽高尺寸
- TTF_GetStringSizeWrapped:获取自动换行文本的宽高尺寸
五、文本引擎(TextEngine)(高级渲染)
1. 引擎创建/销毁
- TTF_CreateSurfaceTextEngine:创建基于 Surface 的文本引擎(CPU 渲染)
- TTF_CreateRendererTextEngine:创建基于 SDL_Renderer 的文本引擎(2D 硬件加速)
- TTF_CreateRendererTextEngineWithProperties:带属性创建 Renderer 文本引擎
- TTF_CreateGPUTextEngine:创建基于 GPU 的文本引擎(3D 硬件加速)
- TTF_CreateGPUTextEngineWithProperties:带属性创建 GPU 文本引擎
- TTF_DestroySurfaceTextEngine:销毁 Surface 文本引擎
- TTF_DestroyRendererTextEngine:销毁 Renderer 文本引擎
- TTF_DestroyGPUTextEngine:销毁 GPU 文本引擎
2. 文本对象(TTF_Text)管理
- TTF_CreateText:创建文本对象(绑定字体和文本内容)
- TTF_DestroyText:销毁文本对象
- TTF_SetTextString:设置文本对象的内容
- TTF_AppendTextString:追加文本到文本对象
- TTF_InsertTextString:插入文本到文本对象
- TTF_DeleteTextString:删除文本对象的部分内容
- TTF_UpdateText:更新文本对象的渲染数据
- TTF_SetTextFont:设置文本对象关联的字体
- TTF_SetTextColor:设置文本颜色(8位通道)
- TTF_SetTextColorFloat:设置文本颜色(浮点通道,0.0-1.0)
- TTF_SetTextDirection:设置文本排版方向
- TTF_SetTextScript:设置文本所属的文字脚本
- TTF_SetTextPosition:设置文本渲染位置
- TTF_SetTextWrapWidth:设置文本自动换行宽度
- TTF_SetTextWrapWhitespaceVisible:设置是否显示换行空白符
- TTF_SetTextEngine:为文本对象绑定文本引擎
- TTF_GetTextFont:获取文本对象关联的字体
- TTF_GetTextColor:获取文本颜色(8位通道)
- TTF_GetTextColorFloat:获取文本颜色(浮点通道)
- TTF_GetTextDirection:获取文本排版方向
- TTF_GetTextScript:获取文本所属的文字脚本
- TTF_GetTextPosition:获取文本渲染位置
- TTF_GetTextSize:获取文本渲染后的尺寸
- TTF_GetTextWrapWidth:获取文本自动换行宽度
- TTF_GetTextEngine:获取文本对象绑定的引擎
3. 高级文本渲染
- TTF_DrawSurfaceText:使用 Surface 引擎渲染文本
- TTF_DrawRendererText:使用 Renderer 引擎渲染文本
- TTF_GetGPUTextDrawData:获取 GPU 文本渲染的绘制数据
- TTF_SetGPUTextEngineWinding:设置 GPU 文本引擎的顶点缠绕方向
- TTF_GetGPUTextEngineWinding:获取 GPU 文本引擎的顶点缠绕方向
六、文本子串/排版控制
- TTF_GetTextSubString:获取文本指定范围的子串
- TTF_GetTextSubStringForLine:获取文本指定行的子串
- TTF_GetTextSubStringForPoint:获取指定坐标对应的文本子串
- TTF_GetTextSubStringsForRange:获取指定范围的所有子串
- TTF_GetNextTextSubString:获取下一个文本子串
- TTF_GetPreviousTextSubString:获取上一个文本子串
七、常量与枚举
1. 字体样式
- TTF_STYLE_NORMAL:正常样式
- TTF_STYLE_BOLD:粗体
- TTF_STYLE_ITALIC:斜体
- TTF_STYLE_UNDERLINE:下划线
- TTF_STYLE_STRIKETHROUGH:删除线
2. 字体字重
- TTF_FONT_WEIGHT_THIN:极细
- TTF_FONT_WEIGHT_LIGHT:细体
- TTF_FONT_WEIGHT_NORMAL:常规
- TTF_FONT_WEIGHT_MEDIUM:中等
- TTF_FONT_WEIGHT_BOLD:粗体
- TTF_FONT_WEIGHT_BLACK:黑体
3. 文本方向
- TTF_DIRECTION_LTR:从左到右(如英文)
- TTF_DIRECTION_RTL:从右到左(如阿拉伯语)
- TTF_DIRECTION_TTB:从上到下(如竖排中文)
- TTF_DIRECTION_BTT:从下到上
- TTF_DIRECTION_INVALID:无效方向
4. 字体提示模式
- TTF_HINTING_NONE:无提示(模糊)
- TTF_HINTING_LIGHT:轻量提示
- TTF_HINTING_NORMAL:常规提示
- TTF_HINTING_MONO:单色提示(等宽字体优化)
5. 对齐方式
- TTF_HORIZONTAL_ALIGN_LEFT:左对齐
- TTF_HORIZONTAL_ALIGN_CENTER:居中
- TTF_HORIZONTAL_ALIGN_RIGHT:右对齐
6. 图像类型
- TTF_IMAGE_SOLID:纯色图像
- TTF_IMAGE_SHADED:带阴影图像
- TTF_IMAGE_BLENDED:alpha 混合图像
- TTF_IMAGE_SDF:SDF 图像
7. 属性常量(PROP)
- TTF_PROP_FONT_CREATE_SIZE_FLOAT:字体创建时的字号属性
- TTF_PROP_FONT_CREATE_DPI_NUMBER:字体创建时的 DPI 属性
- TTF_PROP_RENDERER_TEXT_ENGINE_ATLAS_SIZE:渲染引擎纹理图集尺寸
- TTF_PROP_GPU_TEXT_ENGINE_DEVICE:GPU 引擎的设备指针属性
八、工具函数
- TTF_StringToTag:将字符串转换为 OpenType 标签
- TTF_TagToString:将 OpenType 标签转换为字符串
- UNICODE_BOM_NATIVE:本地字节序的 Unicode BOM 常量
FreeBASIC 示例代码
' 引入 SDL 及 SDL_ttf 相关声明(需链接 SDL3 和 SDL3_ttf 库)
#Include "SDL.bi"
#Include "SDL_ttf.bi"
' 补充关键类型/宏声明(FreeBASIC 绑定可能缺失)
#Define TTF_STYLE_BOLD 1
#Define TTF_STYLE_ITALIC 2
#Define TTF_HINTING_NORMAL 2
' 检查 SDL_ttf 版本
Sub CheckTTFVersion()
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "【检查 SDL_ttf 版本】")
Dim As SDL_version ver
TTF_Version(@ver)
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "SDL_ttf 版本:%d.%d.%d", ver.major, ver.minor, ver.patch)
' 编译期版本检查
#If SDL_TTF_VERSION_ATLEAST(3, 0, 0)
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "✓ 满足 SDL_ttf 3.0.0 最低版本要求")
#Else
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "✗ 不满足 SDL_ttf 3.0.0 最低版本要求")
#EndIf
' 打印 FreeType 和 HarfBuzz 版本
Dim As SDL_version ftVer, hbVer
TTF_GetFreeTypeVersion(@ftVer)
TTF_GetHarfBuzzVersion(@hbVer)
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "FreeType 版本:%d.%d.%d", ftVer.major, ftVer.minor, ftVer.patch)
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "HarfBuzz 版本:%d.%d.%d", hbVer.major, hbVer.minor, hbVer.patch)
End Sub
' 基础文本渲染示例(Surface 模式)
Sub BasicTextRenderExample(ByVal fontPath As ZString Ptr)
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, vbCrLf & "【基础文本渲染示例】")
' 1. 加载字体(字号 24)
Dim As TTF_Font Ptr font = TTF_OpenFont(fontPath, 24)
If (font = NULL) Then
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "加载字体失败:%s", TTF_GetError())
Exit Sub
End If
' 2. 设置字体样式(粗体+斜体)
TTF_SetFontStyle(font, TTF_STYLE_BOLD Or TTF_STYLE_ITALIC)
TTF_SetFontHinting(font, TTF_HINTING_NORMAL) ' 开启常规提示
' 3. 查询字体属性
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "字体家族:%s", TTF_GetFontFamilyName(font))
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "字体高度:%d 像素", TTF_GetFontHeight(font))
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "行间距:%d 像素", TTF_GetFontLineSkip(font))
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "是否等宽:%s", IIf(TTF_FontIsFixedWidth(font), "是", "否"))
' 4. 检查是否包含中文字形
Dim As Uint32 chineseChar = &H4E2D ' "中" 字的 Unicode 编码
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "是否包含 '中' 字形:%s", _
IIf(TTF_FontHasGlyph(font, chineseChar), "是", "否"))
' 5. 渲染文本(Blended 模式,高质量抗锯齿)
Dim As SDL_Color textColor = {255, 255, 255, 255} ' 白色
Dim As SDL_Surface Ptr textSurface = TTF_RenderText_Blended(font, "SDL_ttf 文本渲染示例", textColor)
If (textSurface = NULL) Then
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "渲染文本失败:%s", TTF_GetError())
TTF_CloseFont(font)
Exit Sub
End If
' 6. 打印文本尺寸
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "文本尺寸:%dx%d 像素", textSurface->w, textSurface->h)
' 7. 保存渲染结果为 PNG(需链接 SDL_image)
#If defined(SDL_IMAGE)
If (IMG_SavePNG(textSurface, "text_render.png") = SDL_TRUE) Then
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "渲染结果已保存为 text_render.png")
End If
#EndIf
' 8. 释放资源
SDL_DestroySurface(textSurface)
TTF_CloseFont(font)
End Sub
' 高级文本引擎示例(Renderer 模式)
Sub AdvancedTextEngineExample(ByVal fontPath As ZString Ptr)
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, vbCrLf & "【高级文本引擎示例】")
' 1. 创建窗口和渲染器
Dim As SDL_Window Ptr window = SDL_CreateWindow( _
"SDL_ttf 高级渲染示例", _
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, _
800, 600, _
SDL_WINDOW_SHOWN _
)
If (window = NULL) Then
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "创建窗口失败:%s", SDL_GetError())
Exit Sub
End If
Dim As SDL_Renderer Ptr renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED Or SDL_RENDERER_PRESENTVSYNC)
If (renderer = NULL) Then
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "创建渲染器失败:%s", SDL_GetError())
SDL_DestroyWindow(window)
Exit Sub
End If
' 2. 创建 Renderer 文本引擎
Dim As TTF_TextEngine Ptr textEngine = TTF_CreateRendererTextEngine(renderer)
If (textEngine = NULL) Then
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "创建文本引擎失败:%s", TTF_GetError())
SDL_DestroyRenderer(renderer)
SDL_DestroyWindow(window)
Exit Sub
End If
' 3. 加载字体并创建文本对象
Dim As TTF_Font Ptr font = TTF_OpenFont(fontPath, 32)
If (font = NULL) Then
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "加载字体失败:%s", TTF_GetError())
TTF_DestroyRendererTextEngine(textEngine)
SDL_DestroyRenderer(renderer)
SDL_DestroyWindow(window)
Exit Sub
End If
Dim As TTF_Text Ptr textObj = TTF_CreateText(font, "SDL_ttf 高级文本引擎示例")
If (textObj = NULL) Then
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "创建文本对象失败:%s", TTF_GetError())
TTF_CloseFont(font)
TTF_DestroyRendererTextEngine(textEngine)
SDL_DestroyRenderer(renderer)
SDL_DestroyWindow(window)
Exit Sub
End If
' 4. 设置文本属性
TTF_SetTextColor(textObj, (SDL_Color){0, 255, 255, 255}) ' 青色
TTF_SetTextPosition(textObj, 50, 50) ' 渲染位置 (50,50)
TTF_SetTextEngine(textObj, textEngine) ' 绑定文本引擎
' 5. 渲染循环
Dim As SDL_bool running = SDL_TRUE
Dim As SDL_Event evt
While (running)
' 事件处理
While (SDL_PollEvent(@evt))
If (evt.type = SDL_QUIT) Then
running = SDL_FALSE
End If
Wend
' 清屏(黑色背景)
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255)
SDL_RenderClear(renderer)
' 渲染文本
TTF_DrawRendererText(textObj)
' 刷新屏幕
SDL_RenderPresent(renderer)
Wend
' 6. 释放资源
TTF_DestroyText(textObj)
TTF_CloseFont(font)
TTF_DestroyRendererTextEngine(textEngine)
SDL_DestroyRenderer(renderer)
SDL_DestroyWindow(window)
End Sub
' 主程序
Sub Main()
' 初始化 SDL 视频子系统
If (SDL_Init(SDL_INIT_VIDEO) < 0) Then
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL 初始化失败:%s", SDL_GetError())
Exit Sub
End If
' 初始化 SDL_ttf
If (TTF_Init() = -1) Then
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_ttf 初始化失败:%s", TTF_GetError())
SDL_Quit()
Exit Sub
End If
' 字体文件路径(替换为实际的字体文件,如 simsun.ttf、arial.ttf)
Dim As ZString Ptr fontPath = StrPtr("simsun.ttf")
' 运行示例
CheckTTFVersion()
BasicTextRenderExample(fontPath)
AdvancedTextEngineExample(fontPath)
' 清理资源
TTF_Quit()
SDL_Quit()
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, vbCrLf & "程序正常退出")
End Sub
' 运行主程序
Main()
核心知识点补充
-
SDL_ttf 初始化关键:
- 必须先调用
SDL_Init(SDL_INIT_VIDEO)初始化视频子系统,再调用TTF_Init(); TTF_Init()内部会加载 FreeType(字体渲染)和 HarfBuzz(文本排版),需确保链接这两个库;- 程序退出前必须调用
TTF_Quit(),否则会导致内存泄漏。
- 必须先调用
-
字体加载与管理:
- 支持 TrueType (.ttf)、OpenType (.otf)、WOFF 等主流字体格式;
TTF_OpenFontIO支持从内存流加载字体(适合嵌入资源的游戏/应用);- 多语言文本需使用回退字体(
TTF_AddFallbackFont),避免部分字形缺失; - 字体对象使用后必须调用
TTF_CloseFont释放,否则会泄漏资源。
-
文本渲染模式选择:
- Solid 模式:高性能、无抗锯齿,适合实时更新的文本(如游戏分数);
- Shaded 模式:带阴影、有抗锯齿,性能中等,适合静态文本;
- Blended 模式:Alpha 混合、高质量抗锯齿,性能较低,适合UI文本;
- LCD 模式:针对 LCD 屏幕优化,清晰度最高,仅支持部分字体;
- 文本引擎模式:硬件加速渲染,适合大量/动态文本(如编辑器、聊天框)。
-
多语言排版要点:
- 支持 RTL(从右到左)、TTB(竖排)等排版方向,适配阿拉伯语、日语等;
- 中文/日文/韩文等CJK文字需使用支持对应字形的字体;
TTF_SetFontScript可指定文字脚本,优化排版规则。
-
跨平台注意事项:
- Windows 系统可直接使用系统字体(如 simsun.ttf、microsoftyahei.ttf);
- Linux 系统需确保安装字体文件,或打包字体到应用目录;
- macOS 系统字体路径为
/System/Library/Fonts/,如 Arial.ttf; - 移动平台需将字体文件放入 assets 目录,使用绝对路径加载。
总结
-
核心优势:
- 无缝衔接 SDL 核心库,渲染的文本可直接用于 SDL 窗口/纹理;
- 支持多渲染模式(CPU/Surface、2D Renderer、3D GPU),兼顾性能与质量;
- 完整的字体属性控制(样式、字重、间距、描边等),满足各类UI需求;
- 支持多语言排版(RTL/TTB、CJK字形、回退字体),适配全球市场;
- 基于成熟的 FreeType/HarfBuzz 库,渲染质量有保障。
-
使用建议:
- 静态文本优先使用 Blended 模式,动态文本优先使用 Solid 模式;
- 大量文本渲染优先使用文本引擎(TextEngine),利用硬件加速;
- 多语言应用务必添加回退字体,避免字形缺失;
- 高清显示场景使用 LCD 模式或 SDF 渲染,提升文字清晰度;
- 字体文件建议打包到应用目录,避免依赖系统字体。
-
关键点回顾:
- SDL_ttf 是 SDL 的字体渲染扩展库,核心依赖 FreeType 和 HarfBuzz;
TTF_Init()/TTF_Quit()是必选的初始化/清理接口;TTF_Font是字体对象核心,支持样式、字重、间距等属性配置;- 文本渲染分基础模式(Solid/Shaded/Blended)和高级引擎模式(Surface/Renderer/GPU);
- 多语言排版需关注文本方向(LTR/RTL)、回退字体和字形检查。
评论一下?