Форум

Показывает несколько "старых" кадров после "снятия с ПАУЗЫ" как обновить рендер до отображения?

08 августа 2016 12:57 #11037
Ответ на сообщение пользователя Иван Любовников
в листенере ambientmodechanged тоже m_main.resume() вызывается без выставления fps, может дело в этом?
лучше, конечно, синхронизировать с циклом рендеринга, делая расчет перед рендером (set_render_callback). Сейчас он вызывается постоянно каждые 0.5 сек, а так будет раз в секунду и останавливаться по паузе. Не уверен, что проблемы исчезнут, пока не очень понятно, почему проскакивает несколько старых кадров.

постоянный просчет убраз расчет засунул в тот же вечер в render_cb()
m_main.set_render_callback(render_cb);

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

но при пробужении всервно остался первый старый кадр (( получается, что ровно одну секунду до сл рендера
что же за напасть такая? по коду вроде как не должен старый кард рендерится.
Может буфер какой так срабатывает?
вы же рендерите в буфер перед выводом , верно?

ни как не могу понять

ВОТ ОБНОВЛЕННЫЙ ВАРИАНТ КОДА ( может кто свежим взгядом увидит недочеты):

"use strict";
// register the application module
b4w.register("simple_app", function(exports, require) {
    // import modules used by the app
    var m_main = require("main");
    //var m_anim      = require("animation");
    var m_app = require("app");
    var m_data = require("data");
    //var m_mouse     = require("mouse");
    //var m_obj      = require("objects");
    //var m_scenes    = require("scenes");
    var m_scs = require("scenes");
    var m_trans = require("transform");
    var m_cfg = require("config");
    var m_cons = require("constraints");
    //var m_lights   = require("lights");
    //var m_main = b4w.require("main");
    var m_preloader = require("preloader");
    //v ar _previous_selected_obj = null;
    var m_input = require("input");
    //var gyro_device = null;//m_input.get_device_by_type(m_input.DEVICE_GYRO);
    var lamp = null;
    //var //loader, 
    //scene, 
    //camera, 
    //renderer, 
    var now = new getDate();
    var l = null;
    var h = null;
    var m = null;
    var s = null;
    var d = null;
    var b = null;
    var battCharging = false;
    var battLevel = 50;
    var ambMode = false;
    var signAngleLast = 0;
    var signAngleNew = 0;
    var signX = 0;
    var signY = 0;


    /**
     * export the method to initialize the app (called at the bottom of this file)
     * P_LOW P_HIGH P_ULTRA
     */
    exports.init = function() {
        m_app.init({
            canvas_container_id: "main_canvas_container",
            quality: m_cfg.P_LOW,
            //P_LOW(нет теней) P_HIGH ( среднее с тенями)  P_ULTRA  (тормоз), P_CUSTOM enums - НЕ срабатывает)
            callback: init_cb,
            //show_fps: true,
            //show_fps: false,
            fps_elem_id: "idFPS",
            //console_verbose: true,
            console_verbose: false,
            autoresize: false, //Automatically resize canvas to match the size of container element.
            pause_invisible: true, //Pause engine simulation if page is not visible (in other tab or minimized).
            //antialiasing: true,
            alpha: false,
            physics_enabled: false
        });

    };



    function onBatteryUpdate(a) {
        battCharging = a.isCharging;
        battLevel = 100 * a.level;
    }


    /**
     * callback executed when the app is initizalized
     */
    function init_cb(canvas_elem, success) {

        if (!success) {
            //console.log("b4w init failure");
            return;
        }

        m_preloader.create_preloader(); //TODO LW Preader !!!  

        document.addEventListener('tizenhwkey', function(e) {
            if (e.keyName === "back") {
                try {
                    tizen.application.getCurrentApplication().exit();
                } catch (ignore) {
                    alert("exit tizenhwkey not work!");
                }
            }
        });

        document.addEventListener("visibilitychange", function() {
            if (!document.hidden) {
                //watch();
                if (!ambMode) {
                    //m_cfg.set("max_fps", 60);
                    m_main.resume();
                    //m_cfg.set("max_fps", 1);
                    //window.requestAnimationFrame();
                }
                //window.requestAnimationFrame( watch);
            }
            //watch1();
        });

        try {
            tizen.systeminfo.getPropertyValue("BATTERY", onBatteryUpdate, null);
        } catch (ignore) {
            alert("BATT Prz not init!");
        }

        try {
            tizen.systeminfo.addPropertyValueChangeListener("BATTERY", onBatteryUpdate);
        } catch (ignore) {
            alert("BATT Ste not init!");
        }

        m_cfg.set("shadows", true);
        //m_cfg.set("shadows", false);
        m_cfg.set("antialiasing", true);
        //m_cfg.set("antialiasing", false);
        //m_cfg.set("reflections", true);
        m_cfg.set("refractions", false);
        //m_cfg.set("refractions", true);
        m_cfg.set("reflections", false);
        load();
    }

    function preloader_cb(percentage) {
        m_preloader.update_preloader(percentage);
    }

    /**
     * load the scene data
     */
    function load() {
        //m_data.load("LW-Automatic-3D.json", load_cb);
        m_data.load("testshdw-t3d.json", load_cb, preloader_cb);
    }


    function frame_cb() {
        //Append a callback to be executed every frame (even if the rendering is paused). Its purpose is to perform actions non-related to the actual rendering, e.g html/css manipulation. This method allows registration of multiple callbacks. 
        /*    _count_frame+=1;
            led_render.innerText = _count_frame;
            led_render.style.backgroundColor = 'green';
            setTimeout(function(){
                led_render.style.backgroundColor = 'red';
            },100);
        */
        // m_cfg.set("max_fps", 1);

    }

    function render_cb() {
        // Set the rendering callback which is executed for every frame just before the rendering. Only one callback is allowed. 
        // TODO this is a timer ! 

        if (m_main.is_paused()) {
            m_cfg.set("max_fps", 60);
        }
        if (!m_main.is_paused()) {
            m_cfg.set("max_fps", 1);
            checkTime();
        }
        /*    _count_frame+=1;
            led_render.innerText = _count_frame;
            led_render.style.backgroundColor = 'green';
            setTimeout(function(){
                led_render.style.backgroundColor = 'red';
            },100);
        */
        //m_cfg.set("max_fps", 1);

    }

    /**
     * callback executed when the scene is loaded
     */
    function load_cb() {
        //m_app.enable_camera_controls(); // TODO: LIGHTCONTROL
        // place your code here
        m_cfg.set("max_fps", 1);
        //setInterval(checkTime, 500);
        m_main.set_render_callback(render_cb); // Set the rendering callback which is executed for every frame just before the rendering. Only one callback is allowed. 
        m_main.append_loop_cb(frame_cb); //Append a callback to be executed every frame (even if the rendering is paused). Its purpose is to perform actions non-related to the actual rendering, e.g html/css manipulation. This method allows registration of multiple callbacks. 

    }

    function getDate() {
        var dateget;
        try {
            dateget = tizen.time.getCurrentDateTime();
        } catch (err) {

            dateget = new Date();
        }

        return dateget;
    }



    function checkTime() {
        now = getDate();
        d = now.getDate();
        h = now.getHours();
        m = now.getMinutes();
        s = now.getSeconds();
        //ms = now.getMilliseconds();
        h = h % 12;
        b = (battLevel) * Math.PI / 180; // 100 grad = 100%  0=0%	
        d = (d * 11.612903225806451612903225806452) * (Math.PI / 180);
        h = (h * Math.PI / 6) + (m * Math.PI / (6 * 60)) + (s * Math.PI / (360 * 60));
        l = ((m + s / 60) / 0.3333333333333333333333333333333333333 * Math.PI / 6);
        m = (m * Math.PI / 30) + (s * Math.PI / (30 * 60));
        s = (s * Math.PI / 30);
        m_trans.set_rotation_euler(m_scs.get_object_by_name("hh"), 0, -h, 0);
        m_trans.set_rotation_euler(m_scs.get_object_by_name("mm"), 0, -m, 0);
        m_trans.set_rotation_euler(m_scs.get_object_by_name("ss"), 0, -s, 0);
        m_trans.set_rotation_euler(m_scs.get_object_by_name("dd"), 0, -d, 0);
        m_trans.set_rotation_euler(m_scs.get_object_by_name("bb"), 0, -b, 0);
        m_trans.set_rotation_euler(m_scs.get_object_by_name("emptyLight"), 0, l, 0);
    }
});
// import the app module and start the app by calling the init method
b4w.require("simple_app").init();
Денис
09 августа 2016 10:53 #11065
    if (m_main.is_paused()) {
        m_cfg.set("max_fps", 60);
    }
    if (!m_main.is_paused()) {
        m_cfg.set("max_fps", 1);
    }

этот код надо вернуть в frame_cb - он работает всегда, а render_cb - только, когда пауза выключена

checkTime(); тогда надо оставить в render_cb без проверок
Команда Blend4Web
09 августа 2016 11:02 #11066
1 фпс тоже лучше выставлять в render_cb как то так:

function frame_cb() {
    if (m_main.is_paused())
        m_cfg.set("max_fps", 60);
}

function render_cb() {
    m_cfg.set("max_fps", 1);
    checkTime();
}
Команда Blend4Web
09 августа 2016 12:21 #11080

Ответ на сообщение пользователя Иван Любовников
1 фпс тоже лучше выставлять в render_cb как то так:

function frame_cb() {
if (m_main.is_paused())
m_cfg.set("max_fps", 60);
}

function render_cb() {
m_cfg.set("max_fps", 1);
checkTime();
}


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

ни как не могу понять почему виден старый кадр раз мы пересчет запускаем до рендера(
Денис
09 августа 2016 13:53 #11081
с первым кадром который всеравно показывается старый
а к этому моменту render_cb уже вызвался, или он позже срабатывает через секунду?
Команда Blend4Web
09 августа 2016 14:54 #11082

Ответ на сообщение пользователя Иван Любовников
а к этому моменту render_cb уже вызвался, или он позже срабатывает через секунду?

да я и говрю что пересчет(чекТайм) срабатываетпозже на сл. кадре а первый кадр после пробужения или получения фокуса всегда показывает старый … ранее до последних доработок было так что успевало 2 кадра показать.. при чем один старый затем на сек больший. а сейчас только один старый как буд то из буфера. в ТРИИ например вроде есть принудительная очистка буфера кадров перед просыпанием ли перед засыпанием..
Денис
09 августа 2016 15:22 #11085
можете ещё попробовать в исходниках проставить здесь false:
config.js
- как недавно выяснилось, этот флаг в принципе может приводить к багам на ряде устройств
Команда Blend4Web
09 августа 2016 15:40 #11088

Ответ на сообщение пользователя Иван Любовников
можете ещё попробовать в исходниках проставить здесь false:
config.js
- как недавно выяснилось, этот флаг в принципе может приводить к багам на ряде устройств


а можно как то без исходников и пересборки туда достучаться из JS?
а то менеджер проектов я сочтвенно не использую.. итд
Денис
09 августа 2016 15:47 #11089
а можно как то без исходников и пересборки туда достучаться из JS?
не, это все зашито внутри

а вы какую версию используете? b4w.min.js? можно просто в ней поискать "preserveDrawingBuffer", он в одном месте встречается
Команда Blend4Web
09 августа 2016 16:06 #11090

Ответ на сообщение пользователя Иван Любовников
не, это все зашито внутри

а вы какую версию используете? b4w.min.js? можно просто в ней поискать "preserveDrawingBuffer", он в одном месте встречается

да минифицированную конечно ,

вот нашел в ней
да только в одном месте
a.context={alpha:!0,antialias:!1,premultipliedAlpha:!0,preserveDrawingBuffer:!0};


ставлю 1 и пробую вместо 0 ? какой вообще эффект должна оказать данная переменная?

_________________

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