Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android游戏垃圾收集滞后的替代方案?_Java_Android_Arrays_Arraylist_Bitmap - Fatal编程技术网

Java Android游戏垃圾收集滞后的替代方案?

Java Android游戏垃圾收集滞后的替代方案?,java,android,arrays,arraylist,bitmap,Java,Android,Arrays,Arraylist,Bitmap,我正在为android创建一个游戏。我注意到每当垃圾收集器启动时,游戏都会经历大量的延迟 首次运行应用程序时,将创建所有对象并将其添加到ArrayList中,如下所示: br1 = ImgLoader.getResizedBitmap(BitmapFactory.decodeResource( context.getResources(), R.drawable.branchfl, MainActivity.opt), MainActivity.h

我正在为android创建一个游戏。我注意到每当垃圾收集器启动时,游戏都会经历大量的延迟

首次运行应用程序时,将创建所有对象并将其添加到ArrayList中,如下所示:

br1 = ImgLoader.getResizedBitmap(BitmapFactory.decodeResource(
            context.getResources(), R.drawable.branchfl, MainActivity.opt),
            MainActivity.height / 12, MainActivity.width / 6);

for (int i = 0; i < 10; ++i) {
        branches_available.add(new Sprite("Branch", br1, 0, 0));
    }
这将从第一个数组中获取对象并将其添加到第二个数组中。在draw方法中,仅绘制第二个arrayList。现在,当对象离开屏幕时,我执行以下操作:

branchesSize = branches.size();
    for (int i = 0; i < branchesSize; ++i) {
        branches.get(i).move(0, speed);

        if (branches.get(i).yPos > screenHeight) {
            branches_available.add(branches.get(i));
            branches.remove(i);
            i--;
            branchesSize -= 1;
            // System.gc(); // Force Garbage Collection
        }
    }
branchesSize=branchs.size();
对于(int i=0;i屏幕高度){
branchs_可用。添加(branchs.get(i));
删除(i);
我--;
分枝大小-=1;
//System.gc();//强制垃圾收集
}
}
因此,它们被添加回可用数组中,以便在需要时可以在上述方法中再次重用

尽管如此,我的应用程序仍然有很大的滞后。可能是因为我正在从数组中删除对象吗

我做错了什么

谢谢大家!

尝试使用
HashMap
并对其进行初始化,使每个图像都有一个键,并将该键设置为图像名称。然后创建一个函数,您可以在其中使用键请求图像,该函数将在地图中查找图像。如果键处的位图为空,则加载位图并将其设置为键。需要时,可以使用迭代器在hashmap上迭代。每次加载位图时,通过将新位图的大小添加到成员字段来跟踪贴图中所有位图的大小。当所有位图的总大小开始接近您设置的阈值时,找出一种方法来选择此时不再需要的位图,然后调用bitmap.recycle,将该键处的值设置为null,从所有位图的总大小中减去删除的位图的大小,并通知垃圾收集器

这将解决阵列列表的一些性能问题,并有助于尽快清理内存。棘手的事情将是决定要发布哪些位图,如果您愿意,在需要之前预测或知道:哪些位图要进入内存

绘制精灵时,最简单的方法是了解偏移和当前精灵。例如,如果您有一个500x200的精灵,第一行有5帧,第二行有5帧(因此有5列2行),并且您知道精灵的前进方向是从左向右,从(0,0)到(5,0),然后向下1,再从左向右(1,0)到(1,5),然后返回到(0,0)开始,然后你可以创建一个简单的函数来满足你的需要

在OpenGL和Canvas中,我都能够根据当前帧使用偏移量来计算整个位图的哪个部分要绘制,因此,我在任何时候内存中都不会有超过1个位图副本,即使屏幕上有100个使用它的对象


最后,正如我之前在评论中所说的,您将希望尽可能减小所有sprite表的大小。

我相信这就是某些游戏开发人员以本机方式编写(如果在Android上,则通过JNI)的原因,因此他们可以手动控制垃圾收集。有一些设计可以帮助解决这个问题,但不能完全减轻影响。这里有两个有用的链接:和。谢谢你的链接。但是我已经广泛地研究了这两个源代码,并将它们应用到我的代码中。我的游戏(市面上有两个,一个使用画布,一个使用OpenGL),我有一个声音管理器,对于画布构建的游戏,我有一个位图/精灵管理器。这将调用Bitmap.recycle&system..gc通知java尽快收集垃圾。在位图上,我希望在一段时间内完成,并将我最需要的位图保留在内存中。如果位图已被回收,接下来我需要它,我将重新加载它。其他要做的事情是优化您的精灵表,使其尽可能小(内存方面)。上面我也说java中的C++完全不可能。镜像用户2046264的注释:你确定这是GC吗?名单有多大?从
ArrayList
中删除元素是
O(n)
,由于您是在
n
上循环执行此操作,因此
ArrayList的
O(n^2)
性能(较慢)。您可以考虑使用<代码>链接目录< /COD>使用<代码>迭代器.ReleVIEW(< /代码>)来获得<代码> O(1)< /C>删除操作:
branchesSize = branches.size();
    for (int i = 0; i < branchesSize; ++i) {
        branches.get(i).move(0, speed);

        if (branches.get(i).yPos > screenHeight) {
            branches_available.add(branches.get(i));
            branches.remove(i);
            i--;
            branchesSize -= 1;
            // System.gc(); // Force Garbage Collection
        }
    }