首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何提高SDL ttf中的字体质量并动态显示文本和数字

如何提高SDL ttf中的字体质量并动态显示文本和数字
EN

Stack Overflow用户
提问于 2020-02-12 05:06:25
回答 1查看 1.9K关注 0票数 0

我正在构建一个6502仿真器,我希望直观地表示cpu和内存状态。

我正为此目的使用SDL2。当6502 cpu或内存更改状态时,我必须在SDL窗口上呈现文本。

也就是说,我希望以文本和数字的形式显示整个内存内容、正在执行的当前指令、以前的cpu状态、当前cpu状态。

下面是我使用linux系统中已经存在的字体呈现文本的尝试。稍后,我希望呈现动态文本和数字,而不是静态字符串。

代码语言:javascript
运行
复制
#include<SDL2/SDL.h>
#include<SDL2/SDL_ttf.h>
#define SCREEN_HEIGHT 640
#define SCREEN_WIDTH 480
int quit=false;
SDL_Window *window;
SDL_Renderer *renderer;
int initializeDrawing(int argc,char** argv){
    if (SDL_Init(SDL_INIT_VIDEO) != 0){
        std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return 1;
    }
    window = SDL_CreateWindow("6502 cpu display!", 100, 100, SCREEN_HEIGHT, SCREEN_WIDTH, SDL_WINDOW_SHOWN);
    if (window == nullptr){
        std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return 1;
    }
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (renderer == nullptr){
        SDL_DestroyWindow(window);
        std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return 1;
    }
    if (TTF_Init() != 0){
        SDL_Quit();
        return 1;
    }
    return 0;
}
void loop(){
    TTF_Font* Sans = TTF_OpenFont("./ttf/LH.ttf", 13);
    SDL_Color White = {255,255,255};
    SDL_Surface* surfaceMessage = TTF_RenderText_Solid(Sans, "0xABCEDFGHIJKLMNOPQRSTUVWXYZ", White);
    SDL_Texture* Message = SDL_CreateTextureFromSurface(renderer, surfaceMessage);

    SDL_Rect Message_rect;
    Message_rect.x = 0;
    Message_rect.y = 0;
    Message_rect.w = surfaceMessage->w;
    Message_rect.h = surfaceMessage->h;

    //loop
    SDL_Event e;
    while(!quit){
        SDL_PollEvent(&e);
        //If user closes the window
        if (e.type == SDL_QUIT){
            quit = true;
        }
        //First clear the renderer
        SDL_RenderClear(renderer);
        //Draw the texture
        SDL_RenderCopy(renderer, Message, NULL, &Message_rect);
        //Update the screen
        SDL_RenderPresent(renderer);
        //Take a quick break after all that hard work
    }
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
}

这是输出

  1. 我希望使案文更小、更流畅。
  2. 我正在寻找关于如何有效地显示数字和文本动态的想法。
EN

回答 1

Stack Overflow用户

发布于 2020-02-18 10:10:49

SDL2_ttf有几种不同的文本呈现模式。

您正在使用模式Solid文献资料将其描述为“快速和肮脏”:

渲染有三种方式:

  • 实心:Quick 创建一个8位的调色板表面,并以给定的字体和颜色快速呈现给定的文本。像素值0是彩色键,在闪现时提供透明的背景。像素和彩色映射值1设置为文本前景色。这允许您更改颜色,而不必再次渲染文本。调色板索引0当然不是绘制在另一个表面时,因为它是彩色键,因此是透明的,尽管它的实际颜色为255减去前景颜色的每个RGB组件。这是所有渲染模式中最快的渲染速度。这导致文本周围没有方框,但文本不那么流畅。产生的表面应该比混合曲面更快。将此模式用于FPS和其他快速更改的文本显示。
  • 阴影:Slow和Nice,但带有实心盒 创建一个8位的调色板表面,并用给定的字体和颜色呈现高质量的给定文本。0像素值为背景,而其他像素具有不同程度的前景色与背景颜色。这将在前景色中的文本周围形成一个背景色框。文本是反别名的。这将呈现慢于实心,但在大约相同的时间混合模式。产生的表面应该与实心一样快,一旦制造出来。当你需要一个很好的文本,并且可以和一个盒子一起生活时,就用这个。
  • 混合:慢,但超好于另一个图像 创建一个32位的ARGB表面,并以高质量呈现给定的文本,使用alpha混合使字体与给定的颜色抖动。这就产生了一个带有alpha透明度的表面,所以在文本周围没有一个固定的彩色框。文本是反别名的。这将呈现慢于实心,但在大约相同的时间阴影模式。生成的表面将比使用实心或阴影的情况下更慢。当你想要高质量的时候使用这个,并且文本变化不会太快。

如果您想要更高质量的呈现,您应该尝试*_Shaded*_Blended函数。

还请注意,您几乎肯定希望使用TTF_RenderUTF8系列函数来确保非拉丁字符的正确呈现。(这可能与您的6502仿真器没有直接关系,但它并不有害,也是很好的做法。)更多信息:混和

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60181474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档