Или вот, как понять этот профилировщик студии
у меня вообще сцена пустая, не говоря уже о физике, какой еще NodeCollision )
а где можно скачать твою тестовую сценку со спрайтами? glDebuger'ом мб прогнать глянуть какие там наиболее часто вызываемые ф-и в цикле, я помню что glUniform... наиболее часто "мелькала" и поэтому я что-то пытался сделать с UBO. Кстати ты не пробовал под DX11 собрать? Гл-рендерер все-таки медленнее сам по себе, и на ХNA явно не GL юзается
по-моему все достаточно наглядно с VS дебагером, тут в сцене три кубика + пол, на которые смотрит камера +2 источника света и видно что шадов мапа рисуется дольше чем сами коробки с полом )

> Кстати ты не пробовал под DX11 собрать?
пробовал, вот разница в фпсах http://urho3d.prophpbb.com/topic596-10.html
печаль в том, что xna использует DX9, а на DX9 у меня еще меньше фпс )
ну на первый взляд имхо проблема в том что graphics->GetShader очень тормозная ф-я, а ты её зовешь для каждого спрайта когда пушишь их в пулл ( sprites_.Push(sprite);) тебе нужно вынести это перед spriteBatch_->Begin(); т.е. сначала генерация шейдера для группы, а потом уже создание этой группы с уже собранным и найденным шейдером.
У меня кстати 100000-200000 спрайтов видяха загружена на 7-10% (GPU-z) ) и 12 - 11 фпс, CPU - 32%.
Я не в курсе отражает ли GPU-Load загрузкy по филлрейту или только шейдерных блоков SMX, мб уперлось в филл-рейт ?
Да, я выносил GetShader наружу и получил плюс один фпс, что всего 2%
> У меня кстати 100000-200000 спрайтов видяха загружена на 12-14% (GPU-z) ) и 12 - 11 фпс
сдается мне затык не в видюхе и не в процессоре, а в шине, потому как каждый кадр новый меш передается
EDIT: и вообще полагаться на тайминги в дебаг версии вообще не правильно, в дебаг версии у меня даже от небольшого изменения в коде фпс скачет туда сюда,
а в релизной версии чтобы я не делала фпс один и тот же)) уж больно там много всяких проверок в дебаг версии - границы массивов и прочее, поэтому и выдает результат, что GetShader тормозной, так как там поиск уже загруженных шейдеров по хештаблице
>а в шине
PCI-E ? А как посчитать, что у нее там за параметры по пропускной способности?
я не знаю
Скомпилировал релиз с отладочной информацией (чтобы имена функций были доступны и коды был сгенерировал как релизный),
GetShader() вместо 45% стал расходовать 25%, и что интресно - основные затраты времени даже не поиск по хеш-таблице, а вычисление хеша для поиска в хештаблице )
угу что-то с этим вычислением нечисто
потом после Clear можно сразу сделать ресервед для вектора
sprites_.Clear();
sprites_.Reserve(reserved_);
а ресервед задавать перед циклом
spriteBatch_->Begin();
spriteBatch_->Reserve(100500);
for (int i = 0; i < 100000; i++)
Оно расширяет емкость (capasity) до нужного размера по мере надобности, но никогда не уменьшает, так что после первых нескольких кадров емкость списка настолько большая, насколько необходимо.
Залил коммит с кеширвоанием GetShader() в репозиторий, хоть профайлер и показывал 25% нагрузки изза этого шейдера, дало только один фпс в результате )
Зато теперь судя по профайлеру основная нагрузка ушла в bool VertexBuffer::SetData(const void* data), т.е. на передачу данных на видюху. На этом мои полномочия все, если не придумать что-то принципиально иное)
попробовал убрать VertexColor из вершины и в релизе с 77 фпс поднялся(100к спрайтов) до 112 но Bus interface load только 25% в пике был, GPU - 56% Mem - 50% притом что видяха работала в каком-то щадящем режиме на 700mhz
странно все это, нигде ниче не нагружено, но фпс не апается
вот так уперся в 200фпс с теми же 100к спрайтами, наверное лимит ухи?
void SpriteBatch::Draw(Texture2D* texture, Rect& destination, Rect* source, Color color, Vector2 origin, float rotation, SBEffects effects) { static Graphics* graphics = GetSubsystem<Graphics>( ); static ShaderVariation* cvs = graphics->GetShader( VS, "Basic", "DIFFMAP"); static ShaderVariation* cps = graphics->GetShader( PS, "Basic", "DIFFMAP"); SBSprite sprite { source ? *source : Rect( 0, 0, texture->GetWidth( ), texture->GetHeight( )), destination, color, origin, rotation, texture, SBE_NONE, cvs, cps }; //graphics->GetShader(PS, "Basic", "DIFFMAP VERTEXCOLOR") sprites_.Push( sprite); }
cpu - 30%
gpu - 60%
mem псп- 40%
bus interface - 12%
Тема в архиве.