LibGDX: создать новый объект scene2d внутри другого потока? - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть база данных, которая хранит, например, ключ изображения для TextureAtlas . Поскольку запрос к базе данных не должен блокировать основной поток, запрос выполняется в другом потоке.

Теперь я хочу создать актера scene2d и вернуть его, чтобы его можно было показать.

new Thread() {
        @Override
        public void run() {
            String resultOfQuery = ...;
            final Image image = new Image(atlas.findRegion(resultOfQuery));

            Gdx.app.postRunnable(new Runnable() {
                @Override
                public void run() {
                    listener.onImageCreated(image);
                }
            }); 
        }
    }.start();

Как видите, я создаю изображение в новом потоке, а затем передаю его основному потоку. Но libGDX wiki гласит:

Вы никогда не должны выполнять многопоточные операции с чем-либо, что связано с графикой или аудио, например использовать компоненты scene2D из нескольких потоков.

Нужно ли создавать и назначать актера на сцену в главном потоке? Или это нормально, если я создам его в другом потоке, а затем добавлю его на сцену основного потока?

1 Ответ

0 голосов
/ 29 апреля 2018

Единственная потенциальная проблема, которую я вижу выше - это вызов findRegion для атласа, который не является поточно-ориентированным. Но если вы знаете, что ваш поток не работает во время использования атласа в другом месте, все будет в порядке. Если у вас есть несколько запросов, которые потенциально могут получить доступ к атласу, у вас будут проблемы. Или если вы вызываете методы atlas в игровом цикле.

Конечно, вы можете просто использовать конструктор Image без аргументов и передать ему область в выполняемом потоке игры. Тогда вам не о чем беспокоиться.

...