Показать сообщение отдельно
Старый 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)
 
Ответить с цитированием