由用户创建的信息 den812
08 August 2016 17:56
Как при длительном лоадере не позволять движку встать на паузу при уходе фокуса с окна итд ?
пример , загружается страничка.. идет бар % ( встроенный лоадер) если
в это время переключиться с окна то и лоадер и приложение встает на паузу и возобновляется только после перехода обратно к окну..
а по идее логики должно загрузиться и только потом выполнив 1й кадр встать на паузу
подскажите можно ли обойти ну и если это все именно так то может лоадеру добавить параметр управления паузой? ( с паузой или без паузы)
спасибо.
пример , загружается страничка.. идет бар % ( встроенный лоадер) если
в это время переключиться с окна то и лоадер и приложение встает на паузу и возобновляется только после перехода обратно к окну..
а по идее логики должно загрузиться и только потом выполнив 1й кадр встать на паузу
подскажите можно ли обойти ну и если это все именно так то может лоадеру добавить параметр управления паузой? ( с паузой или без паузы)
спасибо.
08 August 2016 16:47
Ответ на сообщение пользователя Михаил Лузянин
В соответствующем разделе документации имеется подробная инструкция как использовать материалы из библиотеки материалов. Соответствующий раздел документации Если что то не понятно пишите сюда постараемся разъяснить подробнее.
аа понял о чем речь, думаю имелось ввиду, что отсутвует или может я не нашел , удобоваримого визуального просмотрщика всей существующей библиотеки материалов.. и в целом в самом блендере это очен не удобно сделано
не по людски… (( может про это?
08 August 2016 14:35
08 August 2016 12:57
Ответ на сообщение пользователя Иван Любовников
в листенере 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();
06 August 2016 03:29
вопрос знатокам:
Я сейчас ( см код выше) использую для расчета положения стрелок внешний тайм аут, а может мне по калбеку перед рендером его вычислять? или после? чтоб управлени все было из цикла рендера.. модет тогда и часть прблем с старыми карами исчезнет?
как бы вы организовали вызов пересчета углов? как я сейчас или как то по другому?
Я сейчас ( см код выше) использую для расчета положения стрелок внешний тайм аут, а может мне по калбеку перед рендером его вычислять? или после? чтоб управлени все было из цикла рендера.. модет тогда и часть прблем с старыми карами исчезнет?
как бы вы организовали вызов пересчета углов? как я сейчас или как то по другому?
05 August 2016 12:54
Ответ на сообщение пользователя Кирилл
Рекомендую для ознакомления вторую часть этой статьи.
о.. спасибо, да да , оно самое.. то о чем я писал выше, приятно разжевано к стати
как и автор я тоже не очень понимаю почему этому разделу в доке по b4w уделено так мало внимания..
05 August 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 сек ( даже если сработает
05 August 2016 02:36
Ответ на сообщение пользователя Кирилл
Вот тут я практиковал с процедурной геометрией.
Можете попробовать портировать код отсюда, а генерировать шрифты можно этой утилитой. И будет у вас текст создаваться в реалтайме
Сам пока только начинаю изучать процедурную геометрию) Весёлая штука
ох да круто конечно . но пока ищу более простые и менее затратные решения , скорее всегопока ограничусь текстом с канваса.. плоским ..
но сначала решу не проблемы что накопал ранее.
конечно было бы не плохо включить в движок использование таких шрифтов, тем боле что все для этого есть вроде как , но разными кусками..
((
PS к стати все эти идеи с текстом как текстурой на лету итд.. я тоже в трии пробовал ранее