gpt4 book ai didi

java - Android 游戏垃圾收集滞后替代品?

转载 作者:行者123 更新时间:2023-11-30 03:03:52 25 4
gpt4 key购买 nike

我正在为安卓开发一款游戏。而且我注意到,每当垃圾收集器启动时,游戏都会出现大量延迟。

当 App 第一次运行时,所有的对象都被创建并添加到 arrayLists 中,如下所示:

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));
}

Sprite 对象由一个 Bitmap 和几个允许我修改所述 Bitmap 的方法组成。所以在上面的代码中,我将 10 个 Sprites 存储到一个 ArrayList 中。现在在代码的后面,我需要将所述 Sprite 动态生成到我的关卡中。所以我所做的就是:

if (rand == 1) {
branches_available.get(0).image = bToAdd;
branches_available.get(0).xPos = (screenWidth - treeWid - bToAdd
.getWidth()) + bToAdd.getWidth() / 18;
branches_available.get(0).yPos = 0 - bToAdd.getHeight();
branches_available.get(0).height = bToAdd.getHeight();
branches_available.get(0).width = bToAdd.getWidth();
branches.add(branches_available.get(0));
branches_available.remove(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
}
}

因此它们被添加回可用数组,以便在需要时可以在上述方法中再次使用它们。

尽管这样做,我的应用程序仍然存在大量延迟。难道是因为我从数组中删除了对象?

我做错了什么?

谢谢!

最佳答案

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

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

绘制 Sprite 时,最简单的方法是知道偏移量和当前 Sprite 。例如,如果您有一个 500x200 的 Sprite ,它的第一行有 5 帧,第二行有 5 帧(所以 5 列 2 行),并且您知道 Sprite 的进度是从左到右的,所以从 ( 0,0) 到 (5,0) 然后向下 1 然后再从左到右 (1,0) 到 (1,5) 然后回到从 (0,0) 开始,然后你可以创建一个简单的函数会给你你所需要的。

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

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

关于java - Android 游戏垃圾收集滞后替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22135824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com