Тяжелые проблемы с производительностью на разных процессорах - PullRequest
0 голосов
/ 28 сентября 2019

Я написал некоторый код, включающий 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

Second

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...