Суббота, 23 Ноября 2024, 21:07

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Результаты поиска
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 И да, сорри, в двух словах не получилось happy


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 ()
нужно все эти матрицы в текстуру грузить, тогда они работают намного быстрее, потому-что видео карте работать с текстурами нанмого проще, как раз это и есть псевдоинстансинг

Да, это довольно прикольный вариант smile , но минус всех "псевдоинстансингов" в том, что нужно хранить полностью всю отрисовываемую геомеотрию, а не только один инстанс. В реале можно хранить столько, сколько планируется на один 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 полигонов, и на неё уже вешать всевозможные нормал мапы, это и смотрится лучше, да и сетка эстетична

Дык так обычно и делают, репотологию в первую очередь именно для этого и используют smile

Цитата BESS55555 ()
Есть ли в мудбоксе редактор развёртки и насколько он удобен?)

Не, там есть генератор (вроде есть, ни разу не пользовался happy ), но редактора нет. За редактором добро пожаловать в Max/Maya/Blender/etc smile


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() я совсем забыл smile

Цитата warzes ()
back() возвращает последний элемент (forward() - первый элемент)

А вот первый возвращает вообще-то front() smile


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++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг