【问题标题】:What is the best way to draw a large number of lines using openGL and cocos2D?使用openGL和cocos2D绘制大量线条的最佳方法是什么?
【发布时间】:2013-03-31 07:23:45
【问题描述】:

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

【问题讨论】:

    标签: iphone ios objective-c opengl-es cocos2d-iphone


    【解决方案1】:

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

    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

    【讨论】:

    • 我明白 glVertexPointer 和 glDrawArrays 在做什么,但由于某种原因,它仍然不起作用。你还有什么需要做的吗?也许是因为我在 CCDrawNode 中覆盖了 draw(),而您的示例是针对其他不需要额外设置的东西?
    • @GoldenJoe 您还需要启用您正在使用的所有位,至少为glEnableClientState(GL_VERTEX_ARRAY),但一次绘制一条线应该相同。如果库不为您管理,您可能还需要设置当前上下文。
    • 还是不行。处理 cocos2D 的功能可能会更好。
    【解决方案2】:

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

    【讨论】:

    • 我实现了 CCDrawNode,它在某种程度上可以工作。不过,这些线条是抗锯齿且模糊的。有什么解决办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多