通过char快速访问glpyh纹理的数据结构

Data structure for quick access to glpyh textures via char

本文关键字:纹理 数据结构 glpyh 访问 char 通过      更新时间:2023-10-16

我正在尝试创建一个允许用户输入文本的编辑框。我已经为此工作了一段时间,并提出了不同的想法。最终,我认为提供最佳性能的方法是将.ttf中的所有角色(我使用SDL为openGL管理事件、窗口、文本和图像)加载到它们自己的曲面上,然后将这些曲面一次性渲染到纹理上。然后每一帧,我可以在适当的位置绑定一个适当的纹理。

然而,现在我正在考虑如何访问这些字形。我有限的bkg会说这样的话:

struct CharTextures {
    char glpyh;
    GLuint TextureID;
    int Width;
    int Height;
    CharTextures* Next;
}
//Code
CharTexture* FindGlyph(char Foo) {
    CharTextures* Poo = _FirstOne;
    while( Poo != NULL ) {
        if( Foo == Poo->glyph ) {
              return Poo;
        }
        Poo = Poo->Next;
     }
     return NULL;
}

我知道这会奏效的。然而,每次迭代整个列表似乎非常浪费。我的脚本编写经验教会了我一些lua,它们在lua中有允许各种类型的无序索引的表。我怎么能在C++中模仿它,这样我就可以做一些事情,比如:

CharTexture* FindGlyph(char Foo) {
    return PooPointers[Foo]; //somehow use the character as a key to get pointer to glyph without iteration
}

我想我可以尝试转换为数值,但我不知道如何将char转换为UTF8值,以及是否可以将其用作键。我可以转换成ascii,但它能处理我想要键入的所有字符吗?我正试图让这个应用程序在mac和windows上运行,但不确定机器的具体情况。我读过不同格式的差异(ascii v unicode v utf8 v utf16等)。。。我知道这与位宽和字节序有关,但我对平台之间的接口差异以及所述字节序对我的代码的影响了解相对较少。

感谢

您可能想要的是

 std::map<char,CharTexture*> PooPointers;

使用数组访问操作符也会使用一些在地图后面搜索的场景,但是经过了优化。

g-makulik所说的可能是对的。这张地图可能就是你想要的。为了扩展回复,地图会根据关键字(本例中为char)自动排序,因此使用可以非常快速地根据字符进行查找

CharTexture* pCharTexture = PooPointers[char];

如果您想要一个稀疏的数据结构,而不是预先定义每个角色的纹理。

请注意,在不存在条目的地方运行上面的代码将在映射中创建一个默认条目。

根据您的一般需求,如果广义排序不重要,或者您知道总是有固定数量的字符,您也可以使用简单的向量。可以为每个可能的字符使用预定义的数据填充矢量。

这完全取决于你的内存需求。