【问题标题】:Data structure for quick access to glpyh textures via char通过 char 快速访问 glpyh 纹理的数据结构
【发布时间】:2013-07-07 16:52:49
【问题描述】:

我正在尝试创建一个允许用户输入文本的编辑框。我已经为此工作了一段时间,并且已经提出了不同的想法。最终,我认为提供最佳性能的方法是将 .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 等)......我知道它与位宽和字节序有关,但我对平台之间的接口差异和所说的含义知之甚少我的代码的字节序。

谢谢

【问题讨论】:

    标签: c++ pointers data-structures utf-8 ascii


    【解决方案1】:

    你可能想要的是

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

    使用数组访问操作符也会在后台使用一些地图搜索,不过已经优化了。

    【讨论】:

      【解决方案2】:

      g-makulik 说的可能是对的。地图可能就是您所追求的。为了扩展回复,地图会根据键(在本例中为 char)自动排序,因此使用

      基于字符的查找非常快速
      CharTexture* pCharTexture = PooPointers[char];
      

      如果您想要一个不为每个字符预定义纹理的稀疏数据结构。

      请注意,在不存在条目的情况下运行上面的代码将在地图中创建一个默认条目。

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

      这完全取决于您的内存要求。

      【讨论】:

      • 迈克尔!也许你应该先开始问关于 SO 的问题,或者在开始回答自己之前至少在这里阅读很多答案。
      • 所以像 std::map 这样的东西可以做到。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多