- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
This question was asked in the thematic community, but the answer was not received. First, it is necessary to solve the problem. Secondly, I think it will be useful to make cross-references so that people who are faced with this problem can quickly find the answer. Question in the thematic community
libGDX 游戏在 Android 设备的控制台中崩溃且没有任何错误。它发生在游戏的不同部分、不同时间的不同屏幕上。我不明白原因。游戏运行良好,不卡顿。游戏不会在更换屏幕等资源密集型操作下崩溃,但在加载屏幕并且玩家玩了一会儿时就已经崩溃了。根据 RAM 使用图表,内存的使用可能是正常的。 CPU 也没有过载。 最奇怪的是,当游戏崩溃时,控制台中没有显示任何错误。手机屏幕变黑了一会儿,然后系统在主屏幕上发出。手机也没有显示应用程序中的错误消息等。此外,有时在显示 AdMob 视频后,游戏会停止响应输入,但图形和动画仍在运行。
起初,我认为这可能是由于 AdMob 的实现不正确所致。但是在从项目中完全移除 AdMob 之后,问题并没有消失。
什么会导致应用程序出现这种行为?
也许这是由于 AssetManager
中的一些错误?我想指出,我使用了大量的纹理(超过 170 个),打包在一个图集中。 atlas 中的所有纹理占用 4.31MB 磁盘空间,我的所有 Assets 占用 6.2MB。我在游戏初始加载期间使用 AssetManager
加载的所有资源。
所以,我的Res 类:
public class Res {
public static final String LOCALE_BUNDLE_PATH = "i18n/locale";
public static final String MAIN_ATLAS_PATH = "packs/main/MAIN.atlas";
public static final String MUSIC_M3_THEME_PATH = "music/atc_m3_theme.mp3";
public static final String KICK_SOUND_PATH = "music/atc_kick.mp3";
public static final String FADEIN_SOUND_PATH = "music/atc_fadein.mp3";
public static final String DRAG_START_SOUND_PATH = "music/atc_drag_start.mp3";
public static final String DRAG_STOP_SOUND_PATH = "music/atc_drag_stop.mp3";
public static final String FONT_REGULAR_PATH = "fonts/comfortaa_regular.ttf";
public static final String FONT_LIGHT_PATH = "fonts/comfortaa_light.ttf";
public static final String RUSSO_ONE_REGULAR = "fonts/russo_one_regular.ttf";
public static TextureAtlas MAIN_ATLAS;
public static I18NBundle LOCALE;
/* MUSIC & SOUNDS */
public static Music M3_THEME;
public static Sound KICK_SOUND;
public static Sound FADE_IN_SOUND;
public static Sound DRAG_START_SOUND;
public static Sound DRAG_STOP_SOUND;
private Res () {
MAIN_ATLAS = null;
}
}
还有我的 ResManager:
public class ResManager extends AssetManager {
public void loadResources () {
load(Res.MAIN_ATLAS_PATH, TextureAtlas.class);
load(Res.MUSIC_M3_THEME_PATH, Music.class);
load(Res.KICK_SOUND_PATH, Sound.class);
load(Res.FADEIN_SOUND_PATH, Sound.class);
load(Res.DRAG_START_SOUND_PATH, Sound.class);
load(Res.DRAG_STOP_SOUND_PATH, Sound.class);
load(Res.LOCALE_BUNDLE_PATH, I18NBundle.class);
finishLoading();
Res.MAIN_ATLAS = get(Res.MAIN_ATLAS_PATH, TextureAtlas.class);
Res.M3_THEME = get(Res.MUSIC_M3_THEME_PATH, Music.class);
Res.KICK_SOUND = get(Res.KICK_SOUND_PATH, Sound.class);
Res.FADE_IN_SOUND = get(Res.FADEIN_SOUND_PATH, Sound.class);
Res.DRAG_START_SOUND = get(Res.DRAG_START_SOUND_PATH, Sound.class);
Res.DRAG_STOP_SOUND = get(Res.DRAG_STOP_SOUND_PATH, Sound.class);
Res.LOCALE = get(Res.LOCALE_BUNDLE_PATH, I18NBundle.class);
}
}
我知道在 Android 生态系统中做 TextureAtlas static 是个坏主意,但为了方便在代码中使用资源,必须这样做。此外,它仍然从内存中删除,因为我在应用程序关闭时终止了进程。
@Override
protected void onDestroy() {
android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();
}
此外,我正确地处理了所有屏幕,显然将 GC 指向他应该收集的不必要的对象。例如:
@Override
public void dispose() {
stage.dispose(); // Stage
loadingPane = null; // Group
multiplexer = null; // InputMultiplexer
firstScreen.destroy(); // Group
secondScreen.destroy(); // Group
firstScreen = null;
secondScreen = null;
bgSky = null; // Image
ground = null; // Image
dialogCircuit = null; // Group
dialogModule = null; // Group
dialogNotEnough = null; // Group
}
尝试在 LeakCanary 的帮助下捕获内存泄漏。但它没有用。日志为空。
告诉我,可能是什么原因?一个非常烦人的问题,它扼杀了使用我的游戏的所有乐趣。
UPD: Logcat 日志(完整):logs。游戏包名:net.dailytoys.afterthecrash(讽刺的是,我明白了)
以下是崩溃前的最后一个日志,关于此应用程序(为方便起见,与完整日志分开):
03-19 17:18:05.198 811-907/? W/InputDispatcher: channel 'ec9957f net.dailytoys.afterthecrash/net.dailytoys.afterthecrash.AndroidLauncher (server)' ~ Consumer closed input channel or an error occurred. events=0x9
03-19 17:18:05.198 811-907/? E/InputDispatcher: channel 'ec9957f net.dailytoys.afterthecrash/net.dailytoys.afterthecrash.AndroidLauncher (server)' ~ Channel is unrecoverably broken and will be disposed!
03-19 17:18:05.213 811-1587/? I/WindowState: WIN DEATH: Window{ec9957f u0 net.dailytoys.afterthecrash/net.dailytoys.afterthecrash.AndroidLauncher}
03-19 17:18:05.217 811-1587/? W/InputDispatcher: Attempted to unregister already unregistered input channel 'ec9957f net.dailytoys.afterthecrash/net.dailytoys.afterthecrash.AndroidLauncher (server)'
03-19 17:18:05.223 811-1251/? I/ActivityManager: Process net.dailytoys.afterthecrash (pid 482) has died
03-19 17:18:05.257 811-1251/? W/ActivityManager: Force removing ActivityRecord{19f34039 u0 net.dailytoys.afterthecrash/.AndroidLauncher t3820}: app died, no saved state
03-19 17:18:05.258 811-1587/? W/WindowManager: Force-removing child win Window{19cfd5d7 u0 SurfaceView} from container Window{ec9957f u0 net.dailytoys.afterthecrash/net.dailytoys.afterthecrash.AndroidLauncher}
03-19 17:18:08.565 11009-11046/? D/IconCache: net.dailytoys.afterthecrash
03-19 17:18:08.566 11009-11046/? W/PackageManager: Failure retrieving resources for net.dailytoys.afterthecrash: Resource ID #0x0
03-19 17:18:09.454 11009-11009/? D/IconCache: net.dailytoys.afterthecrash
03-19 17:18:09.456 11009-11009/? W/PackageManager: Failure retrieving resources for net.dailytoys.afterthecrash: Resource ID #0x0
最佳答案
已解决!
问题出在非常频繁的 BitmapFont
生成中。对于每个屏幕,都会生成几种字体。我这样做是因为字体大小取决于这些屏幕上某些 Actor 的大小。我不想对字体使用比例,因为它会破坏质量。
即使是现在,当我执行 BitmapFont.dispose()
时,仍然会使用太多内存,并且泄漏不会消失。出于这个原因,我认为我需要重新考虑我对图形用户界面进行编程的方法。
我认为最好的选择是生成大小合适的字体,然后缩放它们。
关于java - libGDX 游戏在 Android 上崩溃,没有任何日志/错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49360635/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!