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

rso*_*onx 1 c++ sdl-ttf sdl-2

我正在构建一个 6502 模拟器,我希望以可视方式表示 cpu 和内存状态。
我正在使用 SDL2 来实现此目的。当 6502 cpu 或内存改变状态时,我必须在 SDL 窗口上渲染文本。

即我希望以文本和数字的形式显示整个内存内容、当前正在执行的指令、先前的CPU状态、当前的CPU状态。

这是我尝试使用 Linux 系统中已有的字体来呈现文本。后来我希望渲染动态文本和数字而不是静态字符串。

#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();
}
Run Code Online (Sandbox Code Playgroud)

这是输出

在此输入图像描述

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

use*_*240 7

SDL2_ttf 有几种不同的文本渲染模式。

您正在使用文档Solid描述为“快速而肮脏”的模式:

渲染模式分为三种:

  • 固体快速而肮脏

    创建 8 位调色板表面并使用给定字体和颜色以快速质量渲染给定文本。像素值 0 是 colorkey,在位块传送时给出透明背景。像素和颜色图值 1 设置为文本前景色。这允许您更改颜色而无需再次渲染文本。当位图传输到另一个表面时,调色板索引 0 当然不会绘制,因为它是色键,因此是透明的,尽管它的实际颜色是 255 减去前景色的每个 RGB 分量。这是所有渲染模式中最快的渲染速度。这会导致文本周围没有框,但文本不那么平滑。生成的表面应该比混合表面更快。使用此模式进行 FPS 和其他快速变化的更新文本显示。

  • 阴影缓慢而美好,但有一个坚固的盒子

    创建 8 位调色板化表面,并使用给定的字体和颜色以高质量渲染给定的文本。0像素值是背景,而其他像素具有不同程度的前景色和背景色。这会在前景色文本周围产生一个背景色框。文本已消除锯齿。这将比实体渲染速度慢,但与混合模式的渲染时间大致相同。一旦制作完成,生成的表面应该与实体一样快。当您需要漂亮的文本并且可以使用盒子时,请使用此功能。

  • 混合慢慢慢,但在另一张图像上非常好

    创建 32 位 ARGB 表面并以高质量渲染给定文本,使用 Alpha 混合以给定颜色抖动字体。这会产生具有 Alpha 透明度的表面,因此文本周围不会有纯色框。文本已消除锯齿。这将比实体渲染速度慢,但与着色模式的渲染时间大致相同。生成的表面将比使用“实体”或“着色”时的位块传送速度慢。当您想要高质量并且文本变化不太快时,请使用此选项。

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

另请注意,您几乎肯定希望使用TTF_RenderUTF8函数系列来确保正确呈现非拉丁字符。(这可能与您的 6502 模拟器没有直接关系,但它不会造成伤害,并且无论如何都是一个很好的做法。)更多信息:https: //wiki.libsdl.org/SDL_ttf/TTF_RenderUTF8_Blished