Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Xors3D

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 02.04.2014, 06:31   #226
bugway
ПроЭктировщик
 
Аватар для bugway
 
Регистрация: 19.03.2012
Адрес: Забайкальский край
Сообщений: 112
Написано 15 полезных сообщений
(для 23 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

Я пытался сказать, что использование PB10 нисколько меня не ограничивает. Как и в Си те же оконные процедуры, обработка сообщений и т.п. Наличие ассемблера вообще развязывает руки. На результирующую DLL движка использование PB10 негативно не повлияет.


А теперь по существу:

Кто делал фабрику мешей, поделитесь соображениями - как это лучше связать с буфером/буферами вертексов?
Варианты (просто пришедшие в голову):
1. Хранить все меши в едином буфере вертексов. В классе меша реализовать ссылки на определенную область в буфере вертексов.
2. Хранить сами вертексы как часть экземпляра класса меша и использовать отдельный буфер вертексов для каждого меша.

Иначе говоря, сколько статических буферов вертексов принято использовать - один или столько, сколько мешей?

Второй вариант позволит использовать такой стиль:
MyEngine.Mesh(i).Render

Первый вариант (с общим буфером) такой стиль:
MyEngine.Render Mesh(i)

В плане производительности склоняюсь к первому варианту. Поделитесь соображениями, пожалуйста.
__________________
PC: MB ASRock Z170M Pro4S / CPU Intel Core i-5 6600 4-Core / RAM 32 Gb / GPU Geforce RTX 2080 Ti 11Gb / Oculus Rift DK1 + CV1 / HTC Vive / Deus Odin DK 0..5

https://rw-game.ru
https://geovoxium3d.com
(Offline)
 
Ответить с цитированием
Старый 02.04.2014, 11:08   #227
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

Я пытался сказать, что использование PB10 нисколько меня не ограничивает. Как и в Си
Function NvAPI_GetDisplayDriverVersion(ByVal hNvDisplay As Dword, pVersion As NvDisplayDriverVersion) As Long 'CDecl
pVersion.version=Len(pVersion) Or 65536
! push dword pVersion
! push dword ptr hNvDisplay
Call Dword NVfunc(2)
! mov RetVal, eax
Function = RetVal
End Function
Ты ведь в курсе, что чтобы вызывать в С функцию из длл, не надо передавать аргументы асмом? Можно просто подключить хидер и либ и вызывать как обычную. В крайнем случае можно подгрузить динамически, но и там всё проще.
Тьфу, да даже в блицаке можно было юзать деклс и вызывать нормально.

Никто никогда не напишет для повербейсика хидеры. Захотел юзать самый популярный формат моделей FBX? А вот и хер тебе, например, сдк есть только под С++ и Питон.


1. Хранить все меши в едином буфере вертексов. В классе меша реализовать ссылки на определенную область в буфере вертексов.
Меньше переключений буферов это хорошо, но сразу продумай насчёт удаления мешей. Типа юзер удалил меш, который где-то в середине буфера вертексы имеет - там образовалась дырка. Придётся либо время от времени делать дефрагментацию буфера, либо знать наверняка размеры загружаемых/удаляемых мешей, и если они примерно равны - то можно дырки забивать новыми загруженными. Но это к конкретной игре, а не к движку.
2. Хранить сами вертексы как часть экземпляра класса меша и использовать отдельный буфер вертексов для каждого меша.
Так наверное будет пока оптимальней.
Ну или можно by design запретить удаление статики, только если разом всю. Первый вариант должен быть незначительно быстрее.

Второй вариант позволит использовать такой стиль:
MyEngine.Mesh(i).Render

Первый вариант (с общим буфером) такой стиль:
MyEngine.Render Mesh(i)
Первый вариант тоже должен мочь реализовываться вторым кодом, почему нет?
"Каждый объект сам себя рендерит" это не лучшая идея (уже много где обсуждалось). Каждый раз входишь в функцию, кладёшь что-то на стек, плюс она ещё может быть виртуальной (не знаю как в вашем бейсике), мы ждём пока каждая функция выполнит гапи код. Если много объектов - то много оверхеда накапливается.
Намного приятнее имхо и дружелюбнее к железу представлять все объекты как данные. Меш должен содержать только инфу, нужную для его рендера. Дальше ты рендереру посылаешь толстую пачку этих мешей, и он, как на конвеере, их рендерит друг за другом без перерывов, в одном цикле. Также, в таком случае этот конвеер можно крутить в параллельном потоке, например.
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Старый 02.04.2014, 11:20   #228
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

Сообщение от bugway Посмотреть сообщение
Если имеется ввиду неймспейсы как в си, то - нет. Движок должен работать с максимальным количеством различных компиляторов. Поэтому я использую COM DLL с зашитой в нее TLB, чтобы не подключать хидеры.
Пздц.
В си нет неймспейсов, в плюсах есть. Что бы твоя дллка работала везде, нужно пилить extern "C" и __declspec погугли.

И да. Неймспейсы для переносимости не нужны, но на компилятор это никак не влияет ))
(Offline)
 
Ответить с цитированием
Старый 02.04.2014, 11:25   #229
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

Сообщение от bugway Посмотреть сообщение
Кто делал фабрику мешей, поделитесь соображениями - как это лучше связать с буфером/буферами вертексов?
Мое предложение. Каждый меш хранит один буффер с вершинами и буффер с индексами. Затем Список Поверхностей их индекс начала, конца и указатель на материал.

При отрисовке биндим оба буффера, и циклом бежим по поверхностям рисую диапазоны индексов. Все.

// псевдокод
template <typename T>
class 
Buffer {
}

struct Surface {
    
std::pair<intintrange;
    
Material *material;
}

class 
Mesh {
public:
    
void render() {
        
bindVertexBuffer(m_vertexBuffer);
        
bindIndexBuffer(m_indicesBuffer);
        
bindShader(); // устанавливает настройки меша в шейдер
        
for (const Surface &surface m_surfaces)
            
renderSurface(surface); // устанавливает настройки поверхности в шейдер - рисует
    
}
private:
    
std::vector<Surfacem_surfaces;
    
Buffer<Vertexm_vertexBuffer;
    
Buffer<intm_indexBuffer;

(Offline)
 
Ответить с цитированием
Старый 02.04.2014, 11:31   #230
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

соглашение о вызовах
(Offline)
 
Ответить с цитированием
Старый 02.04.2014, 12:24   #231
bugway
ПроЭктировщик
 
Аватар для bugway
 
Регистрация: 19.03.2012
Адрес: Забайкальский край
Сообщений: 112
Написано 15 полезных сообщений
(для 23 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

А с точки зрения материалов? В каждом меше создавать еще подмеши со своим материалом?

А потом в цикле рендера перебирать все подмеши всех мешей с одним материалом, потом с другим материалом, потом с третьим и т.п.? Не убьет ли это производительность?

Т.е. если имеем в кадре 100 различных типов мешей по 10 материалов. Итого нужно 1000 вертексных буферов + столько же индексных?
__________________
PC: MB ASRock Z170M Pro4S / CPU Intel Core i-5 6600 4-Core / RAM 32 Gb / GPU Geforce RTX 2080 Ti 11Gb / Oculus Rift DK1 + CV1 / HTC Vive / Deus Odin DK 0..5

https://rw-game.ru
https://geovoxium3d.com
(Offline)
 
Ответить с цитированием
Старый 02.04.2014, 12:35   #232
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

Т.е. если имеем в кадре 100 различных типов мешей по 10 материалов. Итого нужно 1000 вертексных буферов + столько же индексных?
ну в идеале тебе нужен 1 VB и 10 IB.

в не идеале, хотя бы 1 VB/IB на меш ничто не мешает держать - тогда по 100 тех и тех + для каждого типа материала хранишь оффсет/размер (диапазон короче) в индексбуфере меша.
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Старый 02.04.2014, 22:12   #233
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

Я же все написал выше.
А что бы избегать много объектов, делай класс который сконструирует один меш из 100, сгруппируя по материалам. Это относится к статике. Также можно заюзать текстурный атлас. Можно добиться отрисовки всего за 1 дип.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ant0N (03.04.2014)
Старый 04.04.2014, 05:21   #234
bugway
ПроЭктировщик
 
Аватар для bugway
 
Регистрация: 19.03.2012
Адрес: Забайкальский край
Сообщений: 112
Написано 15 полезных сообщений
(для 23 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

Занимаюсь оптимизацией. Как каждый из вас относится к идее не использовать DIP в пользу DP ?

Плюсы DP в том, что можно дублировать вертексы в одной позиции с разными текстурными координатами. Из минусов только большое количество самих вертексов (для куба аж 36 вместо 8 при DIP). Но судя по профайлингу DP быстрее DIP на 10-15%. Поэтому вроде больше плюсов у DP, чем у DIP.

Кто как думает?
__________________
PC: MB ASRock Z170M Pro4S / CPU Intel Core i-5 6600 4-Core / RAM 32 Gb / GPU Geforce RTX 2080 Ti 11Gb / Oculus Rift DK1 + CV1 / HTC Vive / Deus Odin DK 0..5

https://rw-game.ru
https://geovoxium3d.com
(Offline)
 
Ответить с цитированием
Старый 04.04.2014, 07:12   #235
Arton
Быдлокодер
 
Аватар для Arton
 
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,019
Написано 2,312 полезных сообщений
(для 5,349 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

Сообщение от bugway Посмотреть сообщение
Занимаюсь оптимизацией. Как каждый из вас относится к идее не использовать DIP в пользу DP ? Кто как думает?
Если бы мне кто объяснил что есть что?
(Offline)
 
Ответить с цитированием
Старый 04.04.2014, 08:29   #236
bugway
ПроЭктировщик
 
Аватар для bugway
 
Регистрация: 19.03.2012
Адрес: Забайкальский край
Сообщений: 112
Написано 15 полезных сообщений
(для 23 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

Сообщение от Arton Посмотреть сообщение
Если бы мне кто объяснил что есть что?
DP - DrawPrimitive
DIP - DrawIndexedPrimitive
__________________
PC: MB ASRock Z170M Pro4S / CPU Intel Core i-5 6600 4-Core / RAM 32 Gb / GPU Geforce RTX 2080 Ti 11Gb / Oculus Rift DK1 + CV1 / HTC Vive / Deus Odin DK 0..5

https://rw-game.ru
https://geovoxium3d.com
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Arton (04.04.2014)
Старый 04.04.2014, 10:25   #237
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

Post T&L cache.

кстати замерять цпу профайлером gpu-side команды не очень правильно. конвейер работает асинхронно - профайлер лишь покажет как быстро вернется управление основному потоку, а не, то, какие затраты конкретная команда принесет.
лучше меняй код и мерь фпс.

про post T&L cache - когд вершину обработал вершинный шейдер, результаты ее хранятся в кэше. И если есть треугольники со смежными вершинами - то эти смежные вершины в случае DIP будут считаться только один раз, в случае DP для каждого треугольника всегда считаются три вершины. и неважно, считались они уже или нет.
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
moka (04.04.2014), Mr_F_ (04.04.2014), Nex (04.04.2014), pozitiffcat (04.04.2014), Samodelkin (04.04.2014)
Старый 04.04.2014, 14:55   #238
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

И я так понимаю, что если рендер имеет сильный перекос в сторону пиксельных шейдеров (perpixel light, deffered shading и т.п.), то возможно DP в некоторых ситуациях будет предпочтительней.
(Offline)
 
Ответить с цитированием
Старый 04.04.2014, 17:27   #239
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

по идее в случае сильного перекоса в сторону пиксельных шейдеров будет без разницы. на растеризации будет ботлнек.

для куба аж 36 вместо 8 при DIP
у тебя куб без нормалей и текстурных координат, да?
таким кубом только карту глубины для рендера шадоумапы рисовать.

кстати кто нибудь делал такую оптимизацию? чтобы на пасс, где генерится шадоумапа использовались упрощенные шейдеры и геометрия (только позиция). Давала ли такая техника ускорения?
(Offline)
 
Ответить с цитированием
Старый 04.04.2014, 19:10   #240
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: Пишем 3D движок - замену Xors3D

Сообщение от HolyDel Посмотреть сообщение
по идее в случае сильного перекоса в сторону пиксельных шейдеров будет без разницы. на растеризации будет ботлнек.
как на растеризацию может повлиять сложность пиксельного шейдера?
просто вершинный будет настолько быстрый что тормоза начнуться на растеризации, но она не станет медленней.
к тому же в архитектурах поддерживающих тесселяцию обычно блоки растеризации очень быстрые.
если сложность сцены высокая то лучше делать перекос в сторону пиксельного шейдера.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 16:35.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com