![]() |
Советы по оптимизации
Приветствую товарищи!
Хочу оптимизировать проект, для чего нужно динамически изменять детализацию мешей от расстояния. Как замечал в игрушках, довольно полезная штука. Вот только организация сие оптимизации мне не очень ясна. Эт что, надо каждый цикл проверять расстояние со всеми объектами и если оно меньше "n" то удалить старый low-меш и загрузить high-меш?? Наверное я не правильно думаю, а если объектов 1000 и каждый цикл (ну даже через цикл 2 3) проверять расстояние между Всеми объектами это вроде ресурсоемко получается?! :rolleyes: |
Ответ: Советы по оптимизации
меши загруженны сразу.
ну или по крайней мере несколько лодов +/- текущего, с фоновой подгрузкой ближайших (но это если выеживаться). и в зависимости от расстояния просто рисуется тот или иной меш. |
Ответ: Советы по оптимизации
Цитата:
Иметь 1000 объектов - само по себе ресурсоёмко. Я бы делал цикл проверки в отдельном потоке с задержкой между итерациями. |
Ответ: Советы по оптимизации
Цитата:
|
Ответ: Советы по оптимизации
Значит все-таки проверять расстояние самый оптимальный вариант?
Т.е. надо создать пивот и к нему прикрутить 3 меша? И что получается если объект делать в 3 ступени получится так?: if entitydistance(camera,pivot)>100 then showentity ent1 hideentity ent2 hideentity ent3 endif Так чтоль? |
Ответ: Советы по оптимизации
И еще вопросик, стоит ли заморачиваться с альфой, на определенном расстоянии видны low и high с плавным переходом и далле hideentity, или это уже слишком? )
|
Ответ: Советы по оптимизации
хз. надо играться. я думаю будет некрасиво.
|
Ответ: Советы по оптимизации
Цитата:
В GTA IV, ЕМНИП, модельки плавно менялись только на большом расстоянии, а на среднем только текстуры. Если нет сильно большого пространства, то не стоит замарачиваться вообще с lod'ом. |
Ответ: Советы по оптимизации
Вот спасибо, помогли!
Кстати, не знал что такое lod, тож спс ) Как думаете дупустим на сдщжное здание 3 уровня мешей нормально будет? |
Ответ: Советы по оптимизации
И еще, вопрос, у меня есть трава, состоящая из 3-5 плоских двухсторонних мешей с одним сурфейсом.
Стоит ли на расстоянии превращать их в один плоский меш, поворачивающийся к камере? |
Ответ: Советы по оптимизации
Цитата:
|
Ответ: Советы по оптимизации
Спасибо за развеивание сомнений! :)
|
Ответ: Советы по оптимизации
http://forum.boolean.name/showthread...225#post216225
Сектора (ячейки) перед зрением игрока становятся видимыми, остальные остаются скрытыми (ShowEntity | HideEntity). Кратко дополню (как я предполагал сделать): Например есть объект дерево. В type. Оно имеет две model и model_low. Когда нужно (вблизи) объект на карте (из того type) воспринимает хорошую model, в дали же отображает некачественную model_low. |
Ответ: Советы по оптимизации
Вопрос
Кто-нибудь знает. Есть ли разница в единицах? Например если я в блитце состряпаю мир в размерах не 1,2,10... а например 100000 размер машины, 1000к размер дома и т.д. и обзор камеры 100000к. Или вообще не важно какие размеры? |
Ответ: Советы по оптимизации
важно. с большими цифрами будут адовы глюки из-за погрешности флоата.
|
Ответ: Советы по оптимизации
Такой вопросик, ребята, посоветуйте плиз!
Начал создавать динамические частицы, когда их становится много - начинаю терять фпс, это отражается немного в проходе по списку частиц и сильно отражаеться на рендере. Вопрос: Можно ли, создавая частицы из плоских мешей, объединить в один сурфейс, но с возможностью обращаться к отдельным мешам? Либо может есть другие варианты оптимизации?? |
Ответ: Советы по оптимизации
Цитата:
|
Ответ: Советы по оптимизации
Придумал один геморный вариант - создать один меш, и под ним создавать треугольники с одним сурфейсом.
не проблема будет эти треугольники двигать, но вот поворачивать и изменять размер, вообще это того стоит, нет?? |
Ответ: Советы по оптимизации
Цитата:
Ну допустим я это сделаю, но как потом у треугольников менять размер и поворот? И не будет ли это еще медленнее работать? :-) |
Ответ: Советы по оптимизации
Вложений: 1
Цитата:
Создается 12500 частиц. Если их обновлять то фпс 35 где то, а если нет, то фпс 400+. |
Ответ: Советы по оптимизации
Офигеть!!
Запустил у себя, показал фпс 35 Подставил в твой пример обычный вариант (на один меш один сурф), вышло фпс 4 :4to: Вот это разница!! Дождался пока станет 1000 треугольников в рендере и все равно фпс 18 Спасибо большое, разбиру твой Мега-полезный пример! :) Правда не умею пользоваться чужими вариантами, мне легче для себя написать и разбирусь так лучше. И что ты считаешь недоделанным? |
Ответ: Советы по оптимизации
Цитата:
Ну и что нибудь еще тоже надо допилить. :) |
Ответ: Советы по оптимизации
|
Ответ: Советы по оптимизации
Цитата:
|
Ответ: Советы по оптимизации
Спасибо конечно, примеры красивые.
Но это закрытые библиотеки, я честно не умею ими пользоваться. Да и не научишься так ничему, ИМХО. |
Ответ: Советы по оптимизации
Цитата:
уметь там нечего - смотри примеры там все ясно |
Ответ: Советы по оптимизации
Цитата:
Мне и реально понравилось. Но разбираться мне тяжело в таких вещах, и открывать длл я не умею, и честно нет пока нужды. Пример от Nex'а мне понравился что я в коде сразу разобрался что и к чему, сразу потестил (выше) поставил к каждому мешу свой сурфейс и фпс упал с 35 до 4. - Наглядно, понятно, и поучительно. Вывод - пишешь функцию на один сюрфейс - и будут тебе супер-спец-эффекты ;) |
Ответ: Советы по оптимизации
Цитата:
|
Ответ: Советы по оптимизации
Цитата:
|
Ответ: Советы по оптимизации
Ищу, не могу найти, можно ли загружаемые меши объединить одним сурфейсом, но с возможностью обращения к отдельным мешам??
|
Ответ: Советы по оптимизации
Поразбирался, и понял что можно сделать через addMesh, но таким образом сложно будет удалить прикрепленный меш.
Может есть вариант запихнуть все это в анимМеш с иерархией, для дальнешей доступа к детям. Пользуюсь ксорсом, если есть варинты, буду ждать совета. |
Ответ: Советы по оптимизации
Смысл иметь аним меш для оптимизации нет, так как (ВРОДЕ) это тоже самое что и разные меши.
anim_mesh=for each mesh blitz3d оптимизируется, когда полигоны моделей соединяются в один меш (объект). |
Ответ: Советы по оптимизации
Хм, расскажу прикол, сделал в блитце повертексно траву, мне надо чтоб она была пучками. Т.е. я создавал билборды с одним центром и поворачивал их.
Потом решил попробывать создать тоже самое в 3д максе, и экспортировал в б3д, после чего фпс поднялось вроде как на 30%. Цитата:
|
Ответ: Советы по оптимизации
Цитата:
это НЕ будет как "много всякого в одном" а "много, но как будто бы вместе" (в общем блитз не будет обрабатывать их как одно целое) Делал я разработку SingleMesh (найти не могу, наверное удалил, так как смысла нет в single_meshe).. Думал соединить 100 коробок в один многополигональный меш или как разные entity_коробки. Так вот если делать игру DeltaForce на Blitz3D - то уж лучше делать много Entity (и делать обработку - LOD, cull и тп) чем один меш, который всегда отображается(обрабатывается куда ни гляди) разница на мощном ЭВМ была +15фпс в пользу энтитей |
Ответ: Советы по оптимизации
Начал пробывать LOD, получается не плохо. Правда идеально с билборда в меш не перейдешь, но вроде терпимо. Правда меня беспокоит не закончатся ли ресурсы проца?
Если не сложно, разберитесь немного в коде, все ли я нормально делаю Так я создаю траву, она у меня динамически ростет Код:
grass\entity=xCreatePivot() Код:
For i=1 To Ceil(grassCount/32.) |
Ответ: Советы по оптимизации
Посоветуйте товарищи, как быстрее будет работать.
Сделал LOD таким образом: Создал type, есть 4 поля, один пивот, к которому лепится 3 модели разного уровня. И в зависимости от расстояния до объекта 2 модели скрываются и нужная отображается. Вроде все неплохо. А лучше ли будет сделать просто одно поле для ентити, и при смене удалять один объект и загружать другой. Но не loadMesh конечно, copyEntity |
Ответ: Советы по оптимизации
Нет не лучше.
|
Ответ: Советы по оптимизации
Спасиб!
Еще вопросик. У кого-нибудь есть шейдер для плавного перехода от одной модели к другой?? Видел во многих играх, и смотрится клёво - глаза не режут переходы. Смотрится так, как будто одна модель исчезает а другая появляется частичками |
Ответ: Советы по оптимизации
Вряд ли у кого то найдётся такой шейдер...
|
Ответ: Советы по оптимизации
я играю в танки, там тоже такой шейд есть,
ковырялся, нашел файл shaders.pkg Как думаете, сильно геморно вытащить чтото от туда? |
Ответ: Советы по оптимизации
геометрия должна быть специально подготовленная для такого шейдера.
сам шейдер просто до безумия, просто некий lerp между позициями вершин меша, в зависимости от юниформа. |
Ответ: Советы по оптимизации
Да пусть даже не будет подготовлен, хотя я не представляю как меша можно подготовить, в нем вертексы, полигоны, фейсы, вроде ничего особенного..
|
Ответ: Советы по оптимизации
И мне кажется, HolyDel, ты преувеличиваешь, видно что по мере приближения просто весь меш начинает покрываться кусками альфы.
Мне пофиг будет ли это происходить от начала меша к концу или хаотично, главное чтоб не было резкого рывка в переходе от одного меша к другому. |
Ответ: Советы по оптимизации
оу. тебе по альфе. ну тогда просто скрывай один и показывай другой.
я думал что морфинг. |
Ответ: Советы по оптимизации
HolyDel, ну ты меня опять не понял. Один скрыл, другой показал - очень резко, глаза напрягает.
А если просто альфой, то будет много артефактов. А есть шейдер, который скрывает уже не нужный объект кусочками - как будто на объекте маска, и пиксели у нее рандомно исчезают Если играл в Doom3, мог там такое увидеть, когда трупы начинают исчезать - как будто сгорают |
Ответ: Советы по оптимизации
burovalex сделай LOD как в STALKERE или Crysis, забудь про всякие пиксели!
Стандартно LOD делается следующим образом делается от 2 до N количество моделей разного качества(количество полигонов,текстур - если двиг не умеет сам пережимать их и так далее). Если не нравится резкий переход моделей то тут только в помощь либо морф, как уже говорил HolyDel, либо теселяция. |
Ответ: Советы по оптимизации
я знаю о чём речь, раньше в играх любили делать по альфе переход из одного лода в другой, но чем сложнее становился рендер и геометрия, тем напряжнее было юзать повсюду альфабленд, поэтому щас много где (мафия2, гта4 итд) делают переход типа ноизом, исчезающий лод исчезает, теряя пиксели постепенно, новый лод появляется, набирая пиксели на экране.
сделать такое просто - имеешь ЧБ текстуру ноиза, проверить можешь её сразу в шопе с помощью image->adjusments->threshold, у тебя должно выйти, чтобы при кручении слайдера картинка переходила из чёрной в белую шумом. дальше делаешь тот же threshold в шейдере, наподобие float clipMask = tex2D(noise, IN.TexCoordsForMask).r; // TexCoordsForMask могут быть в скринспейсе полученные из VPOS, могут быть обычные, надо смотреть как лучше if (clipMask*maskVisibility < clipThreshold) discard; |
Ответ: Советы по оптимизации
Спасибо Mr_F_ сам я шейдер пока такой не напишу, я только начал их изучать, думал может есть готовый вариант.
Я вот подумал, а если на мешу накладывать 2-ю ЧБ текстуру, и блендом смешивать с альфой, и эту ЧБ текстуру рандомно заполнять белым. Если вариант, то как думаете, по быстродействию с шейдером сильно отличаться будет? |
Ответ: Советы по оптимизации
без шейдера можно сделать в DX с помощью D3DRS_ALPHAREF. в ксорсе, насколько я помню, есть функция xSetAlphaRef для того же самого.
в блице никак/плагином/через задницу. |
Ответ: Советы по оптимизации
Вот спасибо Mr_F_!! У меня как раз ксорс. Я совсем про эту функцию забыл) Я ей пользовался когда на меш накладывал маскированную текстуру, она хорошо сглаживает резкие края.
Попробую, что получится отпишусь :) |
Ответ: Советы по оптимизации
Не работает (
Код:
Global ref=0 Походу буду учить правописание шейдеров.. У меня вот вопросик такой родился ) Через шейдер быстрее обрабатываются меши, чем стандартно? Если да, то что, все меши можно прогонять через него или не вытянет? |
Ответ: Советы по оптимизации
Цитата:
поэтому я и расписал какую текстуру ноиза тебе надо сделать для альфы. Цитата:
|
Ответ: Советы по оптимизации
АААааа, теперь понял) Таким методом на каждом объекте будет альфа. А это не есть хорошо, потом артефакты вылазить начнут.
Я всё таки решил попробывать через шейдеры. Даже кое что научился. Но вот одно не могу понять. У меня например есть такой код пикс. шейдера: Код:
float4 tex = tex2D(Texture0, TEXCOORD0); Конкретно мне нужно просто альфу изменять. Чтоб выглядело так Код:
return r,g,b,alpha*distance; Код:
float3 rgb=...; |
Ответ: Советы по оптимизации
Цитата:
Цитата:
return float4(tex.r, tex.g, tex.b, tex.a*distance); |
Ответ: Советы по оптимизации
Вот спасибо тебе, Mr_F_!!!
Я вообще тобой поражаюсь. На любой вопрос можешь ответить! |
Ответ: Советы по оптимизации
Блин, ничего не могу понять
Короче нашел програмку для написания шейдера, RenderMonkey. Все получалось. А вот щас начал писать как ты предложил, и у меня альфа вообще не меняется на пред. просмотре. Даже пробывал так написать return float4(0.5 ,0.5 ,0 , 0); Цвета меняются, а альфа вообще не шевелится..... |
Ответ: Советы по оптимизации
Цитата:
xEntityAlpha достаточно в ксорсе, чтобы включить альфаблендинг на объекте. но для исчезания объектов ноизом альфа не нужна (!). если ты можешь её для этого юзать, то не парься, а тупо плавно её вводи-уводи у лодов, будет только лучше смотреться. фишка попиксельного исчезания именно в том, что не нужно юзать полупрозрачности - нужно просто выкидывать пиксели. забей на альфа компоненту и юзай функции clip/discard. |
Ответ: Советы по оптимизации
Всё понял, кроме функций. Что такое clip discard?
|
Ответ: Советы по оптимизации
эти функции применяются в пиксельном шейдере.
clip функция, которая отбрасывает(не рисует) пиксель если ее аргумент меньше нуля. discard отброасывает пиксель в любом случае |
Ответ: Советы по оптимизации
Discart я чтото даже в майкроовской библиотеке не нашел http://msdn.microsoft.com/en-us/library/bb204826
Зато там нашел пример с Clip И чтото я его немного не понял, т.к. он не полный Код:
clip( Input.Color.A < 0.1f ? -1:1 ); Я понял что проверяется условие при котором отсеивать пиксель, но не понял что значит " ? -1 : 1 " Может это означает что при false = -1 , а при true = 1 ? И где эту функцию использовать надо тоже не понял на выходе, или внутри программы пикс. шейдера... может так? Код:
return float4 (clip(color.r<20 ? -1:1),color.g,color.b,color.a) |
Ответ: Советы по оптимизации
это оператор вопроса
(expression)?(true expression) : (false expression) Цитата:
Цитата:
Код:
clip(color.r<20 ? -1:1); |
Ответ: Советы по оптимизации
Вложений: 1
КРУУТААА!!! :compl:
Всё работает!! :ap: СПАСИБО ВСЕМ ОГРОМНОЕ ЗА ПОМОЩЬ!!!!! :bravo: оказалось все просто Vertex shader Код:
float4x4 matViewProjection; Код:
sampler TX1; Теперь такой шейдер я хочу наложить на на 3 уровня мешей (low,normal,hi) и должно получится так, что один меш начнет срезаться, а другой на месте среза появляться. Вот только есть одно но - меш который будет normal, должен исчезать на одной дистанции и появляться на другой. Можно ли использовать оператор AND? т.е. Код:
clip(DIST<300 AND DIST>1000 ? -1:1); |
Ответ: Советы по оптимизации
Цитата:
Цитата:
|
Ответ: Советы по оптимизации
У меня опять косяк с шейдером. Я думал что сюда:
Код:
texture iTEX; Код:
float4x4 matWVP; |
Часовой пояс GMT +4, время: 03:45. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot