|
Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения |
30.03.2006, 12:12
|
#1
|
ПроЭктировщик
Регистрация: 10.10.2005
Сообщений: 102
Написано 2 полезных сообщений (для 2 пользователей)
|
Может не туда я написал, ну если что то удалите.
Имеется ланшафт (БАЛЬШОЙ ЛАНШАФТ в 3ds). Я его разбил на куски и хОчу зделать подгрузку. Представте гонки, но не колцевые, а по прямой. Я предпологаю, что мона использовать CameraRange и туман. Но меня волнует др. если загружать всё карту сразу то ето долго и слишком нагрузит систему.
Я прав?
Так как мона осуществить последовательную подгрузку?
|
(Offline)
|
|
30.03.2006, 17:38
|
#2
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Грузи 9 кусков (3х3)
Игрок в среднем
видимость на 0.9 размера куска
Отслеживай координаты и по пересечении игроком границы, задние 3 куска удаляй, впереди три куска загружай, и смещая все куски и игрока на исходные, чтобы центральный кусок был в точке 0.0.0
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
30.03.2006, 17:54
|
#3
|
ПроЭктировщик
Регистрация: 10.10.2005
Сообщений: 102
Написано 2 полезных сообщений (для 2 пользователей)
|
Значит ты предлогаеш мониторить локальные координаты героя по отношению к центру куска карты. Попробую. А есть ещё какие варианты?
|
(Offline)
|
|
03.04.2006, 19:54
|
#4
|
ПроЭктировщик
Регистрация: 10.10.2005
Сообщений: 102
Написано 2 полезных сообщений (для 2 пользователей)
|
Если какой вариант просчитать скорость загруски!! Ну может какая зависимость или ещё что нибуть?
|
(Offline)
|
|
03.04.2006, 21:00
|
#5
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
Поправьте меня если я ошибусь, но все что касаемо 3Д моделей и текстур при создании оказывается в оперативке видеокарты (в случае если конечно там места хватает), поэтому это в основном нагрузит видеокарту...
ну а выход из положения - только динамическая загрузка... теперь вопрос как ее оптимизировать...
исходя из того, что блиц юзает DirectX, то думаю надо будет переделать модели в формат *.x (текстуры наверное тоже в tga перегнать надо будет), чем попытаться избежать дополнительных перекодировок модели при загрузке (это просто идея, надо протестить на время)...
есть вариант подгружать ресурсы постепенно... допустим незадолго как чел доберется до конца куска начать подгружать текстуры и с каждым проходом цикла грузить новую текстуру... так-же с моделями... тем самым избежать тотальной кратковременной перегрузки системы...
(ну ессно предусмотреть чтоб если не успело все догрузиться а чел уже доехал до точки видимости, то насильно остановить гаму и все догрузить)
2 tormoz
ИМХО с перемещением может гемор получиться... ИМХО просто расставить модели и подгружать их поочереди... а если перепозиционирование делать, то это надо делать перепозиционирование всего мира (он-же наверное не один там гонять будет) + все флаги которые отмеряют кто впереди а кто позади едет...
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
03.04.2006, 21:55
|
#6
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Я это все давно уже сделал.
Время подгрузки с тайлами 200х200 м (город)
на атлон 1900 +
1 сек
Вся эта фигня еще и с сервером работает
Примерно как это выглядит в коде:
Function UpdateLevel()
*If EntityX(HeroModel)>110
* * messageLoad()
* * EntityType *HeroModel,0
* * posXInc()
* * U_l()
*EndIf
* If EntityX(HeroModel)<-110
* * messageLoad()
* * EntityType *HeroModel,0
* * posXDec()
* * U_l()
*EndIf
* * If EntityZ(HeroModel)>110
* * *messageLoad()
* * *EntityType *HeroModel,0
* * * posZInc()
* * *U_l()
*EndIf
* If EntityZ(HeroModel)<-110
* * * messageLoad()
* * * EntityType *HeroModel,0
* * * posZDec()
* * * U_l()
*EndIf
End Function
Function posXInc()
* *FreeEntity x1z1
* *FreeEntity x1z2
* *FreeEntity x1z3
*
* x1z1=x2z1
* x1z2=x2z2
* x1z3= x2z3
* x2z1=x3z1
* x2z2=x3z2
* x2z3= x3z3
LocationX=LocationX+1
If LocationX=x_max +1 LocationX=x_min
level$=levelSet$(LocationX,LocationZ)
;--------------load-----------
xi=LocationX+1
xd=LocationX-1
zd=LocationZ-1
zi=LocationZ+1
If xd<x_min xd=xd+(x_max-x_min)
If xi>x_max xi=xi-(x_max-x_min)
If zd<z_min zd=zd+(x_max-x_min)
If zi>z_max zi=zi-(x_max-x_min)
Level_A$="0"+(xi)+"_"+"0"+(zd)
x3z1=CreateScene(Level_A$)
Level_A$="0"+(xi)+"_"+"0"+(LocationZ)
x3z2=CreateScene(Level_A$)
*
Level_A$="0"+(xi)+"_"+"0"+(zi)
x3z3=CreateScene(Level_A$)
PosLevel()
PositionEntity HeroModel,EntityX(HeroModel)-200,EntityY(HeroModel),EntityZ(HeroModel)
End Function
;==================
Function posXDec()
* *FreeEntity x3z1
* *FreeEntity x3z2
* *FreeEntity x3z3
*
* x3z1=x2z1
* x3z2=x2z2
* *x3z3= x2z3
* x2z1=x1z1
* x2z2=x1z2
* x2z3=x1z3
LocationX=LocationX-1
If LocationX=x_min-1 LocationX=x_max
level$=levelSet$(LocationX,LocationZ)
;--------------load-----------
xi=LocationX+1
xd=LocationX-1
zd=LocationZ-1
zi=LocationZ+1
If xd<x_min xd=xd+(x_max-x_min)
If xi>x_max xi=xi-(x_max-x_min)
If zd<z_min zd=zd+(x_max-x_min)
If zi>z_max zi=zi-(x_max-x_min)
Level_A$="0"+(xd)+"_"+"0"+(zd)
x1z1=CreateScene(Level_A$)
Level_A$="0"+(xd)+"_"+"0"+(LocationZ)
x1z2=CreateScene(Level_A$)
*
Level_A$="0"+(xd)+"_"+"0"+(zi)
x1z3=CreateScene(Level_A$)
PosLevel()
PositionEntity HeroModel,EntityX(HeroModel)+200,EntityY(HeroModel),EntityZ(HeroModel)
End Function
Function posZInc()
* *FreeEntity x1z1
* *FreeEntity x2z1
* *FreeEntity x3z1
*
* x1z1=x1z2
* x2z1=x2z2
* *x3z1=x3z2
* x1z2=x1z3
* x2z2=x2z3
* x3z2=x3z3
LocationZ=LocationZ+1
If LocationZ=z_max +1 LocationZ=z_min
level$=levelSet$(LocationX,LocationZ)
;--------------load-----------
xi=LocationX+1
xd=LocationX-1
zd=LocationZ-1
zi=LocationZ+1
If xd<x_min xd=xd+(x_max-x_min)
If xi>x_max xi=xi-(x_max-x_min)
If zd<z_min zd=zd+(x_max-x_min)
If zi>z_max zi=zi-(x_max-x_min)
Level_A$="0"+(xd)+"_"+"0"+(zi)
x1z3=CreateScene(Level_A$)
Level_A$="0"+(LocationX)+"_"+"0"+(zi)
x2z3=CreateScene(Level_A$)
*
Level_A$="0"+(xi)+"_"+"0"+(zi)
x3z3=CreateScene(Level_A$)
PosLevel()
PositionEntity HeroModel,EntityX(HeroModel),EntityY(HeroModel),EntityZ(HeroModel)-200
End Function
;==================
Function posZDec()
* *FreeEntity x1z3
* *FreeEntity x2z3
* *FreeEntity x3z3
*
* x1z3=x1z2
* x2z3=x2z2
* x3z3=x3z2
* x1z2=x1z1
* x2z2=x2z1
* x3z2=x3z1
LocationZ=LocationZ-1
If LocationZ=z_min-1 LocationZ=z_max
level$=levelSet$(LocationX,LocationZ)
;--------------load-----------
xi=LocationX+1
xd=LocationX-1
zd=LocationZ-1
zi=LocationZ+1
If xd<x_min xd=xd+(x_max-x_min)
If xi>x_max xi=xi-(x_max-x_min)
If zd<z_min zd=zd+(x_max-x_min)
If zi>z_max zi=zi-(x_max-x_min)
Level_A$="0"+(xd)+"_"+"0"+(zd)
x1z1=CreateScene(Level_A$)
Level_A$="0"+(LocationX)+"_"+"0"+(zd)
x2z1=CreateScene(Level_A$)
*
Level_A$="0"+(xi)+"_"+"0"+(zd)
x3z1=CreateScene(Level_A$)
PosLevel()
PositionEntity HeroModel,EntityX(HeroModel),EntityY(HeroModel),EntityZ(HeroModel)+200
End Function
;==================
Function PosLevel()
PositionEntity x1z1,-200,0,-200
PositionEntity x1z2,-200,0,0
PositionEntity x1z3,-200,0,200
PositionEntity x2z1,0,0,-200
PositionEntity x2z2,0,0,0
PositionEntity x2z3,0,0,200
PositionEntity x3z1,200,0,-200
PositionEntity x3z2,200,0,0
PositionEntity x3z3,200,0,200
End Function
;=====================
Function U_l()
EntityType HeroModel,1
Send_Location()
gravity=0.1
Rotate_camera()
UpdateSky()
Position_location_bot()
End Function
Оптимально использовать бзд формат.
Он на 1-2% медленней рисуется чем 3дс, но зато внешний вид намного лучше + масса возможностей в плане графики (поддержка интересных материалов в максе)
__________________
|
(Offline)
|
|
08.04.2006, 00:19
|
#7
|
ПроЭктировщик
Регистрация: 10.10.2005
Сообщений: 102
Написано 2 полезных сообщений (для 2 пользователей)
|
Чёт я в коде не могу разобратся.
|
(Offline)
|
|
08.04.2006, 01:56
|
#8
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Можно просто побить на куски и грузить фсё сразу, а блитз3Д сам сортирует видимые объекты, а невидимые отсеивает
__________________
|
(Offline)
|
|
08.04.2006, 11:43
|
#9
|
ПроЭктировщик
Регистрация: 10.10.2005
Сообщений: 102
Написано 2 полезных сообщений (для 2 пользователей)
|
Короче. Я вычитал в одной умной книжке что мона зделать контрольные точки(привязанные к герою). И если координаты контр.точки > или = координате куска карты, то загрузить этот кусок. И так прописать для каждой контр.точки. Создать массив с и хранить там все роординаты, всех кусков. Или мона зделать название куска карты соответствует своей координате. это облегчит поиск. я вот тут набрасал картинку простую.
SBJoker:
Я бы грузил так, но это может занять много времени, и зачеи грузить то что может не понадобится.
tormoz: пРИ всем моём уважениии к тебе. Хотел бы предложить научится оставлять пояснения. Я например нихрена не понял из того что ты написал. Я есть люди которые забретут на эту тему и свалят сразу как увидят такую кучу кода.
ps: без обид!
Верхний ряд точек проверять
если >= при соответствующем Х то грузить
Нижний ряд
если <= при соответствующем Х то грузить
и тд. тп.
|
(Offline)
|
|
08.04.2006, 13:04
|
#10
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Нет у меня времени полдня сидеть объяснять.
Скопировал просто из рабочего инклюда.
Захочешь сделать - разберешся.
Код оч простой. (ты еще сложного наверно не видел)
__________________
|
(Offline)
|
|
08.04.2006, 13:20
|
#11
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
If EntityX(HeroModel)>110
messageLoad()
EntityType HeroModel,0
posXInc()
U_l()
EndIf
по этому куску понятно ?
если игрок ушел вправо больше чем 110 то запускаеЦЦа posXInc()
Function posXInc()
FreeEntity x1z1
FreeEntity x1z2
FreeEntity x1z3 выгружаются левые куски уровня (переменных кусков 9 штук по имени понятно ? )
x1z1=x2z1
x1z2=x2z2
x1z3= x2z3
x2z1=x3z1
x2z2=x3z2
x2z3= x3z3 оставшиеся 6 кусков меняют переменную - сдвигаются влево
LocationX=LocationX+1 переменная текущей локации по Х
If LocationX=x_max +1 LocationX=x_min если край мира то переходим на противоположный край
level$=levelSet$(LocationX,LocationZ) строковые преобразования - получаем имя текущего уровня
;--------------load-----------
высчитываем промежуточные значения:
xi=LocationX+1
xd=LocationX-1
zd=LocationZ-1
zi=LocationZ+1
If xd<x_min xd=xd+(x_max-x_min)
If xi>x_max xi=xi-(x_max-x_min)
If zd<z_min zd=zd+(x_max-x_min)
If zi>z_max zi=zi-(x_max-x_min)
Грузим 3 новых куска
Level_A$="0"+(xi)+"_"+"0"+(zd)
x3z1=CreateScene(Level_A$)
Level_A$="0"+(xi)+"_"+"0"+(LocationZ)
x3z2=CreateScene(Level_A$)
Level_A$="0"+(xi)+"_"+"0"+(zi)
x3z3=CreateScene(Level_A$)
PosLevel() расставляем все куски на свои "родные" места в мире
PositionEntity HeroModel,EntityX(HeroModel)-200,EntityY(HeroModel),EntityZ(HeroModel) перемещаем героя на место
End Function
Function levelSet$(x,z)
xstr$=Str(x)
zStr$=Str(z)
If x<10
xstr$="0"+xstr$
EndIf
If z<10
zStr$="0"+zStr$
EndIf
Return xstr$+"_"+zStr$
End Function
При перемещении героя отключаем ему коллизию, потом опять включаем
имена уровней по такому принципу: 04_06.b3d
то есть доступно 10 000 кусков
мир 20х20 км
если нужно больше - просто перейти к другой папке
__________________
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Подгрузка модели :) |
Conan Fedr |
3D-программирование |
6 |
18.02.2006 13:15 |
Часовой пояс GMT +4, время: 06:22.
|