Представим ситуацию, когда необходимо создать массив, где периодически появляются новые объекты и исчезают старые. Это, конечно, можно легко сделать с помощью типов, но рассмотрим вариант, когда максимум объектов определен и их порядок не имеет значения. В этом случае можно ускорить работу программы за счет использования банка вместо типов. Пусть длина одной записи равна константе reclen. Введем переменную-указатель, обозначающую последний элемент записи, изначально она равна -reclen, т.к. в банке нет элементов. При занесении нового элемента, указатель увеличивается на reclen и в этот адрес заносится новая запись. При удалении элемента, на место удаляемой записи копируются данные последней записи в банке и указатель уменьшается на reclen. Для примера, рассмотрим программу, имитирующую снегопад:
;Maxrec - максимальное количество записей, reclen - длина записи в байтах (в
; данном примере запись содержит координаты: x(int), y(float), приращения:
; dx(Float), dy(Float), цвет с(byte) - 17 байт)
Const maxrec=120000, reclen=17
;Создаем банк
bnk=CreateBank(maxrec*reclen)
;Адрес последнего элемента в банке
addr=-reclen
Graphics 800,600,32
;Массив для хранения значений цветов (градаций серого)
Dim col(255)
For n=0 To 255
col(n)=n*65793
Next
SetBuffer BackBuffer()
Repeat
;Добавляем 400 снежинок
For n=1 To 400
addr=addr+reclen
PokeFloat bnk,addr,Rand(800);координата x
PokeFloat bnk,addr+4,0;координата y
PokeFloat bnk,addr+8,Rnd(-1,1);приращение по x
PokeFloat bnk,addr+12,Rnd(2,10);приращение по y
PokeByte bnk,addr+16,Rnd(64,255);номер цвета
Next
Cls
LockBuffer BackBuffer()
;Цикл по всем снежинкам в банке
n=0
While n<=addr
;Добавляем приращения к координатам
x#=PeekFloat(bnk,n)+PeekFloat(bnk,n+8)
y#=PeekFloat(bnk,n+4)+PeekFloat(bnk,n+12)
If x<0 Or x>799 Or y#>599 Then
;Если снежинка вышла за край экрана - удаляем ее из банка
CopyBank bnk,addr,bnk,n,reclen
addr=addr-reclen
;Так как на ее место стала последняя, то адрес не увеличивается
Else
;Иначе - отображаем на экране и обновляем координаты
WritePixelFast x#,y#,col(PeekByte(bnk,n+12))
PokeFloat bnk,n,x#
PokeFloat bnk,n+4,y#
;Переходим к следующей снежинке
n=n+reclen
End If
Wend
UnlockBuffer BackBuffer()
Flip
Until KeyHit(1)
|