Показывает несколько "старых" кадров после "снятия с ПАУЗЫ" как обновить рендер до отображения?
04 августа 2016 18:44
04 августа 2016 18:50
Ответ на сообщение пользователя Иван Любовников
нет, resume сам по себе мало, что делает, а max_fps учитывается только в цикле requestAnimationFrame, который вызывается асинхронно
я так и думал ((
т.е. обязательно вызвать m_main.append_loop_cb(frame_cb); и уже в нем задать ?
просто не хотелось б усложнять там и так у меня еще кучу всего надо прилепить от часов поверх рендера (((
Денис
04 августа 2016 19:13
04 августа 2016 19:56
Ответ на сообщение пользователя Иван Любовников
да, других способов не могу придумать
вообщем в моем случае после снятия с паузы показывает 1й кадр старый 2й кадр переход на сл. старый кадр (+1 сек) и за тем уже скачок на новый кадр с правильным временем..
или я что то сделал не так или хз (
Денис
04 августа 2016 23:18
Попрошу пример в студию, где проявляется проблема.
P.S. метод append_loop_cb() можно сразу же отключить после первого срабатывания , но в вашем случае не вижу в этом практической пользы.
P.S. метод append_loop_cb() можно сразу же отключить после первого срабатывания , но в вашем случае не вижу в этом практической пользы.
Не стой, где попало… Попадет еще раз.
http://naviris.ru/
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 элемента
в функцию frame_cb, но так что бы они сработали только после второго вызова функции frame_cb.
P.S. в документации не нашёл события, которое срабатывает after рендеринга. Только before поэтому предлагаю вариант со счётчиком.
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/
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 сек, а так будет раз в секунду и останавливаться по паузе. Не уверен, что проблемы исчезнут, пока не очень понятно, почему проскакивает несколько старых кадров.