List几百、上千W条数据,频繁GC、容易卡死

雕·不懒惰 2020-12-18 11:18:20
Bresenham画线算法
我把每条线的每个点的x,y坐标存到list<Point>里面
最后list的size达到几百W,最大会有1000多W
这就导致频繁GC,容易卡死

最大4K屏 3840*2160
比如 1920*1080*3(RGB),一条RGB线由3条子像素线组成,
相当于屏幕有(1920*3)*1080那么大,在上面的内存区画斜线,每一根斜线只有一个字节的大小,
颜色值是0或者255(黑白),那这条线根据算法画线就有1080个点

new Thread(new Runnable() {
@Override
public void run() {
try {

points.clear();
//lines是所有子像素线的集合: 每条RGB像素线由3条子像素线组成
for (int i = 0; i < lines.size(); i++) {
//画线算法获得每条子像素线点的x,y坐标 执行过程中容易GC
//参数是子像素线起、终2个点的x,y坐标
//Bresenham画线算法获得每个点的x,y坐标
getPXpoint(lines.get(i).getX_start(), lines.get(i).getY_start(), lines.get(i).getX_end(), screen_height);

}

byte赋值 像这样{255,0,0,255,0,0,255,0,0,.........} 会GC
bytes = new byte[screen_width * 3 * screen_height];
for (int i = 0; i < points.size(); i++) {
bytes[points.get(i).getY() * screen_width * 3 + points.get(i).getX()] = (byte) 255;
}

//转ARGB 也会造成GC
if (rgbaColor != null)
rgbaColor = null;
rgbaColor = new int[screen_width * screen_height];
int k = 0;
while (k < screen_width * 3 * screen_height) {

rgbaColor[k / 3] = (255 & 0xff) << 24 | (bytes[k] & 0xff) << 16 | (bytes[k + 1] & 0xff) << 8 | (bytes[k + 2] & 0xff);
k += 3;
}
//config rgba
if (bitmap != null)
bitmap = null;
bitmap = Bitmap.createBitmap(rgbaColor, screen_width, screen_height, Bitmap.Config.ARGB_8888);
...全文
248 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧