2

我有一系列 2d 顶点代表用于绘制网格的线。大约有 900 条线段要绘制(网格使用弹簧物理来扭曲,这就是为什么我不只为每一行和每一列画一条线)。cocos2D 内置了一个 ccDrawLine 函数,可以很好地绘制,但我认为这可能效率低下,因为它为每个线段调用 glDrawArrays。如何高效地绘制大量线段?作为奖励,请推荐使用 openGL 的良好 2D 绘图实践的来源。

4

2 回答 2

6

OpenGL 中的高效绘图意味着发送最少的信息和尽可能少的信息批次。与所有事情一样,这取决于情况,您应该尝试各种事情并针对您的情况进行基准测试。但根据经验,最有效的方法(如果顶点是静止的)是将顶点存储在卡上一次(在缓冲区中)并渲染多次,其次最好(当它有意义时)是使用几何着色器生成卡上最多的顶点,次优是一次发送所有顶点,次优是批量发送,最后最坏的是一次发送一个。

900 确实不是很多,而且听起来缓冲区或着色器在这种情况下没有意义。

要批量发送,您需要将顶点放入顺序内存中,例如:

float coords[] = { 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0 };

(即 x1、y1、x2、y2 等。您可能想要 malloc 一些内存,以便它可以是可变长度)

然后你把它发送到 OpenGL 并渲染它:

glVertexPointer( 2, GL_FLOAT, 0, coords ); // 2 = dimensions
glDrawArrays( GL_LINES, 0, 4 ); // 4 = number of points, => 2 lines

GL_LINES将从 1 到 2、3 到 4 等画一条线。还有很多其他选项。记忆力可以稍微宽松一点;如果需要,请查看stride参数(上面的 0)。这是文档:

http://www.opengl.org/sdk/docs/man2/xhtml/glVertexPointer.xml

http://www.opengl.org/sdk/docs/man2/xhtml/glDrawArrays.xml

于 2013-03-31T07:57:39.217 回答
3

Cocos2d 2.0 有CCDrawNode批量绘制图元(线、圆、..)。

于 2013-03-31T08:34:43.277 回答