代码之家  ›  专栏  ›  技术社区  ›  Moncader

如何解决buffer.put()和android opengl的性能问题

  •  3
  • Moncader  · 技术社区  · 14 年前

    一般来说,这是一个Java问题,尽管在这种情况下,我在OpenGL中使用Android中的顶点数组。要使用这个基本的GL系统,必须在本地分配模式下使用Java的缓冲系统。这在Java上非常慢。大约40-50%的整个应用程序时间都花在buffer.put()中。

    有没有办法在逗留Java的时候加快速度(不使用本机SDK)?

    3 回复  |  直到 14 年前
        1
  •  0
  •   EboMike    14 年前

    一般避免分配。使用一个缓冲池,并在需要时将它们杂耍。您可以有一些标准大小,并在最后浪费几个字节以换取性能。此外,在使用OpenGL时,通常不需要重写每个帧的缓冲区(除非进行大量的蒙皮或动画?)。通常,你有预先烘焙的数组,用矩阵转换对象,就这样。

        2
  •  1
  •   void-pointer    14 年前

    在集成Java和JOGL时,我遇到了类似的问题——我的解决方案是管理C中的缓冲区资源,并使用JNI使用该方法将指针传递给缓存到Java。

    jobject NewDirectByteBuffer(JNIEnv * env, void * address, jlong capacity); 
    

    在jni.h.中找到。当需要将偏移量更新到缓冲区中时,使用反射手动修改java.nio.buffer中的“地址”字段。如果添加更多元素会导致您超过C中缓冲区的容量,请使用C中的数组列表,并将直接缓冲区指向列表的数组备份。

        3
  •  0
  •   Tobias    14 年前

    你唯一能做的就是批量处理你的工作,并希望在电话中的实现是体面的,因为惩罚来自锁定和解锁。如果你成批打电话,司机应该锁定和解锁一次。如果你“自发地”这样做,你将一直锁定和解锁,这将给你一个沉重的性能打击。 如果驱动程序不够聪明,只需将缓冲区映射到RAM中一次,而不是每次调用,那么最好的办法就是简单地最小化看跌期权的数量。