这可能看起来很糟糕,我很抱歉,我已经为Playstation 2 for uni写了一些代码.我正在为Graphic Synthesizer编写一种API.我使用的语法类似于openGL,它是一个状态机.
所以输入会像
gsBegin(GS_TRIANGLE);
gsColor(...);
gsVertex3f(...);
gsVertex3f(...);
gsVertex3f(...);
gsEnd();
Run Code Online (Sandbox Code Playgroud)
到目前为止,对于具有确定数量的顶点的线/三角形/四边形,这是很好的,但是像a LINE_STRIP或者TRIANGLE_FAN取一定数量的点.由于时间敏感的性质(这是合理的),因为在这种情况下使用了push_back()方法,因此我被多次警告使用stl容器.
如果没有理由处理未确定数量的情况会更好.目前我有一个可以一次容纳30个顶点的数组,这是处理这种情况的最佳方法吗?
Vector push_back已经分摊了恒定的时间复杂度,因为它以指数方式增加了向量的容量.(我假设你正在使用向量,因为它适用于这种情况.)但是,在实践中,渲染代码对性能非常敏感,因此如果push_back导致向量重新分配,性能可能会受到影响.
您可以通过在添加容量之前保留容量来阻止重新分配.如果你打电话myvec.reserve(10);,你可以保证在向量重新分配之前能够添加10个元素.
但是,这仍然需要提前知道您需要多少元素.此外,如果您创建并销毁许多不同的向量,您仍然需要进行大量的内存分配.相反,只需对所有顶点使用一个向量,然后重复使用它.调用clear()将其返回为空,同时保持其分配的容量.这样你实际上不需要保留任何东西 - 你使用它的前几次它会重新分配和增长,但一旦达到它的峰值大小,它就不需要再重新分配了.关于这个的好处是向量找到它需要的大致大小,一旦它"热身"就没有进一步的分配,所以它是高性能的.
简而言之:
std::vectorpush_back 尽你所能clear().在实践中,这将与C数组一样执行,但没有大小的硬性限制.