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

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

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 30.03.2006, 12:12   #1
Lexa
ПроЭктировщик
 
Регистрация: 10.10.2005
Сообщений: 102
Написано 2 полезных сообщений
(для 2 пользователей)
Может не туда я написал, ну если что то удалите.

Имеется ланшафт (БАЛЬШОЙ ЛАНШАФТ в 3ds). Я его разбил на куски и хОчу зделать подгрузку. Представте гонки, но не колцевые, а по прямой. Я предпологаю, что мона использовать CameraRange и туман. Но меня волнует др. если загружать всё карту сразу то ето долго и слишком нагрузит систему.
Я прав?
Так как мона осуществить последовательную подгрузку?
(Offline)
 
Ответить с цитированием
Старый 30.03.2006, 17:38   #2
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Грузи 9 кусков (3х3)
Игрок в среднем
видимость на 0.9 размера куска
Отслеживай координаты и по пересечении игроком границы, задние 3 куска удаляй, впереди три куска загружай, и смещая все куски и игрока на исходные, чтобы центральный кусок был в точке 0.0.0
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ARA (01.03.2010)
Старый 30.03.2006, 17:54   #3
Lexa
ПроЭктировщик
 
Регистрация: 10.10.2005
Сообщений: 102
Написано 2 полезных сообщений
(для 2 пользователей)
Значит ты предлогаеш мониторить локальные координаты героя по отношению к центру куска карты. Попробую. А есть ещё какие варианты?
(Offline)
 
Ответить с цитированием
Старый 03.04.2006, 19:54   #4
Lexa
ПроЭктировщик
 
Регистрация: 10.10.2005
Сообщений: 102
Написано 2 полезных сообщений
(для 2 пользователей)
Если какой вариант просчитать скорость загруски!! Ну может какая зависимость или ещё что нибуть?
(Offline)
 
Ответить с цитированием
Старый 03.04.2006, 21:00   #5
SubZer0
Администратор
 
Аватар для SubZer0
 
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений
(для 996 пользователей)
Поправьте меня если я ошибусь, но все что касаемо 3Д моделей и текстур при создании оказывается в оперативке видеокарты (в случае если конечно там места хватает), поэтому это в основном нагрузит видеокарту...

ну а выход из положения - только динамическая загрузка... теперь вопрос как ее оптимизировать...

исходя из того, что блиц юзает DirectX, то думаю надо будет переделать модели в формат *.x (текстуры наверное тоже в tga перегнать надо будет), чем попытаться избежать дополнительных перекодировок модели при загрузке (это просто идея, надо протестить на время)...

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

(ну ессно предусмотреть чтоб если не успело все догрузиться а чел уже доехал до точки видимости, то насильно остановить гаму и все догрузить)


2 tormoz

ИМХО с перемещением может гемор получиться... ИМХО просто расставить модели и подгружать их поочереди... а если перепозиционирование делать, то это надо делать перепозиционирование всего мира (он-же наверное не один там гонять будет) + все флаги которые отмеряют кто впереди а кто позади едет...

__________________
Как минимум я помог многим (с)
(Offline)
 
Ответить с цитированием
Старый 03.04.2006, 21:55   #6
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 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
Lexa
ПроЭктировщик
 
Регистрация: 10.10.2005
Сообщений: 102
Написано 2 полезных сообщений
(для 2 пользователей)
Чёт я в коде не могу разобратся.
(Offline)
 
Ответить с цитированием
Старый 08.04.2006, 01:56   #8
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Можно просто побить на куски и грузить фсё сразу, а блитз3Д сам сортирует видимые объекты, а невидимые отсеивает
__________________
(Offline)
 
Ответить с цитированием
Старый 08.04.2006, 11:43   #9
Lexa
ПроЭктировщик
 
Регистрация: 10.10.2005
Сообщений: 102
Написано 2 полезных сообщений
(для 2 пользователей)
Короче. Я вычитал в одной умной книжке что мона зделать контрольные точки(привязанные к герою). И если координаты контр.точки > или = координате куска карты, то загрузить этот кусок. И так прописать для каждой контр.точки. Создать массив с и хранить там все роординаты, всех кусков. Или мона зделать название куска карты соответствует своей координате. это облегчит поиск. я вот тут набрасал картинку простую.

SBJoker:
Я бы грузил так, но это может занять много времени, и зачеи грузить то что может не понадобится.

tormoz: пРИ всем моём уважениии к тебе. Хотел бы предложить научится оставлять пояснения. Я например нихрена не понял из того что ты написал. Я есть люди которые забретут на эту тему и свалят сразу как увидят такую кучу кода.
ps: без обид!

Верхний ряд точек проверять
если >= при соответствующем Х то грузить
Нижний ряд
если <= при соответствующем Х то грузить

и тд. тп.
(Offline)
 
Ответить с цитированием
Старый 08.04.2006, 13:04   #10
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений
(для 4,437 пользователей)
Нет у меня времени полдня сидеть объяснять.
Скопировал просто из рабочего инклюда.
Захочешь сделать - разберешся.
Код оч простой. (ты еще сложного наверно не видел)
__________________
(Offline)
 
Ответить с цитированием
Старый 08.04.2006, 13:20   #11
tormoz
Гигант индустрии
 
Аватар для tormoz
 
Регистрация: 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)
 
Ответить с цитированием
Ответ


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подгрузка модели :) Conan Fedr 3D-программирование 6 18.02.2006 13:15


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


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