【问题标题】:Rotate individual polygons in an Open GL vertex array?在 Open GL 顶点数组中旋转单个多边形?
【发布时间】:2011-04-17 14:53:42
【问题描述】:

我正在使用 OpenGL ES 开发一款适用于 Android 的游戏,但遇到了性能问题。

我正在尝试做的事情:我在屏幕上有一堆对象,它们都共享相同的网格,但都有各自的旋转和平移。你可以把它比作小行星,在屏幕上有一堆小行星在移动。

实际问题:我的性能受到了影响,因为我单独旋转和平移每个对象,并且发送顶点数组的开销与顶点数量(数十个)相比太大每个对象)。

我能做什么?我想到的一种解决方案是自己更新软件中的顶点,然后再将它们放入顶点缓冲区。这可能会为我节省一些开销,但这似乎违反直觉。

请分享您可能有的任何想法或建议!谢谢!

【问题讨论】:

    标签: android performance opengl-es vertex-buffer


    【解决方案1】:

    “发送顶点数组的开销”似乎暗示您没有为顶点/索引使用服务器端缓冲区。如果是这种情况,请查看 GLES 1.1 规范的第 2.9 节“缓冲区对象”。

    当然,即使您使用服务器端缓冲区,足够多的小型glDrawElements 调用也很容易成为性能瓶颈。

    如果你所有的对象都是静态的,你可以只预先转换它们并支付 Nx 服务器上的内存。

    如果您的对象是动态的,事情就会变得更加棘手。 “实例化”绘图(例如,参见 Direct-X 的 DrawInstanced)可能会有所帮助,但我不相信 GLES 有类似的东西(“实例化”绘图也会在静态情况下节省内存)。

    使用 GLES 2.0,您可以尝试以下操作:

    • 将 M 个网格副本放入顶点缓冲区,为每个顶点赋予一个附加属性,即副本的索引
    • 在顶点着色器中,从统一数组中加载变换矩阵(或其中的一部分,如果其中一些是固定的),由附加属性索引

    然后您可以进行 N/M 个glDrawElements 调用,每次都在统一数组中设置 M 个矩阵。目前尚不清楚这实际上是否会更快,因为(一方面)硬件必须更努力地工作(索引制服不是超级便宜)。另外,我认为在 GLES 1.1 中不可能有这样的事情。

    【讨论】:

    • 谢谢,我读过一些关于缓冲区对象的文章,如果/当对象数量增加时,这可能是前进的方向。感谢您的详尽解释和反馈!
    猜你喜欢
    • 2014-02-08
    • 2011-10-22
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多