Форум

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

04 августа 2016 18:44
интересно а так сразу если подрят выполнить должно сработать?
нет, resume сам по себе мало, что делает, а max_fps учитывается только в цикле requestAnimationFrame, который вызывается асинхронно
04 августа 2016 18:50
Ответ на сообщение пользователя Иван Любовников
нет, resume сам по себе мало, что делает, а max_fps учитывается только в цикле requestAnimationFrame, который вызывается асинхронно

я так и думал ((
т.е. обязательно вызвать m_main.append_loop_cb(frame_cb); и уже в нем задать ?
просто не хотелось б усложнять там и так у меня еще кучу всего надо прилепить от часов поверх рендера (((
Денис
04 августа 2016 19:13
т.е. обязательно вызвать m_main.append_loop_cb(frame_cb); и уже в нем задать ?
да, других способов не могу придумать
04 августа 2016 19:56
Ответ на сообщение пользователя Иван Любовников
да, других способов не могу придумать

вообщем в моем случае после снятия с паузы показывает 1й кадр старый 2й кадр переход на сл. старый кадр (+1 сек) и за тем уже скачок на новый кадр с правильным временем..

или я что то сделал не так или хз (
Денис
04 августа 2016 23:18
Попрошу пример в студию, где проявляется проблема.

P.S. метод append_loop_cb() можно сразу же отключить после первого срабатывания , но в вашем случае не вижу в этом практической пользы.
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
05 августа 2016 02:27
Ответ на сообщение пользователя Кирилл
Попрошу пример в студию, где проявляется проблема.

P.S. метод append_loop_cb() можно сразу же отключить после первого срабатывания , но в вашем случае не вижу в этом практической пользы.

основной кусок кода прошу глянуть постарался убрать всякое дополнительное не относящееся к проблеме….. черновик так скзать может конечно чтото намудрил то поправьте плиз

"use strict";

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 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 cfaceAMB= new Image();

var rotatedPoint={ x:0, y:3, z:0, r:2, a:0};
cfaceAMB.src = 'cfaceAMB.png';

/**
 * 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,
        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  
    }); 
    //m_cfg.set("shadows", false);
    //m_cfg.set("shadows", true);
    //exports.set = m_cfg.set;
};


function get_angle(center, point){
	var x = point.x - center.x;
	var y = point.y - center.y;
	if(x===0){ return ((y > 0) ? 180 : 0);}
	var a = Math.atan(y/x)*180/Math.PI;
	a = (x > 0) ? a+90 : a+270;
	return Math.round(a);
	}


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 Preloader !!!  
    // ВСЕ ЭВЕНТ ЛИСТЕНЕРЫ ТУТ ! 
    document.addEventListener('tizenhwkey', function(e) {
        if (e.keyName === "back") {
            try {tizen.application.getCurrentApplication().exit();} catch (ignore) {alert("exit tizenhwkey not work!");}
        }});
   
    document.addEventListener("ambientmodechanged", function(ev) {
        var mode = ev.detail.ambientMode;
        if (mode) {
            ambMode = true;
        } else {
            ambMode = false;
        }
        if (!ambMode) {

            document.getElementById("main_canvas_container").style.display = "inline";
            document.getElementById("canvasAMB").style.display = "none";
        	m_main.resume();
        } 
        if (ambMode) {

         	m_main.pause();  
        	document.getElementById("main_canvas_container").style.display = "none";
        	document.getElementById("canvasAMB").style.display = "inline";
        } 
        
    });
   
    
    document.addEventListener("visibilitychange", function() {
        if (!document.hidden) {
            
        	if (!ambMode) {
        		m_cfg.set("max_fps", 60);
        		m_main.resume();
        		//m_cfg.set("max_fps", 1);
        		
            }
            
        }
      
    });    
    
    try {
    	window.addEventListener("devicemotion", function(e) {

        if (e.interval > 100) {  
        	if (!ambMode) { 
        		signX=-Math.round(e.accelerationIncludingGravity.x);
        	    signY=Math.round(e.accelerationIncludingGravity.y);
        	    signAngleNew=get_angle({x:0,y:0},{x:signX,y:signY});
        	  }}
        }, true); 
    } catch (ignore) {alert("DevMot not init!");}
    
    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("antialiasing", true);
    //m_cfg.set("shadows", false);
    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(){
    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.append_loop_cb(frame_cb);

}

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();
	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();
Денис
05 августа 2016 07:17
Попробуйте там где у вас метод m_main.resume(); перенести функции отображения canvas элемента
            document.getElementById("main_canvas_container").style.display = "inline";
            document.getElementById("canvasAMB").style.display = "none";

в функцию frame_cb, но так что бы они сработали только после второго вызова функции frame_cb.

P.S. в документации не нашёл события, которое срабатывает after рендеринга. Только before поэтому предлагаю вариант со счётчиком.
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
05 августа 2016 12:50
Ответ на сообщение пользователя Кирилл
Попробуйте там где у вас метод m_main.resume(); перенести функции отображения canvas элемента
            document.getElementById("main_canvas_container").style.display = "inline";
document.getElementById("canvasAMB").style.display = "none";


в функцию frame_cb, но так что бы они сработали только после второго вызова функции frame_cb.

P.S. в документации не нашёл события, которое срабатывает after рендеринга. Только before поэтому предлагаю вариант со счётчиком.

не совсем понимаю как это поможет ( всеравно померяются те масые 2 сек рендеринга ..

т.к по факту изображение будет метвым 2 сек ( даже если сработает
Денис
06 августа 2016 03:29
вопрос знатокам:

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

как бы вы организовали вызов пересчета углов? как я сейчас или как то по другому?
Денис
08 августа 2016 10:58
основной кусок кода прошу глянуть постарался убрать всякое дополнительное не относящееся к проблеме….. черновик так скзать может конечно чтото намудрил то поправьте плиз
в листенере ambientmodechanged тоже m_main.resume() вызывается без выставления fps, может дело в этом?

Я сейчас ( см код выше) использую для расчета положения стрелок внешний тайм аут, а может мне по калбеку перед рендером его вычислять? или после? чтоб управлени все было из цикла рендера.. модет тогда и часть прблем с старыми карами исчезнет?
лучше, конечно, синхронизировать с циклом рендеринга, делая расчет перед рендером (set_render_callback). Сейчас он вызывается постоянно каждые 0.5 сек, а так будет раз в секунду и останавливаться по паузе. Не уверен, что проблемы исчезнут, пока не очень понятно, почему проскакивает несколько старых кадров.
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.