Результаты поиска
| |
Archido | Дата: Понедельник, 16 Декабря 2013, 12:58 | Сообщение # 101 | Тема: Вопрос-Ответ (C++) |
Сэнсэй
Сейчас нет на сайте
| Цитата stalker5889 ( ) По умолчанию C++ не может определить будет вызываться basic или child, так как явно написано: void fn(basic& obj) что подразумевает использование класса basic. Это раннее связывание которое требует меньше ресурсов и оставлено по умолчанию для совместимости с Си. Слово virtual заставляет осуществить позднее связывание то есть подставить в аргумент нужный класс (basic или child) динамически во время выполнения. Не совсем так. Аргумент (тобишь наш класс) всегда передается один и тот же, и компилятору ничего не нужно с этим делать. Для классов с полиморфизмом (где есть virtual) и "обычных" классов вся разница лишь в способе вызова их методов.
Если взять "обычный класс", то код, приведенный выше, будет преобразован компилятором в некий псевдокод: Цитата void fn(basic& obj) { basic::Func(obj); } Т.е. в данном случае (в виду отсутствия полиморфизма) компилятор явно подставит конкретный метод того класса, который указан как тип аргумента fn. И без разницы какой потомок будет передаваться в эту ф-цию, вызываться всегда будет basic::Func.
В случае с полиморфизмом, способ вызова методов совершенно иной: Цитата FuncId = 1; void fn(basic& obj) { obj.vtbl[FuncId]::Func(obj); } Суть в чем. У каждого полиморфного класса есть скрытое поле - vtbl, это указатель на таблицу виртуальных ф-ций конкретного класса. У каждого класса (именно класса, не экземпляра) своя такая таблица, поэтому по ней, зная некий Id ф-ции, можно сделать выборку из таблицы, получить указатель на метод и его вызвать. Поэтому в примере выше, в зависимости от того, что придет в ф-цию fn - класс basic или child, будет произведена выборка из разных таблиц виртуальных ф-ций и как следствие - вызов метода Func() необходимого класса.
Если в классе появляется хоть один виртуальный метод, то этот класс и все его потомки автоматически становятся полиморфными.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Воскресенье, 27 Октября 2013, 16:43 | Сообщение # 102 | Тема: c++ и template |
Сэнсэй
Сейчас нет на сайте
| froex Елы-палы, как не стыдно:) Как ты можешь скомпилировать "раздельно" обобщенный шаблон?:) Что компилятор по твоему должен делать с типом, про который он ничего не знает? Он ведь понятия не имеет, что ты подставил туда в другом .cpp файле, на то она и раздельная компиляция.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Воскресенье, 27 Октября 2013, 16:46 |
|
| |
Archido | Дата: Воскресенье, 27 Октября 2013, 05:58 | Сообщение # 103 | Тема: Что написать? |
Сэнсэй
Сейчас нет на сайте
| Deswing Зачем консоль? Где красявая игра про космоc?:)
Цитата Deswing ( ) Хочу что-нибудь интересное... Что-то "эдакое"
Не совсем консоль конечно, но рядом:)
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Воскресенье, 27 Октября 2013, 06:00 |
|
| |
Archido | Дата: Воскресенье, 27 Октября 2013, 05:53 | Сообщение # 104 | Тема: c++ и template |
Сэнсэй
Сейчас нет на сайте
| Цитата avolkoff ( ) а вот определение шаблонных функций в отдельном файле кода никак... По крайней мере у меня ничего не вышло, такие же ошибки линковки, что логично) Ессно, во всем "виновата" сишная раздельная компиляция:) Поэтому все темплейты (не специализированные) должны находится в хедерах.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Воскресенье, 27 Октября 2013, 05:44 | Сообщение # 105 | Тема: Оптимизация сцены где очень много объектов |
Сэнсэй
Сейчас нет на сайте
| Цитата robertono ( ) повторишь в двух словах что ты предлагал? White9 хорошо описал общий вид в своем посте
Ну, а так ты уже сам фактически дошел до этого. Я как раз и предлагал не работать с каждый кубом по отдельности, а группировать некоторое их количество в один меш и при необходимости подменять этот меш на набор кубов-объектов (общий вид). Собственно, MeshCombine сам делает почти тоже самое. Он упаковывает всю геометрию в единый буфер (меш) и эффективно ее рисует, но при этом сохраняет сами первоначальные объекты, так что к ним можно получить доступ (вместо подмены в моем случае, но суть таже). Естественно, что общую модель нужно разбивать на части (здание я предлагал разбивать на "этажи") и их уже "комбинировать", что при изменении и "рекомбинировании" будет работать быстрее.
В добавок, чтобы небыло сильных лагов (подвисаний) когда ты делаешь "кобмайн", можно размазать этот процесс во времени, т.е. делать одну такую операцию на кадр. Добавляешь например, объекты, которые нужно объединить, в очередь и раз в кадр извлекаешь оттуда объект, "комбинируешь" и так пока очередь не опустеет. Ну и само собой, объединять нужно только тогда, когда игрок перестал "взаимодействовать" с определенным мешем (переключился на другой, удалился на некоторое расстояние, etc), чтобы лишнюю работу зря не делать. Здесь бы очень пригодился инстансинг, но как им пользоваться в Unity я понятия не имею:)
P.S. Единственное, что не очень хорошо: используя MeshCombine, нельзя отделить визуальную часть от физической. Каждая копия физической порождает копию визуальной, что представляет собой некоторый оверхед по памяти. Если у нас есть штук 20 зданий и все они пока находятся в "целом" состоянии, то для их отрисовки требуется всего лишь одна визуальная часть "этажа" (да и физических пока не требуются), в случае с MeshCombine'ом в памяти будут находится все этажи албсолютно всех зданий, причем как визуальной части, так и физической.
В этой задаче очень хорошо бы подошел вариант с псевдоинстансингом и текстурами, о котором упоминал Xakep, но похоже это тема уже не для Unity раздела:)
P.S.S И да, сорри, в двух словах не получилось
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Воскресенье, 27 Октября 2013, 05:44 |
|
| |
Archido | Дата: Суббота, 26 Октября 2013, 17:27 | Сообщение # 106 | Тема: Оптимизация сцены где очень много объектов |
Сэнсэй
Сейчас нет на сайте
| Цитата KamiRonin ( ) Unity работает с C# (+ javascript) а это формальный язык проходящий через ДВЕ трансляции.. Сделал домашнее задание? Ай маладца. Unity на C# написан или может на ассемблере? Тогда в несколько раз быстрее будет, камиронин знает о чем говорит, лол.
Цитата KamiRonin ( ) Так что можешь не сомневаться -- ассемблер будет работать в несколько раз быстрее... Да я и не сомневаюсь, ты же лично свечку держал, как тут можно усомниться:)
Цитата KamiRonin ( ) на чем надо програмить чтобы этого не знать. это ж азы! Действительно. Юнити-выкормыш во всей красе:)
Цитата KamiRonin ( ) да уж поржал с твоими постами не по детцки! А ты все продолжаешь меня веселить:) Да и смотрю ты не только меня одного уже успел посмешить.
Цитата KamiRonin ( ) внутри основного объекта в который сливается единый меш - остаются все дочерние ссылки, но не меши. поэтому по простой команде - получаешь доступ к любому из них и Destroy или transform.position... но тогда нужно рекомбинировать меш заново. а это не есть хорошо. а так - доступ в легкую и модификация на раз... Короче, комбайн делает половину того, что я предложил:) Только в готовом виде.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Суббота, 26 Октября 2013, 17:12 | Сообщение # 107 | Тема: c++ и template |
Сэнсэй
Сейчас нет на сайте
| Если класс темплейтный, то он полностью должен определяться и реализовываться в .h файле. Никаких .cpp.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Суббота, 26 Октября 2013, 15:36 | Сообщение # 108 | Тема: Оптимизация сцены где очень много объектов |
Сэнсэй
Сейчас нет на сайте
| KamiRonin Уты, какой однако выхлоп, доставило. Остались еще на свете кадры у которых асм +100 к скорости дает:)
Цитата KamiRonin ( ) ты свое талдычишь - "сделай цельную модель и тогда все полетит" Так оно и правда полетит, просто ты не способен это осознать, ты ж понятия не имеешь как оно там рисуется на самом деле. Да и я только предложил способ и причем абсолютно не тебе, но у кого-то начался батхерт и проблемы с осознанием(чтением):) Вообщем, повеселились и пойдет. Срач тут точно никому не нужен.
Цитата robertono ( ) combinemeshes очень крутая вещь... Кстати, а после него кубы обратно выудить возможно или нет? И если да, то насколько быстро? Вот скажем закомбайнил ты здание и хочешь оттуда парочу кубов удалить \ переместить, как это будет происходить? Спортивный интерес.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Пятница, 25 Октября 2013, 08:20 | Сообщение # 109 | Тема: Вопрос-Ответ (C++) |
Сэнсэй
Сейчас нет на сайте
| Хм, а почему бы не сделать внутри цикла с Bullet вложенный цикл с Enemy и тоже на итераторах?
Код /////////////////////////////////////////////////////////// bullets for(auto Bullet = b.begin(); Bullet != b.end();)//обработка механики пули { bool Collision = false;
for(auto Enemy = e.begin(); Enemy != e.end();) { if(Bullet->isCollision(*Enemy)) { Enemy->Spawn(res); Enemy->Destroy(); e.erase(Enemy);
Bullet->Destroy(); Bullet = b.erase(Bullet);
Player::Score++;
Collision = true; break; } }
if (Collision == false) Bullet++; }
А "vector iterator not derefencable" обычно вываливается, когда итератор невалиден, т.е. указывает в "никуда". Такое может быть, например, при попытке получить и разыменовать итератор у пустого вектора.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Пятница, 25 Октября 2013, 08:08 | Сообщение # 110 | Тема: Оптимизация сцены где очень много объектов |
Сэнсэй
Сейчас нет на сайте
| Цитата KamiRonin ( ) у меня - нет. как был 68 fps так и остался. Раз у тебя кол-во вертексов сильно не изменилось, то ты поменял шило на мыло. Забей один этаж в "префаб" (в "один кусок геометрии") и собери из него такое же здание, как и из кубов. И сравни производительность, для пущего эффекта можно кол-во зданий увеличить до нескольких десятков.
Цитата KamiRonin ( ) оклюжн для того и создан чтобы исключать. он быстро работает и оверхеда здесь не вижу никакого. тем более жестокого. Твой "оклюжн" захлебнется, когда таких зданий из 5К кубов будут десятки и больше. Особенно когда процессор будет занят просчетом физики или игровой логики.
Цитата KamiRonin ( ) на здоровье! (зачем буковки разводить про то что с самого начала было отвергнуто за ненадобностью?) Дык, если бы ты все понял с первого раза, то мне бы и не пришлось бы "буковки разводить", лол. Хотя похоже это действительно бесполезно.
Цитата KamiRonin ( ) при загрузке - это для тебя реалтайм? Реалтайм - во время "апдейта" или "рендера". Все, что происходит до запуска игрового цикла - это оффлайн.
Цитата KamiRonin ( ) то они просто - один кусок геометрии! и нет там кубов! Я рад, что ты понял хотя бы это. Там есть кубы, они просто только визуальные:)
Цитата KamiRonin ( ) как потом найти место для второго сверху на два вглубине?!? пересчитывать все координаты?!?! Омг, ты действительно через пару строчек читаешь или не способен думать. У тебя есть "один кусок геометрии" в виде одного объекта, у него есть позиция и Bounding Box, с которым можно "взаимодействовать" при необходимости. И есть большая пачка кубов-объектов (визуально они выглядят в точности как "один кусок геометрии"), которые объедены в иерархию и у них один объект родитель (Node), который тоже имеет свою позицию. В результате, когда какой-то игровой объект или игрок "взаимодействует" с Bouinding Box "куска геометрии" (коллизии, raycast, да что угодно), то ты просто подставляешь в позицию этого "куска" - объект Node с пачкой объектов-кубов и уже им делегируешь конкретное "взаимодействие" конкретного игрового объекта. Ферштейн?
Хотя, все равно ничего не взлетит. Если в здании 4300 кубов, то это 4300 * 12 = 51600 трианглов на модель. Столько даже на игровых персонажей редко позволяют тратить:)
Xakep Мою идею действительно так сложно понять?:) Хотя может я чего-то не понимаю и на Unity подобное сделать мегасложно, но в таком случае Unity немного уныл:)
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Четверг, 24 Октября 2013, 15:10 | Сообщение # 111 | Тема: Оптимизация сцены где очень много объектов |
Сэнсэй
Сейчас нет на сайте
| Цитата Xakep ( ) нужно все эти матрицы в текстуру грузить, тогда они работают намного быстрее, потому-что видео карте работать с текстурами нанмого проще, как раз это и есть псевдоинстансинг Да, это довольно прикольный вариант , но минус всех "псевдоинстансингов" в том, что нужно хранить полностью всю отрисовываемую геомеотрию, а не только один инстанс. В реале можно хранить столько, сколько планируется на один DIP рисовать и только разные текстуры подсовывать:) , но тут без "тонкой" ручной настройки не обойтись, Unity так врятле сумеет. Еще кстати, Lock текстуры (если нужно какие-то матрицы обновить) довольно противная операция, т.к. блокирует весь конвеер из-за синхронизации между CPU и GPU во время передачи данных. Поэтому оно больше для нечасто изменяемых объектов подходит, но в данном случае это наверное самое оно.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Четверг, 24 Октября 2013, 14:04 | Сообщение # 112 | Тема: Оптимизация сцены где очень много объектов |
Сэнсэй
Сейчас нет на сайте
| Цитата KamiRonin ( ) я сделал для опыта встроенный в Unity Mesh.CombineMesh и у меня с этим зданием DC стал 8-14, а был 1840. при этом странное дело - увеличивается (!!) количество вертексов и трисов. хоть незначительно но все таки. и на скорость это не влияет. Влияет. Одно дело когда ты рисуешь геометрию за 8-14 DIPов и передаешь туда 8-14 transform матриц, и совсем другое, когда ты пытаешься рисовать 1840 отдельных кубов, включаешь и готовишь инстансинг, в процессе передавая из оперативной в видеопамять 1840 матриц. Это Hardware Instancing и даже он медленее, чем просто "голую" геометрию рисовать.
Цитата KamiRonin ( ) а там не надо их проверять. ОС сам вырубит из обработки все, что вне поля зрения Т.е. "OC" все вырубит тоже при помощи магии? Ну ок.
Цитата KamiRonin ( ) 1. робертону смысл как раз не в едином монолите здания, а в "разбиваемых" кубах. Спасибо, кэп.
Цитата KamiRonin ( ) 2. внутри MinePckg как раз реализована идеальная технология одного DC на весь меш получившегося "здания". Если там realtime, то оно все равно будет тормознее, чем с заранее подготовленной геометрией работать.
Цитата KamiRonin ( ) во первых нужно как то узнать что будет вовлечено Проблем не вижу.
Цитата KamiRonin ( ) во вторых произвести АДЕКВАТНУЮ замену в кубах Ты похоже через строчку читал. Есть куча кубов, упакованная в один кусок геометрии (грубо говоря этим кубам сделали "батчинг" в оффлайне, в добавок можно повыкидывать стороны соприкасающихся кубов, что поможет сэкономить polycount) и которая представлена одним объектом. В чем сложность заменить один объект из кубов на пачку точно таких же, но представленных как отдельные объекты?
Весь профит здесь в том, что едва ли все объекты в игре будут сразу же разрушены. Куча объектов или их частей с которыми игрок еще не взаимодействовал будут отрисовываться с максимальной эффективностью.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Четверг, 24 Октября 2013, 12:00 | Сообщение # 113 | Тема: Оптимизация сцены где очень много объектов |
Сэнсэй
Сейчас нет на сайте
| В любом случае один DrawCall на куб - это слишком жирно, даже с учетом использования батчинга (или инстансинга). Волшебным образом сотни DC не превращаются в один, для этого рендер должен выполнить некоторую работу и постоянно передавать данные из оперативной в видеопамять, вообщем все это занимает время. Occlusion culling'ом кубы проверять - тоже жесткий оверхед.
Выходом может бы работа на уровне выше, чем просто один куб. Скажем, для здания в первом посте можно один этаж из кубов просто объединить в единый меш, т.е. в один кусок монолитной геометрии. Можно объединять даже в два и более этажей. Если предположить, что в здании 10 этажей и один состоит из 50 кубов, то при отрисовке по одному кубу рендеру нужно собрать 10 * 50 = 500 инстансов в один буфер. Если у нас есть полноценный готовый этаж, то мы просто рисуем 10 этажей и работаем всего лишь с 10-ю инстансами, вместо 500. Для 6 зданий разница будет между 60 и 3000 инстансами, что как бы намекает. В случае, если какое-либо здание или его часть собирается разваливаться, то перед этим просто конкретный "этаж-меш" заменяется на такой же набор уже отдельных кубов и к ним применяется физика например.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Среда, 23 Октября 2013, 15:09 | Сообщение # 114 | Тема: Вопрос-Ответ (C++) |
Сэнсэй
Сейчас нет на сайте
| GameMix "Shellapi.h" ?
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Понедельник, 21 Октября 2013, 17:30 | Сообщение # 115 | Тема: Вопроч для тех, кто заказывал изза границы |
Сэнсэй
Сейчас нет на сайте
| Цитата vasua99 ( ) Но есть пару вопросов. Если я закажу доставку с помощью Priority Mail International(Бандеролька), то мне не придется ехать на растаможку и заполнять документы? В РФ таможенный лимит составляет в данный момент 1К евро, поэтому если его не превышать, то и пошлину платить не нужно. А в случае с почтой (USPS, твой случай) - даже если и превысить, то оплата пошлины производится в почтовом отделении перед выдачей посылки. Все просто. Проблемы могут возникнуть только с курьерскими службами вроде UPS / Fedex, где и лимит маленький и нужен таможенный брокер, т.к. физ. лица они не "таможат".
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Суббота, 12 Октября 2013, 13:44 | Сообщение # 116 | Тема: Вопросы по Mudbox |
Сэнсэй
Сейчас нет на сайте
| Цитата BESS55555 ( ) В данном случае я применяю ретопологию, не для того, чтобы оптимизировать лоу, напротив, добавить полигонов и сделать сетку эстетичной и "размерной" для упрощения дальнейшей анимации модели Я не большой спец, но по моему проще добавить какое-то количество доп. лупов в необходимых местах (в местах изгибов для анимации, например), чем делать репотологию и заново пилить развертку. Понятно, что "эстетичность" сетки так особо и не исправишь, но тогда вообще проще изначально делать правильно:) , делая hi -> low.
Цитата BESS55555 ( ) Просто если речь идёт создании монстров и тд. и тп. для меня, было бы проще изначально делать модель хайрезной, затем с помощью ретопологии создать оптимальный вариант лоуполи например в 3000 полигонов, и на неё уже вешать всевозможные нормал мапы, это и смотрится лучше, да и сетка эстетична Дык так обычно и делают, репотологию в первую очередь именно для этого и используют
Цитата BESS55555 ( ) Есть ли в мудбоксе редактор развёртки и насколько он удобен?) Не, там есть генератор (вроде есть, ни разу не пользовался ), но редактора нет. За редактором добро пожаловать в Max/Maya/Blender/etc
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Суббота, 12 Октября 2013, 12:04 | Сообщение # 117 | Тема: Вопросы по Mudbox |
Сэнсэй
Сейчас нет на сайте
| Нельзя. Да и зачем? Все таки ретопо делают обычно хайрезным моделям, которые не имеют UV, а лоурез проще и быстрее руками сооптимайзить, чем всю топологию переделывать.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Пятница, 11 Октября 2013, 11:32 | Сообщение # 118 | Тема: Assembler |
Сэнсэй
Сейчас нет на сайте
| Цитата Deswing ( ) Откуда??? Как??? Почему произойдет a*b??? Книжку почитать, не? И не будет вопросов.
Цитата Deswing ( ) А как число тогда в квадрат возвести? Нет специальных фич? Лишь число само на себя? Все руками.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Archido | Дата: Пятница, 11 Октября 2013, 10:42 | Сообщение # 119 | Тема: Вопрос-Ответ (C++) |
Сэнсэй
Сейчас нет на сайте
| О, точно, про back() я совсем забыл
Цитата warzes ( ) back() возвращает последний элемент (forward() - первый элемент) А вот первый возвращает вообще-то front()
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Пятница, 11 Октября 2013, 10:50 |
|
| |
Archido | Дата: Четверг, 10 Октября 2013, 13:50 | Сообщение # 120 | Тема: Вопрос-Ответ (C++) |
Сэнсэй
Сейчас нет на сайте
| Цитата goldsphere ( ) тут вот какая фишка. Если не так, то у меня будет обрабатываться один и тот же элемент пока старый не удалится. То есть он должен пройти по всему вектору и если надо удалить. Так ты после "vector.erase" делай "continue" и будет счастье.
Цитата goldsphere ( ) То есть правильно так (--b.end())->Create(mouse, p); ? Можно и так, но правильнее обращаться к отдельному элементу все таки так: b[b.size() - 1].Create(...)
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
|