Войти
AndroidФорумОбщее

Живые обои - глюк при повторном запуске

#0
1:10, 29 июня 2013

Делаю обои на OpenGL для Android
Следующий глюк у меня воспроизводится на 4 андроиде (на 2-м всё хорошо)

Порядок действий:
1. Установить живые обои
2. Выйти обратно на рабочий стол
3. Опять зайти в менеджер обоев и запустить те же самые обои
----- Вызывается onSurfaceCreated, графика инициализируется но цикл рендера не крутится :-(
4. Нажимаем настройки
5. Ничего не настраиваем, выходим из настроек
----- Опять вызывается onSurfaceCreated, теперь всё рисуется как надо

----------------------------------------------
Глюк воспроизводится только если в данный момент на рабочем столе запущены те же самые обои.
Глюк НЕ воспроизводится, если на рабочем столе живые обои из другого APK, пусть даже с тем же самым исходным кодом (таким образом битва за ресурсы вроде как исключена)
-----------------------------------------------
В каком направлении копать?


#1
14:49, 29 июня 2013

Распечатай во всех системных вызовах this. Это поможет разобраться, что происходит.) Глюков там достаточно разных при одновременном запуске нескольких копий живых обоев. Подобные проблемы решаются одним способом - запихнуть всю работу с огл в отдельный поток, т.е. по сути надо что бы у каждой копии был свой огл контекст и т.д.

#2
15:22, 29 июня 2013

KolyaL
Чёт побаиваюсь раскурочивать GLWallpaperService, уже пора выкладывать обои в маркет. Этот вопрос непременно изучу подробнее, но сейчас согласен и на временный костылёк. По this поотлаживаю

#3
13:44, 5 июля 2013

На некоторых устройствах предварительный просмотр и обои - это разные процессы на некоторых нет, обычно горожу костыль вида

    switch(mode)
    {
    case(0):
        if(render_lwp==NULL)
            render_lwp = new Render(apk_path, apk_temp);
        break;
    case(1):
        if(render_apk==NULL)
            render_apk = new Render(apk_path, apk_temp);
        break;
    case(2):
        if(render_prw==NULL)
            render_prw = new Render(apk_path, apk_temp);
        break;
    }

соответственно 0 - обои, 2 - превью, 3 - активити по необходимости. Соответственно 3 копии рендера в максимальном случае.

#4
15:18, 5 июля 2013

shadwork
Подскажи куда именно этот костыль впихивать и откуда взять mode?
Как это увязать с GLWallpaperService?

#5
9:36, 8 июля 2013

Унаследовавшись от GLWallpaperService.Renderer мы можем получить статус того запущен у нас превью или полноценные обои, внутри метода

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
      if (mEngine.isPreview())
      {
        mMode = GlOneManager.TYPE_PRW;
      }
      else
      {
        mMode = GlOneManager.TYPE_LWP;
      }
      mNativeGl.setPreviewMode(mEngine.isPreview());
      mNativeGl.viewerInitz();
    }

+ Показать

Не совсем удобно что о статусе превью мы узнаем только там где создаем поверхность а не раньше - но другого способа я не нашел.

Класс GlOneManager у меня это обертка над нативным рендером, если код на java то в нем и будет весь рендер внутри которого надо проверить что один экземпляр класса уже существует (например превью) а второй нам необходимо создаьб - собственно обои

#6
22:33, 8 июля 2013

Большое спасибо за код, сейчас буду разбираться

AndroidФорумОбщее

Тема в архиве.