Тема: WebGL тесты
Показать сообщение отдельно
Старый 18.09.2013, 13:57   #49
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: WebGL тесты

Сообщение от Mr_F_ Посмотреть сообщение
у меня есть
window.onresize = function(e) {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;
}
срабатывает при смене размера окна на винде или вытаскивании снизу консоли. не работает на телефонах?
а чёрт, точно, забыл, там же пропорции могут меняться.
Не только пропорции меняются что требует пересчёт матрицы проекции, но также и это не будет стабильно работать на всех платформах. Проблема в том что евент onresize на практике срабатывает часто до того как ориентация полностью поменялась и новый размер был присвоен, т.к. смена ориентации обычно сопровождается анимацией.
Есть евент "orientationchange":
window.addEventListener('orientationchange', function() {
  
// ...

Он также будет срабатывать во время ориентации, и значения window.innerWidth = могут часто разводить.
Кстати для ориентации можешь заюзать также window.orientation - это чисто для константы.

Решение я нашёл, небольшой костыль, но не хак:
Заводим элемент вначале всего body:
<div id='ruler'></div
Стиль у него:
#ruler {
  
positionfixed;
  
widthauto;
  
heightauto;
  
left0;
  
top0;
  
right0;
  
bottom0;
  
visibilityhidden;

И далее при onresize, orientationchange а также каждые 200 мс, проверяй его размер (именно этого элемента). Т.к. проверка его размера "насильно" заставит броузер пересчитать размеры (reflow), что выдаст реальные данные:
var bounds ruler.getBoundingClientRect();
if (
bounds.width != oldWidth || bounds.height != oldHeight) {
  
// размер изменился

Я тестировл на куче платформ работает отлично, и реагирует на все евенты.
Заметил что на некоторых платформах нужно на 4 пикселя меньше делать.

Также не забудь указать overflow:hidden в css для body, чтобы предотвратить скроллинг.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mr_F_ (18.09.2013)