Форум

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

10 августа 2016 15:36 #11125
Ответ на сообщение пользователя Иван Любовников
прикрепил для 16.07

надо вызывать так:
m_main.frame(m_time.get_timeline(), 0);

должна работать, даже если движок на паузе


так в моем коде получается куда это засунуть? после паузы или перед рестартом?
не очень понимаю
Денис
10 августа 2016 15:42 #11126
так в моем коде получается куда это засунуть? после паузы или перед рестартом?
там, где нужно сразу отрисовать кадр, например, после main.resume()
Команда Blend4Web
10 августа 2016 15:53 #11127
Ответ на сообщение пользователя Иван Любовников
там, где нужно сразу отрисовать кадр, например, после main.resume()

попробую сегодня скажу результат., но что то мне сдается, что выполнив резьюм уже увижу тот кадр старый
Денис
10 августа 2016 17:02 #11129
Ответ на сообщение пользователя Иван Любовников
прикрепил для 16.07
надо вызывать так:
m_main.frame(m_time.get_timeline(), 0);

должна работать, даже если движок на паузе


даже в таком случае, сделанном для проверки листенера( работает нормально):
после ОК , идет старый кадр и только после этого рендер нового соотв +1 кадр (1 сек)
( собственно без АЛЕРТА ситуация та же)
        		alert("in ok");
        		m_main.frame(m_time.get_timeline(), 0);
        		m_main.resume();
Денис
10 августа 2016 17:25 #11131
после ОК , идет старый кадр
а сцена актуальная к моменту вызова frame? checkTime должен хотя бы 1 раз сработать
Команда Blend4Web
10 августа 2016 17:36 #11133
Ответ на сообщение пользователя Иван Любовников
а сцена актуальная к моменту вызова frame? checkTime должен хотя бы 1 раз сработать

не я ж пишу ничего не меняется.. а вроде даже задержка удлинняется и даже иногда успевает еще один старый калр обсчитать до того как прыгнет на новое положение, вот как раз тот самый второй кадр который иногда проскакивает на нем уже похоже срабатывает изменение частоты кадров на 60 и после того ка кпросчитает первый кадр частота становится как записано 1 , но 1й кадр стабильно показывает старый .
может как то получается что это уже готовый старый кадр остается где то ?
Денис
10 августа 2016 18:10 #11136
а можете ещё раз привести код, который сейчас используется, после всех изменений?
Команда Blend4Web
10 августа 2016 18:58 #11140
Ответ на сообщение пользователя Иван Любовников
а можете ещё раз привести код, который сейчас используется, после всех изменений?
АГА, только убрал "мысли в слух" с матюками

"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_time = require("time");
    var m_preloader = require("preloader");
    //v ar _previous_selected_obj = null;
    var m_input = require("input");
    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;
    var llevel = 7;
    try {
        var lightSensor = tizen.sensorservice.getDefaultSensor("LIGHT");
    } catch (ignore) {
        alert("Light sens not init!");
    }

    exports.init = function() {
        m_app.init({
            canvas_container_id: "main_canvas_container",
            quality: m_cfg.P_HIGH,
            callback: init_cb,
            //show_fps: true,
            //show_fps: false,
            fps_elem_id: "idFPS",
            //console_verbose: true,
            console_verbose: false,
            autoresize: false,
            pause_invisible: true,
            //antialiasing: true,
            alpha: false,
            physics_enabled: false
        });
    };


    function onGetSuccessCB(sensorData) {

        if (sensorData.lightLevel / 10 < llevel) {
            llevel = llevel - 0.3;
        }
        if (sensorData.lightLevel / 10 > llevel) {
            llevel = llevel + 0.3;
        }

    }

    function onerrorCB(error) {
        console.log("error occurs");
    }

    function onsuccessCB() {
        console.log("sensor start");
        lightSensor.getLightSensorData(onGetSuccessCB, onerrorCB);
    }

    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();
        document.addEventListener('tizenhwkey', function(e) {
            if (e.keyName === "back") {
                try {
                    tizen.application.getCurrentApplication().exit();
                } catch (ignore) {
                    alert("exit tizenhwkey not work!");
                }
            }
        });

        try {
            lightSensor.start(onsuccessCB);
        } catch (ignore) {
            alert("Light sens is not start!");
        }


        document.addEventListener("visibilitychange", function() {
            if (!document.hidden) {

                if (!ambMode) {
                    //m_cfg.set("max_fps", 60);
                    //alert("in ok");
                    m_main.frame(m_time.get_timeline(), 0);
                    m_main.resume();
                    //m_cfg.set("max_fps", 1);
                }
            }
        });

        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);

        //m_cfg.set("canvas_resolution_factor", 1); // max 4096

        load();
    }

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

    /**
     * load the scene data
     */
    function load() {
        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. 
        if (m_main.is_paused()) {
            m_cfg.set("max_fps", 60);
        }

        // 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 ! 
        checkTime();
        m_cfg.set("max_fps", 1);
    }

    /**
     * callback executed when the scene is loaded
     */
    function load_cb() {
        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);
        try {
            onsuccessCB(lightSensor);
        } catch (ignore) {}

        m_lights.set_light_params(m_scs.get_object_by_name("lamp"), {
            "light_energy": llevel
        }); //mid 7 sensorData.lightLevel
        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();
Денис
10 августа 2016 19:18 #11141
checkTime нужно вызвать 1 раз перед frame, чтобы сцена обновилась, а то, конечно, будет старый кадр

ну и махинации с max_fps уже будут не нужны
Команда Blend4Web
10 августа 2016 19:37 #11143
Ответ на сообщение пользователя Иван Любовников
checkTime нужно вызвать 1 раз перед frame, чтобы сцена обновилась, а то, конечно, будет старый кадр
ну и махинации с max_fps уже будут не нужны

не очень понимаю.. про сек тайм перед снятием с паузы , да понял , а пот про макс фпс не очень..


точнее по подробнее нужно про m_main.frame(m_time.get_timeline(), 0);

спасибо , сейчас попробую

Попробовал так всеравно прыгает(показывает старый потом скачок) !
.....
if (!document.hidden) {
            //watch();
        	if (!ambMode) {
        		//m_cfg.set("max_fps", 60);
        		//alert("in ok");
        		checkTime();
        		m_main.frame(m_time.get_timeline(), 0);
        		m_main.resume();

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