频繁调用GLES20.glTexSubImage2D导致内存撑满问题

现象

在频繁调用以下GLES20.glTexSubImage2D函数时,

public static native void glTexSubImage2D(
        int target,
        int level,
        int xoffset,
        int yoffset,
        int width,
        int height,
        int format,
        int type,
        java.nio.Buffer pixels
    );

会出现内存撑满的现象。

假如连续调用100次,内存就会被撑满。这时,如果调用到99次后就结束,现象是,内存会自动掉下来,会恢复到原来的内存值。

另外,当内存增长时,使用Android Studio 、 malloc debug等方法工具都无法抓到或者看到内存增长的地方,使用adb shell top命令会看到RES 、 SHR、MEM不断增长,知道内存饱满,当前应用被KILL调。

从以上现象可以得出,应该不是自己写的JAVA层代码或者Native层代码导致的内存没及时回收问题。但是初步可以确认是内存没及时回收问题。

问题定位过程

这一类内存增长,使用Android Studio 和 adb shell top命令是捕捉不到的,这就造成排查困难的问题。最后笔者是采用一条条注释代码的方法,最后定位到了问题。

解决方案

在调用GLES20.glTexSubImage2D函数之后,调用GLES20.glFinish();函数。
例如:

GLES20.glTexSubImage2D(GL_TEXTURE_2D, 0, textureLeft, textureTop,width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
GLES20.glFinish();

GLES20.glFinish();函数官网注释

glFinish does not return until the effects of all previously called GL commands are complete. Such effects include all changes to GL state, all changes to connection state, and all changes to the frame buffer contents.

大概含义是:glFinish返回前,会确保所有GL命令已经被执行完成。
包含所有GL状态、所有状态间的变化、所有 frame buffer 内容的改变。

来自:https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glFinish.xml

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值