在Android上将Libgdx游戏加载到片段中会显示黑屏

4
以下代码展示了我如何将一个Libgdx游戏(MyGdxGame)加载到LinearLayout中。在游戏创建时,我设置了一个相机并加载了一个小的wav音频文件。纹理在视图加载后加载。
问题是在片段转换到此片段期间,会出现明显的黑色闪烁和延迟。是否有可能减少这种情况并改善片段转换。
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = null;
    Bundle bundle = getArguments();
    if (bundle != null) {
        this.input = bundle.getParcelable(Utils.FRAGMENT_INPUT_KEY);
    } else {
        input = new FragmentInput();
    }

    view = inflater.inflate(R.layout.solve, container, false);
    surface = (LinearLayout) view.findViewById(R.id.puzzleView);

    activity = (MainActivity) getActivity();

    com.badlogic.gdx.graphics.Color color = new com.badlogic.gdx.graphics.Color(Color.red(input.backColor) / 255f,
            Color.green(input.backColor) / 255f,
            Color.blue(input.backColor) / 255f, 1.0f);
    size = input.pieceCount;
    cols = input.columns;
    GameData gdata = new GameData();
    gdata.rows = size / cols;
    gdata.columns = cols;
    gdata.backColor = color;
    gdata.setCategory(input.category);
    if (input.rotated) {
        gameView = new MyGdxGameRotate(this, gdata);
    } else {
        gameView = new MyGdxGame(this, gdata);
    }

    if (surface != null) {
        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        View game = initializeForView(gameView, config);
        surface.addView(game);
    }
    return view;
}

你在游戏中使用设备相机和Camera1 API吗? - Thracian
你的Activity是否实现了AndroidFragmentApplication.Callbacks接口? - Thracian
是的,我已经实现了没有主体的exit()。然后我在Android端使用设备相机进行一些功能,但不在Libgdx端。 - pats
即使我将繁重的工作延迟到片段视图之后,它仍然显示黑色闪屏。我认为这与AndroidFragmentApplication的实现有关。 - pats
2个回答

1
我不熟悉Libgdx,所以我的观察结果并不特定于Libgdx。如果视图初始化需要时间,并且假设它必须在UI线程上完成,那么您可以使用Framelayout,并在ImageView中覆盖启动图形,该ImageView放置在当前puzzleView的顶部,并将其初始可见性设置为xml中的visible。在onCreateView中,像您正在进行的那样填充视图,然后只查找对puzzleView的引用,但不执行任何初始化。然后,当调用onResume方法(为此创建一个新的布尔字段)时,您可以检查视图是否已初始化,如果没有,则初始化它,然后将顶层的可见性设置为不可见以显示puzzleView。延迟仍将存在,但是直到onResume()返回之前,屏幕都将被顶层图形覆盖,此时(可能)初始化完成。如果初始化的重要部分可以在后台线程上完成,则可能会在调用onCreateView时启动背景线程来执行工作,并将顶层的可见性和初始化的完成部分(几乎肯定需要在UI线程上完成)更改为Runnable,应从后台线程通过runOnUiThread()方法启动。

1

onCreateView 在片段显示之前调用,如果在这里进行繁重的工作,会延迟显示视图('黑屏闪烁'),因此应该首先将繁重的工作移入 onResume 或至少是 onViewCreated

其次,将负载放在后台线程上,以便 UI 线程可以继续处理片段的显示。在 Android 中最简单的方法是使用 AsyncTask,它将允许您轻松地在一切加载完成时通知 UI。

public void onViewCreated() {
    new AsyncTask<Void, Void, Void>() {
        public Void doInBackground() {
            //Do your loading
        }

        public void onPostExecute(Void aVoid) {
            //Update display, play sound (on resumed fragment)
        }
    }.execute();
}

如果您是Android的新手,请注意使用此方法时不要泄露上下文信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接