Такой вопрос, есть уровень 2д из тайлов, например размером 100х100 тайлов, что будет лучше, склеить их в одну картинку при загрузке или отрисовать все 10000 прямоугольников отдельно с текстурой тайлов? При том учитывая что текстура одного тайла может быть например 256x256 пикселей, и я так посчитал что клеить их в одну текстуру что то уж дофига большое разрешение получается. Отрисовка DirectX 9.
ZGreen писал: 10000 уникальных тайлов это крутовато
Не обязательно уникальных. Просто 10000 вызовов отрисовки спрайтов в цикле.
Цитата:
ZGreen писал: Исходя из информации (слухах) о принципах работы современных видеокарт, тебе надо надо все склеивать в атласы максимально возможного размера.
Это так сейчас и реализовано, но пугает разрешение картинки в 25к. Оно же в несжатом виде ещё в оперативку грузится и занимает в районе гигабайта - полтора. А это только 1 слой, таких слоёв может быть с десяток. ФПС вроде как особо и не падает от этого. Но интересно какие видеокарты держат картинки такого разрешения, а какие нет? Плюс сама склейка с загрузкой в память происходит довольно долго, около 10 секунд.
Хотя не, вру. Если запускать вне студии, то проект при сшивании жрёт чуть больше 100мб ОЗУ и потом падает до 40мб, но всеравно сшивает долго.
FiEctro квады ты можешь отсекать по вьюпорту. Или тебе нужно отобразить их на одном экране? Тогда проще прекалькуляцию в файл произвести, как оверлеи для карт в CS
Дядя Миша писал: Для десяти тысяч квадов, как ни извращайся, но разницу ты не почувствуешь.
Т.е. лучше их не сшивать? На производительность это никак не повлияет, но при этом увеличит скорость загрузки?
Цитата:
KiQ писал: FiEctro квады ты можешь отсекать по вьюпорту. Или тебе нужно отобразить их на одном экране? Тогда проще прекалькуляцию в файл произвести, как оверлеи для карт в CS
Мне нужно отрисовать тайловую карту из файла. Для этого делается цикл где каждой клеточки тайла задаётся отдельный спрайт с ссылкой на текстуру и UV координатой. В нашем случае это карта 100х100 клеточек, а значит нужно отрисовать 10000 спрайтов. У всех их одна текстура, но UV сдвинута так чтобы рисовался только нужный участок тайлсета.
И ещё такой вопрос, есть моноширинный шрифт, как лучше к нему хранить оффсеты чтобы потом обрезать лишнюю пустоту, и из моноширинного его сделать обычным? На ум только приходит хранить массив с числом которым нужно вычесть из ширины уже посчитанного чарактера. Может есть более элегантные решения?
Ну вот смотри у тебя картинки вполне кошерного размера и кратные двойке. На кой ляд ты собрался их сшивать?
Лайтмапы сшивают, потому что там куча мелкого дерьма размеров 1х1, 2х7, 5х3 и прочего.
Добавлено 28-03-2023 в 16:34:
Цитата:
FiEctro писал: В нашем случае это карта 100х100 клеточек, а значит нужно отрисовать 10000 спрайтов
Мысленно представь, что консолька в халфе - это твои десять тысяч тайлов, только вместо картинок - буквы. Оно и в 98-м году не тормозило. А рисовалось точно также - в цикле и по буковке. И до сих пор зачастую рисуются именно так, безо всякой оптимизации. Ну потому что некритично.
Я даже через свою виртуальную машину в меню рисовал эти грёбанные буквы и то не заметил драматического падения производительности.
Добавлено 28-03-2023 в 16:36:
ЗЫ. Если DX уронит фпс во время отрисовки этих тайлов из-за высокой стоимости дипа, я буду очень долго ржать.
Дядя Миша писал: ЗЫ. Если DX уронит фпс во время отрисовки этих тайлов из-за высокой стоимости дипа, я буду очень долго ржать.
А что за дип? Ну будет обидно. Надеюсь ещё не появятся мерзкие щели между тайлами? Я до этого рисовал на виндовсформах, и там если не сшить всё в 1 картинку, в местах стыков спрайтов появлялись щели. И что то вопросу со шрифтами?
Как из моноширинного сделать обычный? Моноширинные гарнитуры были придуманы для пишущих машинок, чтобы текст нормально смотрелся, потому что там нельзя никак применить кернинг. В наборных шрифтах обычно таблица кернинга хранится в самом файле шрифта, если это, конечно, не корявый рип.
Ну так то можно проверять альфу по высоте в каждом чарактере, и если там нет пикселей удалять весь столбец, но проблема в том что я хз как это средствами директа сделать.