2014-09-05 4 views
3

Hy! Я работаю с огромными объектами вершин, я могу показать много модов, потому что я разделил их на более мелкие части (до 65K вершин). Также я использую три камеры js. Я хочу увеличить производительность с помощью очереди приоритетов, и когда пользователь, перемещающий камеру, показывает только верхнюю 10, тогда, когда движущийся стоп покажет остальное. Эта часть не так уж и трудна, но я не хочу, чтобы моделировали рендеринг, когда они находятся за другим объектом, возможно, отправляют некоторые лучи с точки зрения камеры (проверяя попадание в рамку), и в соответствии с списком попаданий я могу построить предыдущая очередь.Three js performance

Как вы думаете?

Кроме того, как я могу определить, если я могу загрузить следующую Моделла или нет (на лету)

+1

Окклюзионный отбор - это то, что вы хотите сделать. – gaitat

+0

Thx, я прочитал его где-то давным-давно, но это сошло с ума;) –

+0

Кажется, мне нужно сделать свою собственную окклюзию, я не нашел для нее решения, просто это: https: // github .com/wivlaro/three.js/blob/master/examples/webgl_occlusion_culling.html –

ответ

5

Вариант А:. Occlusion выбраковки, вам нужно будет найти библиотеку для этого.

Вариант B: Используйте тест плоскости AABB с камерой. Фрустальные плоскости и ограничивающий объект поле, это скажет вам, находится ли объект в поле зрения камеры. (Не обязательно видны за объектом, так как такая операция невозможна, это в основном, вероятно, уже сделано в некоторой степени с WebGL)

реализации: Google это три JS, вероятно, поддерживает этот

Вариант C : Используйте максимальный объект render Limit, приоритет основан на расстоянии от камеры и размере объекта. Например, подсчитайте, какие объекты видны (вариант B), затем назначьте приоритет ближайшим и самым большим и отключите остальные.

псевдо-код:

if(object is in frustum){ 
     var priority = (bounding.max - bounding.min)/distanceToCamera 
    } 

Убедитесь, что ваши шейдеры только делают один проход. Поскольку это удвоит время расчета (примерно в зависимости от ситуации)

Вариант D: raycast до восьми углов ограничивающего параллелепипеда, если все они не не оказывают объект. Это довольно точно, но отнюдь не идеально.

Вариант А будет лучше точно, используя Option C является большим, если вы не заботитесь, чтобы мелкие предметы далеко не будут выданы. Опция D хорошо работает с объектами с большим количеством вершин, вы можете захотеть увеличить количество точек объекта в зависимости от ситуации. Вариант B, вероятно, не будет полезен для вашего сценария, но его часть c и другие методы оптимизации. Во всем никогда не было чрезвычайно надежного и оптимального способа сказать, что что-то стоит за чем-то другим.