Начин за откриване дали WebGL viewport е на екрана?

Има ли някакъв начин да мога да направя запитване до GPU, за да ми каже дали прозорецът ми за изглед в моята уеб страница в момента е на екрана или не? Например, ако имах изобразяване на 3d сцена в платно в iframe, има ли начин да направя запитване до хардуера (в рамките на моя iframe и само пикселите или verts в прозореца за изглед), за да кажа дали съм на екрана или съм превъртян извън екрана ?

Любопитно ми е дали това е нещо, което мога да направя на ниво шейдър на върха. WebGL дори изпълнява ли програмата за шейдър на прозорец за изглед, който е извън екрана? Да речем, ако се превърта под платното или прозорецът за изглед е възпрепятстван от друг прозорец на браузъра на уеб страница? Има ли начин да направите запитване към съставната част на webgl, за да видите дали е дори в изгледа или да повторите дървото „RenderObject“, за да проверите дали е дори на екрана и след това да върнете тази стойност? Опитвам се да извлека много повече производителност от проект, върху който работя, и се опитвам да изобразя само това, което се вижда на екрана.

Някакви възможни идеи? Възможно ли е изобщо това? Благодаря!


person xtr33me    schedule 02.11.2012    source източник


Отговори (2)


RequestAnimationFrame е единственият разумен начин за справяне с ненужната загуба на производителност дори семантично, защото window.requestAnimationFrame казва браузърът, който искате да изпълни анимация... Така че браузърът ще разбере как трябва да обработи вашето желание по оптимален начин, като вземе предвид текущото състояние на страницата. Но тъй като iframes комуникират с помощта на локално хранилище, можете да им изпратите състоянието на основната си страница, така че всеки от тях да реши дали иска RequestAnimationFrame или не. Но не съм сигурен, че е добре да имате множество контексти за изобразяване на вашата страница, всички те изяждат ресурси и не могат да ги споделят (данните, които се съхраняват в GPU, са в пясъчна среда), така че в крайна сметка те ще започнат да се изтласкват взаимно от паметта на GPU и причината за забавяне + конвейерът на GPU може да не е толкова доволен от всички тези малки самостоятелни обекти. Фрагментацията е основният враг на производителността на GPU.

person JAre    schedule 08.11.2012
comment
Благодаря JAre. Това изглежда е най-добрият отговор, който съм виждал за този въпрос. Оценявам много информацията! - person xtr33me; 13.11.2012

Не задавате този въпрос на ниво платно/WebGL, защото може например да се превърти назад на екрана, преди да нарисувате друг кадър, а браузърите не искат да нямат съдържание за показване, така че няма разпоредба за не рисува.

Вярвам, че ще трябва да се консултирате със свойствата на DOM геометрията (напр. .scrollLeft) на вашите превъртаеми области, за да определите дали платното е видимо. Има достатъчно информация в споменатите свойства, че можете да направите това общо без познания за структурата на вашата страница.

Също така се уверете, че използвате изключително requestAnimationFrame за вашия график за чертеж/симулация; ще постави на пауза анимациите, ако страницата е скрита/минимизирана/в друг раздел/в противен случай изрично невидима.

person Kevin Reid    schedule 03.11.2012
comment
Благодаря за отговора Кевин, но има ли начин да направите това на ниво webgl? Всеки от клиентите/героите на играта, които събирате, се изпълняват в свои собствени вградени рамки и аз хоствам сървъра на различен src от уеб страницата, която ги показва. В момента го имам, така че всеки iframe е наясно със себе си и комуникира чрез локално хранилище. При тестване обаче, когато започна да получавам много повече iframe на екрана, виждам забавяне и бих искал да не извиквам актуализация на дъщерното платно на iframe, ако то се превърта извън екрана. - person xtr33me; 03.11.2012