Android: синхронизация с потоком рендерера OpenGL - PullRequest
6 голосов
/ 09 декабря 2011

Я использую OpenGL ES для рисования в приложении для Android.

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

Я думал об использовании Future , чтобы поток пользовательского интерфейса находился в спящем режиме, пока поток визуализатора записывает данные изображения (эта операция выполняется очень быстро, поэтому пользователь не будет чувствовать, что приложение перестало отвечать) .

Но я в недоумении по поводу того, как отправить Future в поток визуализации. Все примеры, которые я нашел, создают свои собственные потоки, а затем отправляют будущее этим потокам. В документации о GLSurfaceView упоминается «метод queueEvent () используется для безопасного обмена данными между потоком пользовательского интерфейса и потоком рендеринга. При желании вы можете использовать некоторые другие методы межпотокового взаимодействия Java, такие как синхронизированный методы самого класса Renderer. " похоже, что использование Future вместо вызова queueEvent() возможно, но я понятия не имею, как это сделать.

Ответы [ 2 ]

7 голосов
/ 09 декабря 2011

Это я не проверял, поэтому может не работать:

FutureTask<YourReturnObject> futureTask = new FutureTask<YourReturnObject>(new Callable<YourReturnObject>() {
    @Override
    public YourReturnObject call() throws Exception {
        //your gl stuff here
        return // result
    }
});
glSurfaceView.queueEvent(futureTask);
YourReturnObject result=futureTask.get(); // should block until gl thread is done.
4 голосов
/ 09 декабря 2011

Я бы предложил не расширять GLSurfaceView, а вместо этого выполнять асинхронную связь между потоками. Смотрите мой ответ здесь для нескольких примеров

По сути, вы ставите задачи в очередь в своей реализации GLSurfaceView.Renderer через вызовы методов. Затем, когда поток GL вызывает ваш метод onDraw () в Renderer, вы выполняете эти задачи из очереди. При завершении задач укажите другим потокам, что задачи выполнены с помощью Обработчик

Также не спите поток пользовательского интерфейса никогда. Если поток пользовательского интерфейса переходит в спящий режим, ОС Android не получает от него ответа и неверно интерпретирует, что приложение аварийно завершилось (находится в бесконечном цикле или что-то в этом роде), и вызовет диалоговое окно Force close для пользователя

...