我正在尝试创建一个允许用户输入文本的编辑框。我一直在研究这个问题已经有一段时间了,并且已经抛弃了不同的想法。最终,我认为能提供最佳性能的是将.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等)...我理解它与位宽和字节序有关但我对平台之间的界面差异和所说的含义相对较少了解我的代码的字节顺序。
谢谢
答案 0 :(得分:1)
g-makulik所说的可能是正确的。地图可能就是您所追求的。要扩展回复,地图会根据键(在本例中为char)自动排序,因此基于角色的查找非常快速
CharTexture* pCharTexture = PooPointers[char];
如果你想要一个稀疏的数据结构,你不需要为每个字符预定义纹理。
请注意,运行上面不存在条目的代码将在地图中创建默认条目。
根据您的一般需求,如果广义排序不重要或您知道您将始终拥有固定数量的字符,您也可以使用简单的向量。您可以使用每个可能字符的预定义数据填充向量。
这一切都取决于你的记忆要求。
答案 1 :(得分:1)
你可能想要的是
std::map<char,CharTexture*> PooPointers;
使用数组访问操作符也会在场景后面的地图中使用一些搜索,但已经过优化。