Так же делаю. Объекты, лежащие в контейнере хрянат указатель на него. Просто и удобно.
Запустилась первая сборка... Избавился от Object.Relase выкинув указатели и подсунув нужные обьекты в шейдеры и текстуры... Решил воткнуть костыль...
Делаю следующий обьект - Render2D.
'[------------------Render----------------------------] '[------Render2D----------------][------Render3D------] '[Sprite][FontManager][---GUI---][....................] ' [Font] [Controls]
Вопрос в том каково его значение? Что нужно на этом уровне?
Вот мои мысли на этот счет:
- виртуальная камера
- батч буфер(в связи с чем все установки стейтов перейдут в этот интерфейс что-бы отлавливать их смену и начинать новый батч)
- установка стейтов бленда
- установка стейтов смешивания текстур и др.
Нужно-ли на этом уровне организовывать низкоуровневый интерфейс отрисовки спрайтов? Т.Е. функции Draw, DrawRect, или непосредственно формировать буфер в высших интерфейсах, затем передавать его Render2D... И вообще нужен ли батч?
Не знаю на каком уровне но нужна тайловая карта. Многослойная, с поддержкой изометрии, рендомизации, рисования заданной области и отброс не видимых текстур.
Morhoom
>тайловая карта
>отброс не видимых текстур
Была в старых версиях... Сейчас возможно будет два класса:
Sprite - отрисовка области текстуры(можно и всей)
SpriteMap - атлас с поддержкой анимации
Morhoom
> Многослойная
> рендомизации
Эт как?
Morhoom
> изометрии
Изометрия эт уже 3D песня...
Это тогда, когда я вызываю 10-15 функций и получаю леса с грибами, поля с цветами, водоёмы, пески, скалы.
Тестирую батчинг... Если ресайзить буфер при добавлении нового спрайта жутко падает производительность...
ReDim тормозная весч...
На статическом буфере
Dim Buf(100000)
результаты тестов(30351 спрайт с текстурой):
Без батчинга: 21fps
Батчинг с разными стейтами: 26fps
Батчинг: 70fps
Прирост довольно значительный...
П.С. Вывод через DrawPrimitiveUp D3DPT_TRIANGLELIST без индексов...
Батчить спрайты можно добавляя геометрию в буфер при вызове соответствующей функции...
А как батчить вызовы отрисовки текста, если на выходе уже готовый буфер? Через CopyMemory - долго... Есть еще варианты?
Или встроить батчинг прямо в текстовй рендер? Мне кажется так выйдет костыль, да и к тому же постоянный ReDim...
max255
> постоянный ReDim
Выделяй и освобождай память порциями, скажем, по 16 кБ.
Mikle
Точно... Хорошая идея...
Стоит ли делать батчинг линий? Это соответственно добавит несколько условий в перестройку батча, соответственно и времени... Но стоит ли оно того?
Батчинг линий - совершенно отдельный от спрайтов.
А как можно отлавливать что нужно вывести батч?
- при изменении стейта
- текстуры
- шейдера
- константы шейдера
- трансформации
Так как же можно отлавливать такое количество контролов разнесенных по разным интерфейсам?
Я думаю, что всё автоматизировать не получится, надо будет всё равно самому запускать батчи, соответственно строить архитектуру программы.
Mikle
А что если в каждый интерфейс контроля(стейты, текстуры, шейдеры) добавить функции слежения т.е.
Shaders.ClearChanges Shaders.SetVertexShader id If Shaders.isChanged Then ' изменились настройки шейдеров End If
?
Вариантов много, можно сделать структуру со всеми стейтами, подлежащими отслеживанию, при попытке сменить како-нибудь из таких стейтов проверять, не равен ли он уже нужному значению, и только если не равен, то устанавливать и заносить в структуру новое значение.
Mikle
Помнится ты говорил что нужно подходить к архитектуре, в которой пользователь меньше всего будет взаимодействовать с директом напрямую...
Начал писать буферы стейтов как в 357 посту... Понял что ошибся... Т.К. нужно батчить спрайты в буфере перед установкой нового стейта, а не после...
Рассматривал вариант буферизации стейтов, Т.Е. стейты устанавливаются не сразу, а в буфер. При такой установке ставится флаг что буфер изменился...
При отрисовке нового батча проверяются все эти флаги и готовый буфер устанавливается... Мне кажется это слишком накладным... К примеру при батче 1 спрайта будет каждый раз ставится около 300 стейтов + константы шейдеров + ....
Может пора уже отойти от прямого директовского интерфейса и реализовать только самые нужные в 2D функции. Реализовать их в Render2D и отлавливать их уже на этом уровне будет намного проще, т.к. интерфейс батчинга находится тут же(Render2D).
Возникает вопрос что нужно в 2D из базовых функций? Смотрел HGE... На мой взгляд скудно... Или может я не увидел... Мултитекстуривания нет, шейдеров нет...
Примерно составил список что вижу я:
Camera Transform Batch - батчинг Draw - отрисовка спрайтов Blend - блендинг с бэк-буфером BlendFactor - бленд фактор FillMode - режим текстурирования Lines - отрисовка линий Particles - частиц(из готового буфера) ZEnable ZWriteEnable - управление Z буфером для ZOrder Textures - установка текстур, и текстурного фильтра Shaders - установка шейдеров и констант Mirroring - управление текстурными координатами Texture FFP(multitexture) - мультитекстурирование
Тема в архиве.