Я пытался сказать, что использование 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)
|
Первый вариант тоже должен мочь реализовываться вторым кодом, почему нет?
"Каждый объект сам себя рендерит" это не лучшая идея (уже много где обсуждалось). Каждый раз входишь в функцию, кладёшь что-то на стек, плюс она ещё может быть виртуальной (не знаю как в вашем бейсике), мы ждём пока каждая функция выполнит гапи код. Если много объектов - то много оверхеда накапливается.
Намного приятнее имхо и дружелюбнее к железу представлять все объекты как данные. Меш должен содержать только инфу, нужную для его рендера. Дальше ты рендереру посылаешь толстую пачку этих мешей, и он, как на конвеере, их рендерит друг за другом без перерывов, в одном цикле. Также, в таком случае этот конвеер можно крутить в параллельном потоке, например.