关于SDL混合显示中英文标准字体的方式以及SDL显示可能带来的内存泄露
首先,我们从WIN10系统以下路径中找到字体库:simsun.ttc,他的路径一般为:
C:\Windows\Fonts
文件夹中的宋体,常规即是我们要的内容
将其拷贝出来,即可作为我们显示时所用的字体库。
SDL显示字体的一般流程为:
首先使用SDL_CreateWindow;以及SDL_CreateRenderer函数分别创建SDL窗口以及窗口对应的渲染器。
1. 使用TTF_OpenFont()函数打开字体库,同时设置字体大小;
2. 根据打开的字体库,要显示的内容以及字体颜色创建文本表面Surface,根据你采用的编码不同使用的函数为:(本文推荐采用UNICODE编码,这意味着字符需要采用16位来表示,这样可以同时显示中英文内容)
TTF_RenderText_Blended(TTF_Font *font,
const char *text, SDL_Color fg);
TTF_RenderUTF8_Blended(TTF_Font *font,
const char *text, SDL_Color fg);
TTF_RenderUNICODE_Blended(TTF_Font *font,
const Uint16 *text, SDL_Color fg);;
3. 根据得到的Surface使用SDL_CreateTextureFromSurface()函数创建纹理Texture;
4. 使用SDL_RenderCopy()函数将文本纹理复制到窗口渲染器,以及使用SDL_RenderPresent(pWndRenderer); 将渲染器内容显示出来;
5. 使用 SDL_DestroyTexture(pTextTexture); SDL_FreeSurface(pTextSurface);函数释放Surface以及Texture。通常这2个函数的错误使用往往会照成多次显示内容后,内存疯狂泄露,解决办法是:每使用一次TTF_RenderUNICODE_Blended()、SDL_CreateTextureFromSurface()函数,就执行一次对应的释放函数,注意是每一次。
假如你在某个调用函数中多次执行这2个函数,而只在该函数退出前执行了一次对应的内存释放,恭喜你,你的操作将会造成大量的内存泄露,不信你放在while循环里泡个几百遍看看。
记住是每使用一次TTF_RenderUNICODE_Blended()、SDL_CreateTextureFromSurface()函数,在退出前就执行一次对应的释放函数,注意是每一次,而不是退出时仅执行一次。
6. 注意事项:如果你要显示出来的字体无失真,不要自己指定显示内容所需要的区域大小,而是指定显示起始位置,使用TTF_SizeUNICODE()函数计算所需要的显示区域,如果需要调整字体大小,请使用TTF_OpenFont()函数更改。这样你的字体才能保证不失真变形。
以下是代码部分:
首先是主函数:
int main()
{
SDL_Window* pSDLWindow = NULL; //sdl窗口
SDL_Renderer* pWndRenderer = NULL;//窗口渲染器
wchar_t display_word[] = L"H***************你好啊,jackiewmt!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*";
//初始化SDL
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) return -1;
//创建窗口
pSDLWindow = SDL_CreateWindow("SDLWind", 200, 200, 1600, 800, SDL_WINDOW_RESIZABLE);
if (NULL == pSDLWindow) return -1;
//创建窗口渲染器
pWndRenderer = SDL_CreateRenderer(pSDLWindow, -1, 0);
sdl_OutWord(pSDLWindow, pWndRenderer,display_word);
SDL_Event sdl_event;
bool bQuit = false;
while (!bQuit)
{
if (SDL_PollEvent(&sdl_event))
{
switch (sdl_event.type)
{
case SDL_QUIT:
bQuit = true;
break;
case SDL_WINDOWEVENT:
{
if (sdl_event.window.event == SDL_WINDOWEVENT_RESIZED)
{
SDL_DestroyRenderer(pWndRenderer);
pWndRenderer = SDL_CreateRenderer(pSDLWindow, -1, 0);
//创建窗口渲染器
sdl_OutWord(pSDLWindow, pWndRenderer, display_word);
printf("一次 ");
break;
}
else
break;
}
default:
break;
}
}
}
SDL_DestroyRenderer(pWndRenderer);
SDL_DestroyWindow(pSDLWindow);
}
然后是调用函数部分:
void sdl_OutWord(SDL_Window* pSDLWindow, SDL_Renderer* pWndRenderer, wchar_t* display_word)
{
SDL_Surface * pTextSurface = NULL;//文本表面
SDL_Texture* pTextTexture = NULL;//文本纹理
int Font_size = 32;
//文本显示区域
SDL_Rect rcText;
rcText.x = 0;
rcText.y = 0;
rcText.w = 0;
rcText.h = 0;
//设置窗口背景色
SDL_SetRenderDrawColor(pWndRenderer, 120, 120, 120, 255);
//用设置的颜色清屏窗口渲染器
SDL_RenderClear(pWndRenderer);
//初始化字体库
if (TTF_Init() == -1)
return;
//打开字体
TTF_Font *font;
font = TTF_OpenFont("data/simsun.ttc", Font_size);
if (!font)
{
printf("TTF_OpenFont: Open simsun.ttf %s\n", TTF_GetError());
return;
}
TTF_SizeUNICODE(font, (const Uint16 *)display_word, &rcText.w, &rcText.h);//计算所需要的显示区域大小
//创建文本表面
SDL_Color color2 = { 255,255,255 };
pTextSurface = TTF_RenderUNICODE_Blended(font, (Uint16*)display_word, color2);
//创建文本纹理
pTextTexture = SDL_CreateTextureFromSurface(pWndRenderer, pTextSurface);
//将文本纹理复制到窗口渲染器
SDL_RenderCopy(pWndRenderer, pTextTexture, NULL, &rcText); // NULL means that use all texture( and renderer)
//刷新窗口渲染器的显示
SDL_RenderPresent(pWndRenderer);
//清理
TTF_CloseFont(font);
TTF_Quit();
SDL_RenderClear(pWndRenderer);
SDL_DestroyTexture(pTextTexture);
SDL_FreeSurface(pTextSurface);
return ;
}
显示效果如下:
当然,这个函数也有弊端,那就是当你缩小显示区域的时候,会发现显示部分超出了显示框,像下面这样:
所以也可以稍作更改,将显示内容做到自动换行,具体效果如下:
至于具体实现,下次有空了再发吧。
关于SDL混合显示中英文标准字体的方式以及SDL显示可能带来的内存泄露相关推荐
- android字体有些显示不正常显示,android系统字体调到超大后显示不全
昨天遇着这样一个Bug,系统设置里把字体设置为超大后并切换为英文模式下,程序中的字体便显示不全. 在这里总结一下,常用解决解决办法有两个: 一.在xml文件里设置字体: 把字体大小从textSize= ...
- ivx中字体显示_html-中文字体在CSS中的显示(Unicode编码)(转载)
为了方便需要的朋友快速使用,下表中列出了一些常用中文字体的Unicode编码: 宋体 SimSun \5B8B\4F53 黑体 ...
- android字体有些显示不正常显示,为什么iconfont字体图标在安卓机上显示不出来
模拟器和ios上都能正常显示,但安卓机上显示不了,准确地说显示为一个带框的X css代码如下: @font-face { font-family: "iconfont"; src: ...
- freetype显示中英文
freetype显示中英文 参考博客: 04.freetype显示中文_//查无此人的博客-CSDN博客_freetype 中文 freetype的安装与使用_explore_world的博客-CSD ...
- MATLAB画图中英文不同字体混合显示标题、坐标轴标签(完美解决方案)
MATLAB是吾等理工狗常用的求生工具.在画图时对中英文标题均支持较好,但学术出版物常常对字体有所要求.对于英文出版物一切好说,设置成相应字体即可.而对于中文出版物.中文毕业论文.报告,则常常需要混合 ...
- matplotlib设置中英文多种字体混合坐标轴名称
在利用matplotlib绘图时,常常需要添加图例与坐标轴名称,而在论文中,对中英文有严格的不同的字体要求,但默认的方法中(如下所示),无法分别为中文.英文指定不同字体(如下图),因此需要借助其他方法 ...
- 通过字体映射 Fontlink 美化中文显示
通过字体映射 Fontlink 美化中文显示 声明:以下均是个人见解,非引战 目前最好的编程字体当属 Fira Code 了,而最好的中文字体当属方正兰亭黑了.在 Fira Code - Github ...
- 中英文怎么算 字符长度_如何将混合了中英文及不同数量空格的文本,快速拆分成多列...
前段时间学员小D咨询到:有什么简便的方法,可以将将混合了中英文及不同数量空格的文本,快速拆分成多列?下图所示是小D的问题: 小D需要将这列数据拆分成如下图所示的4列数据: 刚一开始看到这个表格的时候, ...
- cdr文字内容显示不出来_cdr中字体预览不显示 字体安装后cdr不显示
换了cdr2017,字体在子菜单里显示不出来? 我已经厌倦这个问题快半年了.最后,我自己摸索.找到显示方法.首先打开CDR 017版本.输入字体并选择字体.然后单击[字体列表]在头部顶部显示四个小图标 ...
最新文章
- XenApp_XenDesktop_7.6实战篇之八:申请及导入许可证
- 第三方医药物流的现状及发展
- Web API应用架构设计分析(1)
- 以太网、局域网、互联网区别
- C++前插法实现链表
- SAP Spartacus 最后渲染出的页面和后台 CMS 页面元数据的一一对应
- Python程序生成.exe的可执行文件
- linux修改端口cost值,Linux下通过修改网卡驱动的参数调整Intel网卡的性能
- win10家庭版 安装docker并成功使用
- python批处理将图片进行放大实例代码
- html 进度条roll,js实现增加数字显示的环形进度条效果
- vsan Linux 网络磁盘,理解vSAN中的磁盘空间占用
- jquery 获取同级元素_如何在jQuery中获取元素的同级
- vue3.0 音频插件(vue-aplayer)
- Web渗透测试之信息收集
- 小学教师计算机培训记录内容,中小学教师信息技术培训计划
- VMware使用OVFTool导入虚拟机
- 解决CentOS7 安装后无法识别windows分区问题
- 什么是应届生?要不要签三方?看看就知道了
- Docker:Unable to find image ‘mysql:latest‘ locally