forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Что быстрее LoadMesh vs LoadAnimMesh? (http://forum.boolean.name/showthread.php?t=6159)

Dstorton111 23.07.2008 16:44

Что быстрее LoadMesh vs LoadAnimMesh?
 
Почему когда я гружу уровень (~ 30 тыс/полигонов) через LoadAnimMesh(чтобы пропарсить его) FPS падает в разы больше чем через простую LoadMesh ?

И ещё вопрос, Через блитцевскую команду AvailVidMem() заметил что при загрузке геометрии в видео-память и последующем её скрытии на расстоянии память моей карточки не освобождается, пока мешей мало всё будет нормально, а что когда мой проект разрастётся скажем до 500 тыс.полигонов?
При юзанье комманды HideEntity я так догнал что свобода настаёт только рендеру но не как не ОЗУ моей видеокарты?

LD 23.07.2008 17:13

Ответ: Что быстрее LoadMesh vs LoadAnimMesh?
 
Насчет первого вопроса не знаю, сам не пробовал. А с HideEntity ты абсолютно прав, отключается рендер этой модели (и соответственно обработка анимации и остальной работы над моделью), но ее геометрия и.т.д. естественно остаются в памяти, или как ты хотел? Хайдаешь энтити и он выгружается из видеопамяти? ))) А теперь представь себе чтобы его обратно показать - надо вновь загрузить? ))) Чтобы из видеопамяти выгрузить юзай FreeEntity (выгружается геометрия, браши и все остальноеЮ, что связано с этим энтити (позиция, поворот и.т.д.))

HolyDel 23.07.2008 17:22

Ответ: Что быстрее LoadMesh vs LoadAnimMesh?
 
насчет первого вопроса.
твой уровень состоит из кучи объектов. рисовать 1000 объектов по 1000 полигонов ето совсем не то же самое, что 10 по 100 000. второе быстрее (при условии что все объекты выводятся на екран)

Alex_Noc 23.07.2008 23:47

Ответ: Что быстрее LoadMesh vs LoadAnimMesh?
 
А если сделать кадров при експорте модели в шкале анимации в максе минимум то файл будет весить меньше :) - спасибки внизу жать есче :)

ABTOMAT 24.07.2008 00:15

Ответ: Что быстрее LoadMesh vs LoadAnimMesh?
 
Dstorton111
Цитата:

1. Что быстрее LoadMesh vs LoadAnimMesh?
Одинаково при загрузке.
Разница в обработке.
У тебя как и верно сказал ХолиДел уровень состоит из кучи объектов.
Один объект - один батч при рендере.
10 000 объектов - 10 000 батчей.
Это здорово тормозит игру
А Блитз особенно критичен к количеству Ентити
(т.к. когда ты грузишь Аниммешем то каждый объект из макса - это энтити)
Когда ты грузишь LoadMesh - все объекты объединяются в один , ентити получается один и тормозов в разы(!) меньше.
Решение:
№0. Юзать LoadMesh
№1. Если приспичило LoadAnimMesh то тогда объедини все объекты в один в редакторе графики (3ds max например) и уже в таком виде экспортируй в Блитз. Не объединяй только то, что тебе действительно нужно и из-за чего нельзя юзать LoadMesh
Если ты не знаешь подобных случаев - не заморачивайся (это отдельная песня зачем и почему иногда нельзя использовать LoadMesh а нужно именно LoadAnimMesh как-нибудь долгими зимними вечерами расскажу), юзай решение №0

Правило хорошего Блитзера № 113 - всегда минимизируй кол-во энтити

2.
Цитата:

а что когда мой проект разрастётся скажем до 500 тыс.полигонов?
При юзанье комманды HideEntity я так догнал что свобода настаёт только рендеру но не как не ОЗУ моей видеокарты?
Угу, освобождается только рендер.
Это удобно когда нужно часто скрывать/показывать некоторые объекты
Потому что если ты выкинул из памяти что-то то если тебе потом приспичит это показать, то придётся грузить с винта а это жжжуткий тормоз.

Правило хорошего блитзера №238 - никогда не грузи ничего с винчестера во время игры.

Далее.
Не хватит ОЗУ - полезет в файл подкачки - только и всего :-)
Правда этот самый файл подкачки находится на винте, а это... (см. выше)
Но я не думаю что тебе удастся заср*ть 1 Гб ОЗУ (средний сегодняшний компьютер). Так что спи спокойно.

Кстати! Для экономии памяти стоит удалять уже заюзанные текстуры!
Например так:
Tex = LoadTexture("texture.dds")
ball = CreateSphere(16)
EntityTexture ball,tex
FreeTexture tex

Правило хорошего блитзера №96 - всегда удаляй текстуры после их использования!


Надеюсь, развёрнуто и понятно всмё объяснил. Удачи! ;)

ffinder 24.07.2008 12:11

Ответ: Что быстрее LoadMesh vs LoadAnimMesh?
 
Цитата:

Сообщение от ABTOMAT (Сообщение 82893)
Dstorton111
Кстати! Для экономии памяти стоит удалять уже заюзанные текстуры!
Например так:
Tex = LoadTexture("texture.dds")
ball = CreateSphere(16)
EntityTexture ball,tex
FreeTexture tex
Правило хорошего блитзера №96 - всегда удаляй текстуры после их использования!

разве в Direct3D память под текстуры управляется не счетчиком ссылок?
т.е. ты можешь удалить текстуру, но она уже используется кучей мешей и refcount у нее больше нуля (т.е. текстура все еще в памяти).
так что насчет экономии не получится. просто не сможешь новые меши текстурить этой текстурой...

moka 24.07.2008 12:52

Ответ: Что быстрее LoadMesh vs LoadAnimMesh?
 
Текстура останется в памяти, но ссылки на неё и её управление будет уже не доступны, это освобождает немного память.

LoadMesh и LoadAnimMesh разные вещи, и их сравнивать нельзя.

Ещё есть в DX такой моммент, что память в ДХ9 прилоениях заполняется только после первого рендеринга объекта, до этого он какбы находится в ней, но не в памяти (незнаю как объяснить, т.к. сам не разбирался, но заметил этот моммент в дх сдк, пару демках).

ffinder 24.07.2008 13:11

Ответ: Что быстрее LoadMesh vs LoadAnimMesh?
 
Цитата:

Сообщение от MoKa (Сообщение 82920)
Текстура останется в памяти, но ссылки на неё и её управление будет уже не доступны, это освобождает немного память..

эээ... выигрыш в 8(к примеру) байт (указатель на текстуру и на vtable)???
Цитата:

Сообщение от MoKa (Сообщение 82920)
LoadMesh и LoadAnimMesh разные вещи, и их сравнивать нельзя.

все можно сравнивать, главное определить критерии
Цитата:

Сообщение от MoKa (Сообщение 82920)
Ещё есть в DX такой моммент, что память в ДХ9 прилоениях заполняется только после первого рендеринга объекта, до этого он какбы находится в ней, но не в памяти (незнаю как объяснить, т.к. сам не разбирался, но заметил этот моммент в дх сдк, пару демках).

это как?

HolyDel 24.07.2008 13:30

Ответ: Что быстрее LoadMesh vs LoadAnimMesh?
 
на самом деле, создается браш - и туда копируется текстура. зачем так сделали авторы блица - хз.

ABTOMAT 24.07.2008 15:08

Ответ: Что быстрее LoadMesh vs LoadAnimMesh?
 
ХЗ-то хз но ОЗУ освобождается - это факт.

moka 24.07.2008 16:47

Ответ: Что быстрее LoadMesh vs LoadAnimMesh?
 
HolyDel, я скорее считал что есть брашь - он наложен на сюрфейс, а текстура вкладывается в брашь при наложении на сюрфейс (при наложении на энтити, все его браши получают эту текстуру, и от сюда все сюрфейсы). Разве не так?

HolyDel 24.07.2008 16:57

Ответ: Что быстрее LoadMesh vs LoadAnimMesh?
 
тогда при удалении текстуры был бы мав. скорее всего при первом наложении куда либо - делается браш (копируется текстура). и дальше, по возможности используется етот браш. а текстуру можно стирать. а у себя в двиге я вообще по дефолту держу копию текстуры в системной памяти, на всякий пожарный.

moka 24.07.2008 17:14

Ответ: Что быстрее LoadMesh vs LoadAnimMesh?
 
По мне так представляется так: Есть эллемент, в нём инфа и указатель на текстуру.
Также есть брашь. При наложении на голый сюрфейс, надаж брашь создать. Или он будет автоматически создан. Таким образом в браше уже будет хранится указатель на саму текстуру, а не на эллемент.
При удалении браша текса то останется. А если она нигде не юзается то удаляется - по сути это задача менеджера ресурсов.

HolyDel 24.07.2008 17:42

Ответ: Что быстрее LoadMesh vs LoadAnimMesh?
 
я фигею. как с графикс3д изменилось значние. тут что то хитрожопое. если убрать renderworld из мест явно для него не предназначенных, то программа становится шаманской - фиг поймеш когда и где выделяется память.

Код:

DebugLog TotalVidMem()
DebugLog AvailVidMem()

Graphics3D 800,600,32,2

cam=CreateCamera()
PositionEntity cam,0,0,-5
RenderWorld()
DebugLog AvailVidMem()
tex = CreateTexture(1024,1024)
b = TextureBuffer(tex)
For i=0 To 1023
        For j=0 To 1023
                WritePixel(i,j,Rnd(2^32),b)
        Next
Next
RenderWorld()
DebugLog AvailVidMem()

cube = CreateCube()
EntityTexture cube,tex
RenderWorld()
DebugLog AvailVidMem()

FreeTexture tex
RenderWorld()
DebugLog AvailVidMem()

;FreeEntity cube
RenderWorld()
DebugLog AvailVidMem()


While Not KeyDown(1)
       
        TurnEntity cube,0,1,0
       
        RenderWorld
        Flip
       
Wend

DebugLog AvailVidMem()
FreeEntity cube
RenderWorld()
DebugLog AvailVidMem()

EndGraphics
DebugLog AvailVidMem()
Stop
End


moka 24.07.2008 17:54

Ответ: Что быстрее LoadMesh vs LoadAnimMesh?
 
HolyDel, да есть такие приколы. По сути там менеджер работает хитро :)


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot