forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Создание больших массивов. (http://forum.boolean.name/showthread.php?t=15596)

Halk-DS 04.10.2011 23:11

Создание больших массивов.
 
Не могу создать большой массив. Мне выдает Memory acces violation
Большой это: 1000х1000х1000
Если беру 1000х1000х300 то все делается ок, только оч долго прога грузится. Ну в принципе я понимаю что это 300 млн. значений.
Это какое то ограничение в блитсе или природа сей ошибки неизвестна?:SOS:

Mr_F_ 04.10.2011 23:20

Ответ: Создание больших массивов.
 
даж если бы у тебя 1 ячейка занимала 1 байт, то это выходит 1000*1000*1000 = 1000000000 = 976562.5kb = 953.67mb.
но ячейки скорее всего больше 1 байта.
у тебя просто оперативки не хватает.

Halk-DS 04.10.2011 23:43

Ответ: Создание больших массивов.
 
А каг тогда хранить информацию? Оо
Полюбому должен быть способ. Много игрушек есть похожих с подобных построением ландшафта.

Mr_F_ 04.10.2011 23:47

Ответ: Создание больших массивов.
 
нотч не настолько ещё говнокодер чтобы такие массивы создавать.
у него мир из чанков 256х16х16
пруф: http://www.minecraftwiki.net/wiki/Chunks

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

RBK 04.10.2011 23:56

Ответ: Создание больших массивов.
 
Почитай эти статьи: Дерево (структура данных) и Октодерево

Mr_F_ 04.10.2011 23:58

Ответ: Создание больших массивов.
 
деревья уже для поиска элементов нужны, проблему количества данных они не решают.

RBK 05.10.2011 00:13

Ответ: Создание больших массивов.
 
Согласен, элементы будут храниться на диске, в память будет загружен небольшой фрагмент. Октодерево поможет этим правильно управлять.

Halk-DS 05.10.2011 01:43

Ответ: Создание больших массивов.
 
Цитата:

Сообщение от Mr_F_ (Сообщение 204598)
нотч не настолько ещё говнокодер

Некрасива говнокодером обзиватся :mda:
Я просто спросил что не знал.
Спасибо за подсказки. Уже есть вопросы, но сначала прочитаю ссылки.

Halk-DS 05.10.2011 02:24

Ответ: Создание больших массивов.
 
RBK я понял что ты хотел сказать что то важное, но прости, я этого не понял. Понял только то что мне нужно хранить инфу в виде октодерева. То есть ячейки с 8 чилдами. Но я даже не представляю как это сделать без массива. (была идейка как то использовать для этого типы, но походу бред)

Насчет чанков:
Если создать файл с информацией о ландшафте. И пусть он даже бесконечно большой, но одновременно загружено чанков в память будет припустим 441 как у Нотча(это кстате 14,5млн ячеек в массиве). Во время перехода с одного чанка на другой мне придется часть чанков что за областью зрения выгружать, а другую часть подгружать. Что сделают большие рывки во время игры. Я конечно знаю что в мморпг есть какой то отдельный буфер в котором подгружаются все текстуры и меши во время игры не влияя на фпс(на норм машинах), но помойму в блитсе еще такого нету...

Как же хранить и подгружать инфу о больших ландшафтах вроде того как это делал нотч но на блитсе? Очень помогло б без кода описать сам принцип словами и примерами. Заранее сенк

Mr_F_ 05.10.2011 02:36

Ответ: Создание больших массивов.
 
Цитата:

Что сделают большие рывки во время игры.
кстати в майне они заметны

Цитата:

Как же хранить и подгружать инфу о больших ландшафтах вроде того как это делал нотч но на блитсе?
либо в фоновом потоке (незя в блице), либо по маленьким порциям за кадр.

Halk-DS 05.10.2011 03:01

Ответ: Создание больших массивов.
 
Спасибо. Теперь ясно. Но походу геморно ппц.

RBK 05.10.2011 16:03

Ответ: Создание больших массивов.
 
Цитата:

Сообщение от Halk-DS (Сообщение 204643)
RBK я понял что ты хотел сказать что то важное, но прости, я этого не понял. Понял только то что мне нужно хранить инфу в виде октодерева. То есть ячейки с 8 чилдами. Но я даже не представляю как это сделать без массива. (была идейка как то использовать для этого типы, но походу бред)

Можно и в типах, например:
Код:


Type material

field mesh ;сетка загружаемого мира, работать лучше с поверхностями.
field surface ;собственно поверхность
field p1, p2, p3, p4 ;вершины квада поверхности

field brush ;кисть которой закрасим поверхность

;другие переменные
End Type

Type node

field x,y,z ;координаты узла

field FrontNode.node ;соседние узлы
field BackNode.node
field LeftNode.node
field RightNode.node
field TopNode.node
field BottomNode.node

field FrontMaterial.material ;поверхности этого узла
field BackMaterial.material
field LeftMaterial.material
field RightMaterial.material
field TopMaterial.material
field BottomMaterial.material

;другие переменные
End Type

Но мне больше нравится вариант с использованием банков. ReadBytes позволяет загружать блок информации любого размера прямо из файла.

Цитата:

Сообщение от Mr_F_ (Сообщение 204646)
либо в фоновом потоке (незя в блице), либо по маленьким порциям за кадр.

Не совсем точно, фоновый поток нельзя сделать командами блица, но можно загрузить DLL библиотеку, которая загрузит всё хоть в десять потоков.

Как создать dll библиотеку для блица в PureBasic(спасибо MadMedic за статью)

P.S. для тех кто хочет повозражать, "бдиц устарел(другие варианты)", вопрос был:
Цитата:

Сообщение от Halk-DS (Сообщение 204643)
Как же хранить и подгружать инфу о больших ландшафтах вроде того как это делал нотч но на блитсе?


Igor 06.10.2011 01:03

Ответ: Создание больших массивов.
 
Вроде в майне чанки хранятся в сжатом виде в папочке игры. А вообще, имхо, разумнее сделать алгоритм генерации зависящим от координат чанка, и если его никто не меняет - то и не сохранять. (тогда не будет проблем с ушедшими на 100500 далеко игроком)

LLI.T.A.L.K.E.R. 06.10.2011 15:50

Ответ: Создание больших массивов.
 
Но тогда скорее всего мир будет меняющимся..
Допустим игрок ушёл далеко - нашёл что-то особое в этом месте. Но ему нужно возвратиться (чтобы освободить инвентарь), а потом опять идти к тому месту.
Но мир уже перегенерировался..

Igor 06.10.2011 22:22

Ответ: Создание больших массивов.
 
Цитата:

Но мир уже перегенерировался..
нужна функция, которая имеет входные данные - координаты чанка и зерно карты. Результат (собственно чанк) зависит только от них, и при новой генерации мир останется таким же.
А если игрок начнёт что-то строить, уже ничего не поделать - сохранять изменённый чанк и тратить память

Halk-DS 08.10.2011 20:02

Ответ: Создание больших массивов.
 
Самим ярким для моего моска выдался этот вариант:
Цитата:

Сообщение от RBK (Сообщение 204699)
Можно и в типах, например:
Код:


Type material

field mesh ;сетка загружаемого мира, работать лучше с поверхностями.
field surface ;собственно поверхность
field p1, p2, p3, p4 ;вершины квада поверхности

field brush ;кисть которой закрасим поверхность

;другие переменные
End Type

Type node

field x,y,z ;координаты узла

field FrontNode.node ;соседние узлы
field BackNode.node
field LeftNode.node
field RightNode.node
field TopNode.node
field BottomNode.node

field FrontMaterial.material ;поверхности этого узла
field BackMaterial.material
field LeftMaterial.material
field RightMaterial.material
field TopMaterial.material
field BottomMaterial.material

;другие переменные
End Type


Поэтому хотел спросить конкретнее, 1 кубик (node) имеет в себе 6 сторон(6 елементов из типа material). А судя из этого:
Цитата:

field mesh ;сетка загружаемого мира, работать лучше с поверхностями.
На каждую сторону кубика будет приходить по 1-му мешу. Стоит ли создавать так много мешей? Или лучше создать:
Код:

Global World=CreateMesh()
И все созданные сурфейсы в типе material просто обьеденить в 1 созданный меш World?

Но после этого встает еще один вопрос. Если я зделаю:
Код:

ClearSurface(N\Surface)
Delete N

Останутся ли в памяти компьютера какието переменные?
Тоесть я просто неувидел никакой команды вроде:
FreeSurface(Surface) или DeleteSurface(Surface). А нужны ли они вообще? Или их вполне заменяет ClearSurface

RBK 08.10.2011 22:53

Ответ: Создание больших массивов.
 
Цитата:

На каждую сторону кубика будет приходить по 1-му мешу. Стоит ли создавать так много мешей?
Нет mesh в типе material один и тот-же, для каждой стороны создаём сурфейс.
Цитата:

Но после этого встает еще один вопрос. Если я зделаю:

Код:

ClearSurface(N\Surface)
Delete N


Удалять ненужные сурфейсы не надо, крась их кистью(чтобы скрыть), и кидай в список свободных, потом из него возьмёшь как понадобится.

LLI.T.A.L.K.E.R. 09.10.2011 03:38

Ответ: Создание больших массивов.
 
А так вроде Меш по новой составлять нужно будет.
FreeSurface не предусмотрели :(

Halk-DS 13.10.2011 00:16

Ответ: Создание больших массивов.
 
Опять немного застрял. Я типы понимал хорошо но вот с типами внутри типов немного туговато. А без нужного знания, как я понимаю совершить такое:
Цитата:

Сообщение от RBK (Сообщение 205159)
Удалять ненужные сурфейсы не надо, крась их кистью(чтобы скрыть), и кидай в список свободных, потом из него возьмёшь как понадобится.

Невозможно. Кроме того, скорей всего я буду удалять их, потому что по моим расчетам их будет слишком много чтоб хранить все, даже в списке для свободных.
Ну а в целом, я прочитал статейку в Blitz et Cetera по Связанных списках раз пять. Но без вашей помощи не разберусь.
Как я говорил выбрал метод с типами. И реализовал все примерно так:

Код:

Global World=CreateMesh() -Главный меш поверхности.
Dim W(512,512,128) -Массив в котором лежат цифры от 0. Какие обозначают ИД
предмета. Ну типа 0-пустота. 1-земля. 2-камень и т.п. Он скорей всего будет
составляется из рисунка(хейтмапы), ибо алгоритм генерирования поверхности
немного сложноват для меня в данный момент. Возможно я этот масив как нибудь
плавно уберу, но пока что без него не обойдусь.


Type Side
        Field Surf
        Field V1,V2,V3,V4
        Field Brush
End Type

Это тип Side в котором хранятся все видимые стороны с какими может
взаимодействовать персонаж. А невидимых нет в памяти. Они будут создаваться по
ходу игры. Например персонаж на равнине выкопал 1 ямку и в место 1-й видимой
поверхности стало видимо 5 которые ее соседями и тут же создались.




А это тип node в котором хранятся кубы земли(или другого материала), а точнее
здесь и обьеденены 6 сторон куба(элементы списка Side). и соседи этого
куба(элементы списка node).

Type node
        Field X,Y,Z
- Координаты куска земли и соотвецтвенно индекс массива W(x,y,z)

Соседи куба(элементы списка node):

        Field FN.Node
        Field BN.node
        Field LN.node
        Field RN.node
        Field UN.node
        Field DN.node


Стороны куба(элементы списка Side):

        Field FS.Side
        Field BS.Side
        Field LS.Side
        Field RS.Side
        Field US.Side
        Field DS.Side
End Type

Ну и есть функция CreateWorld(Path$), которая по нужной хейтмапе забивает наш массив W(x,y,z) - нужными значениями о которых я говорил выше когда описывал массив.
В конце этой функции вызывается еще одна CoverWorld(), которая и покрывает наш мир вертексами и треугольниками.
Теперь мы подошли к моей проблеме впритык и долгих, возможно ненужных описаний давать больше не буду: :)
Функция создания нода(куба):

Код:

Function CreateNode(X,Y,Z,L,R,B,F,D,U)
Где:
X,Y,Z-Координаты куба.
L,R,B,F,D,U- Переменные которые говорят видима ли для игрока сторона куба
или нет. Название переменной это первая буква слова: L-Left R-Right и так далее...

N.Node=New Node
N\X=X
N\Y=Y
N\Z=Z
If L     
-Если переменная L имеет значение True - создаем сторону:
B.Side=New Side
B\Surf=CreateSurface(World)
B\V1=AddVertex(B\Surf,X-1,Y,Z)
B\V2=AddVertex(B\Surf,X-1,Y-1,Z)
B\V3=AddVertex(B\Surf,X-1,Y-1,Z-1)
B\V4=AddVertex(B\Surf,X-1,Y,Z-1)
AddTriangle(B\Surf,B\V1,B\V2,B\V3)
AddTriangle(B\Surf,B\V3,B\V4,B\V1)
EndIf

If R
Теперь это правая сторона куба
...
и так далее...
If B
...
If F
...
If D
...
If U
...
...
End Function

Вопрос: Как мне в типе Node записать значения LS.Side, RS.Side, FS.Side и т.д. нужными мне елементами из типа Side. И как к ним быстро обращатся без For Each.

Markova 13.10.2011 00:50

Ответ: Создание больших массивов.
 
без For Each не как, это же типы, можно исхитрится, через память…
Цитата:

Function PokeString(bank,offset,s$)
PokeInt bank,offset,Len(s$)
For i = 1 To Len(s$)
PokeByte(bank,offset+i+3, Asc(Mid$(s$,i,1)))
Next
End Function

Function PeekString$(bank,offset)
l = PeekInt(bank,offset)
s$ = ""
For i = 1 To l
s$ = s$ + Chr$(PeekByte(bank,offset+i+3))
Next
Return s$
End Function
но опять же For Each а выглядит всё жутковато, не ужели это
Цитата:

B\Surf=CreateSurface(World)
B\V1=AddVertex(B\Surf,X-1,Y,Z)
B\V2=AddVertex(B\Surf,X-1,Y-1,Z)
B\V3=AddVertex(B\Surf,X-1,Y-1,Z-1)
B\V4=AddVertex(B\Surf,X-1,Y,Z-1)
AddTriangle(B\Surf,B\V1,B\V2,B\V3)
AddTriangle(B\Surf,B\V3,B\V4,B\V1)
будет шесть раз, а если бы надо было сделать триста сторон у тристостороника, а для чего тогда тип создавать?

IGR 13.10.2011 00:51

Ответ: Создание больших массивов.
 
пиши не
If L -Если переменная L имеет значение True - создаем сторону:
B.Side=New Side
...

а сразу
N\LS=New Side

Halk-DS 13.10.2011 01:10

Ответ: Создание больших массивов.
 
Цитата:

Сообщение от Markova (Сообщение 205683)
без For Each не как, это же типы, можно исхитрится, через память…

Может я в статье неправильно понял, но помойму мне как то должны помочь команды Object() и Handle() для того чтоб не перебирать уйму типов, а обратится конкретно к нужному мне, который я записал. Статья

Цитата:

Сообщение от Markova (Сообщение 205683)
не ужели это будет шесть раз, а если бы надо было сделать триста сторон у тристостороника, а для чего тогда тип создавать?

Я б тогда запустил цикл на For J=1 to N где N-кол-во углов, а это:
Цитата:

B\Surf=CreateSurface(World)
B\V[J]=AddVertex(B\Surf,X-1,Y,Z)
AddTriangle(B\Surf,B\V[J-2],B\V[J-1],B\V[J])
запихнул б в отдельную функцию. (типа код корявый но думаю мысль понятна)

Цитата:

Сообщение от IGR (Сообщение 205684)
пиши не
If L -Если переменная L имеет значение True - создаем сторону:
B.Side=New Side
...

а сразу
N\LS=New Side

Спасибо. Прямо в яблочко. Задавать понял как. А как теперь к ним обращаться без For Each?
п.с. А если тип уже создан, как его добавить? Оо

RBK 13.10.2011 01:16

Ответ: Создание больших массивов.
 
Зайди в ICQ

IGR 13.10.2011 01:51

Ответ: Создание больших массивов.
 
ну так же и обращятся !! у тебя уже сохранен указател на сайд !! форич тут ненужен !!
N\LS\field_твоего_типа_сайд = значение


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

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