Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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/3/android/202.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 libGDX游戏在Android上崩溃,没有任何日志/错误_Java_Android_Memory Leaks_Libgdx_Crash - Fatal编程技术网

Java libGDX游戏在Android上崩溃,没有任何日志/错误

Java libGDX游戏在Android上崩溃,没有任何日志/错误,java,android,memory-leaks,libgdx,crash,Java,Android,Memory Leaks,Libgdx,Crash,这个问题是在专题社区提出的,但答案是肯定的 没有收到。首先,必须解决这个问题。第二,我 我认为交叉引用是有用的,这样 面对这个问题都能很快找到答案 在Android设备上,libGDX游戏在控制台中没有任何错误的情况下崩溃。它发生在游戏的不同部分,在不同的时间,在不同的屏幕上。我看不出原因。 游戏运行良好,不会冻结。在资源密集型操作(如更改屏幕)下,游戏不会崩溃,但在屏幕加载且玩家玩了一段时间后,游戏已经崩溃。根据RAM使用的图表,内存的使用可能是正常的。CPU也没有过载。 最奇怪的是,当游戏崩

这个问题是在专题社区提出的,但答案是肯定的 没有收到。首先,必须解决这个问题。第二,我 我认为交叉引用是有用的,这样 面对这个问题都能很快找到答案

在Android设备上,libGDX游戏在控制台中没有任何错误的情况下崩溃。它发生在游戏的不同部分,在不同的时间,在不同的屏幕上。我看不出原因。 游戏运行良好,不会冻结。在资源密集型操作(如更改屏幕)下,游戏不会崩溃,但在屏幕加载且玩家玩了一段时间后,游戏已经崩溃。根据RAM使用的图表,内存的使用可能是正常的。CPU也没有过载。 最奇怪的是,当游戏崩溃时,控制台中没有显示错误。 手机屏幕会变黑一段时间,然后系统会在主屏幕上发出信息。手机也不会在应用程序中显示错误消息等。 此外,有时在显示AdMob视频后,游戏会停止响应输入,尽管图形继续工作,但动画仍在工作

起初,我认为这可能是由于AdMob的错误实现造成的。但在AdMob从项目中完全移除后,问题并没有消失

那么什么会导致应用程序出现这种行为呢

这可能是由于
AssetManager
中的某些错误造成的?我想指出的是,我使用了大量纹理(超过170个),打包在一个图集中。atlas中的所有纹理占用4.31MB磁盘空间,“我的所有资产”占用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;
    }

}
还有我的经理:

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静态是个坏主意,但为了方便使用代码中的资源,必须这样做。此外,它仍然从内存中删除,因为我在应用程序关闭时终止了进程

@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
    }
试图在的帮助下捕获内存泄漏。但它没有起作用。日志是空的

告诉我,原因是什么?这是一个非常恼人的问题,它扼杀了我使用游戏的所有乐趣

UPD:Logcat日志(完整):。 游戏包名称:net.dailytoys.afterhecrash(讽刺的是,我理解)

以下是关于此应用程序的崩溃前最后一个日志(为了方便起见,与完整日志分开):


解决了

问题出现在非常频繁的
BitmapFont
生成中。对于每个屏幕,生成了几种字体。我这样做是因为字体大小取决于这些屏幕上某些演员的大小。我不想对字体使用缩放,因为它会破坏质量

即使现在,当我执行
BitmapFont.dispose()
时,仍然会使用过多内存,并且泄漏不会消失。出于这个原因,我认为我需要重新考虑编程图形用户界面的方法


我认为最好的选择是生成大致正确大小的字体,然后缩放它们。

您是否从ADB检查了游戏的跟踪?不是游戏日志,来自android日志?@AbdullahTellioglu您的意思是禁用logcat中的过滤器以查看系统日志,而不仅仅是针对特定应用程序?现在我来做,好主意。是的,我就是这么说的,你也可以使用adb logcat>logcat.txt将日志保存到一个文件中。我希望这有帮助too@AbdullahTellioglu好的,我在帖子中添加了一个UPD。再次检查您是否没有过滤出错误消息。如果没有任何错误消息,游戏不会崩溃。。。
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