【发布时间】:2013-12-05 04:02:04
【问题描述】:
在视频游戏中,资源以步进方式加载是很常见的,因此在单个线程中,加载栏可以在每个加载步骤中更新。举例:
1 -> 加载纹理 A
2 -> 将加载条更新为 2%
3 -> 加载纹理 B
4 -> 将加载条更新为 4%
5 ...
这可以通过多种方式完成。其中之一是为每个加载步骤定义一个函数。
void LoadTextureA()
{
//Loading routine
...
}
这具有可读性的优势,不需要太多的嵌套代码,甚至在某些情况下可以在两个游戏状态之间共享加载例程。
现在我的想法是用模板概括这种“功能换步”模型。让我们说。
template <int S>
struct Foo{
void LoadingStep()
{
}
};
template <>
struct Foo<0>
{
void LoadingStep()
{
//First loading step
...
}
};
如果我错了,请纠正我。但似乎我可以使用元编程在编译时迭代 0 .. 到 N 个步骤,并将这个专门的函数分配给函数指针的数组或向量。 N 个步骤在编译时与它各自的功能一起是已知的。 函数指针向量将像这样迭代:
template <int Steps>
class Loader {
public:
bool Load()
{
functionArray[m_step]();
if (++m_step == Steps)
return false; //End loading
else
return true;
}
private:
int m_step;
}
这可能吗?我知道这是更简单的方法。但除了项目要求之外,这是一个有趣的编程挑战
【问题讨论】:
-
是的,这正是我想要的。谢谢
-
你为什么不只拥有一个函数指针数组或
std::functions,计算它的大小,并对内容进行简单的运行时循环,更新每个函数指针之间的进度条加载?甚至是资源名称数组,只需调用“加载资源”函数?
标签: c++ templates metaprogramming generic-programming