Я написал некоторый код, включающий 4-мерный логический массив (каждое измерение от 1-22).мой код перебирает каждый элемент этого массива, выполняет некоторые вычисления и записывает результат в этот массив.(Во время выполнения действия код отключается при обновлении экрана.) Странно то, что когда я запускаю этот код в действительно старом процессоре (Intel 4xxx - 4 потока, ~ 3 ГГц, 4 ГБ ОЗУ, win 7 64 бит), для завершения требуется 10 секунд.операция.Когда я запускаю тот же код в новом процессоре (Intel 6600K, 3,5 ГГц - Quad Core, 16 ГБ ОЗУ, win 10 64 бит), мне требуется почти 2 минуты для завершения ... У меня нет проблем с производительностью в любом месте на новом ПК,У меня не работает процесс загрузки процессора.Я размышлял об исправлениях «Призрак» и «Обвал», о которых говорили, что это может повлиять на производительность процессора, но не так сильно. Кто-нибудь знает, что может быть не так?
Идея этого кода состоит в том, чтобы получитькакое-то поле зрения игрока (представленное заполненной ячейкой. Поэтому сначала мне нужно проверить каждую граничную ячейку диапазона обзора и передать координаты этой ячейки в следующее подполе (поле). Важным примечанием здесь является то, что этот код предварительно вычисляет FOVдля каждой возможной позиции игрока (и, таким образом, сама карта обхода обходится быстрее). Но этот предварительный расчет выполняется намного быстрее на более медленном ПК, чем на моем домашнем ПК. На обоих ПК установлен Excel 365 (в разных версиях, кроме).
Public Sub preVisibility(Optional levelnumb As Integer)
Dim hrac As cls_Player
Set hrac = m_Variables.hrac
Dim x As Integer, y As Integer
Dim posx As Integer, posy As Integer
For posx = 1 To 22
For posy = 1 To 22
If m_Variables.worldfield(posx, posy) = m_Variables.barv.zed Or _
m_Variables.worldfield(posx, posy) = m_Variables.barv.Zpruchod Or _
m_Variables.worldfield(posx, posy) = m_Variables.barv.void Or _
m_Variables.worldfield(posx, posy) = m_Variables.barv.voda Then
Else
For x = 1 To 22
For y = 1 To 22
If x = 1 And posx < 6 And m_Functions.square(x, posx, y, posy) <= 4.5 Then
Call m_Field.field(posx, posy, 1, y)
ElseIf x = 22 And posx > 17 And m_Functions.square(x, posx, y, posy) <= 4.5 Then
Call m_Field.field(posx, posy, 22, y)
End If
If y = 1 And posy < 6 And m_Functions.square(x, posx, y, posy) <= 4.5 Then
Call m_Field.field(posx, posy, x, 1)
ElseIf y = 22 And posy > 17 And m_Functions.square(x, posx, y, posy) <= 4.5 Then
Call m_Field.field(posx, posy, x, 22)
End If
If m_Functions.square(x, posx, y, posy) > 3.4 And m_Functions.square(x, posx, y, posy) <= 4.5 Then
Call m_preField.field(posx, posy, x, y)
End If
Next y
Next x
End If
Next posy
Next posx
Эта подпрограмма вычисляет, существует ли «стена» между игроком и граничной ячейкой. Если это так, ячейки между игроком и стеной считаются видимыми и отображаются правильно (ячейки между стеной и граничной ячейкой не считаются видимыми). Параметр Явный
Dim visible(1 To 22, 1 To 22) As Boolean
Public arr(1 To 22, 1 To 22, 1 To 22, 1 To 22) As Boolean 'pozice hráče x, pozice hráče y, x,y - hodnota, jestli má být true nebo false
Public Sub field(startx As Integer, starty As Integer, endx As Integer, endy As Integer)
Dim i As Integer, j As Integer, k As Integer
Dim koef As Single
Dim st As Integer
Dim x As Integer
Dim y As Integer
Dim stx As Integer
Dim flag As Boolean
If starty < endy Then
st = 1
Else
st = -1
End If
If startx < endx Then
stx = 1
Else
stx = -1
End If
flag = False
On Error Resume Next
koef = (endy - starty) / (endx - startx)
If koef > -1 And koef < 1 Then
For x = startx To endx Step stx
For y = starty To endy Step st
k = (x - startx) * koef + starty
If visible(x, k) = True Then
arr(startx, starty, x, k) = True
flag = True
Exit For
Else
arr(startx, starty, x, k) = True
End If
Next y
If flag = True Then Exit For
Next x
Else
koef = (endx - startx) / (endy - starty)
flag = False
For y = starty To endy Step st
For x = startx To endx Step stx
k = (y - starty) * koef + startx
If visible(k, y) = True Then
arr(startx, starty, k, y) = True
flag = True
Exit For
Else
arr(startx, starty, k, y) = True
End If
Next x
If flag = True Then Exit For
Next y
End If
On Error GoTo 0
End Sub
Результат выглядит так: (Красный - игрок, брсобственные - это стены)
![First](https://i.stack.imgur.com/Pj9vB.png)
![Second](https://i.stack.imgur.com/rBZKr.png)