Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Помогите оптимизировать код. Добавлено: 25.11.05 22:41  

Автор вопроса:  Страшный Сон
Есть такой код, по сути, он у меня отображает на форме содержимое массива fxb, повернутое под определенным углом:

Dim XVX&, XVY&, YVX&, YVY&, CX&, CY&, SX&, SY&, TX&, TY&, X&, Y&, A!, S&, C&, Sc!, CenX&, CenY&
ZeroMemory pict(0, 0), 921600
A = Angle(320, 240, MP.X, MP.Y) + 216.8 * pi / 180
Sc = Dist(320, 240, MP.X, MP.Y) / 400
If Sc = 0 Then Exit Sub
CenX = 320
CenY = 240
S = Int(Sin(A) / Sc * 65536#)
C = Int(Cos(A) / Sc * 65536#)
SX = 20971520 + CenY * C - CenX * S
SY = 15728640 - CenX * C - CenY * S
XVX = S
XVY = -C
YVX = C
YVY = S

For Y = 0 To 479
  CX = SX
  SX = SX + XVY
  CY = SY
  SY = SY + YVY
  For X = 0 To 1919 Step 3
    TX = (CX \ 65536) * 3
    CX = CX + XVX
    If TX >= 0 Then
      If TX < 1920 Then
        TY = (CY \ 65536)
        If TY >= 0 Then
          If TY < 480 Then
            pict(X, Y) = fxb(TX, TY)
            pict(X + 1, Y) = fxb(TX + 1, TY)
            pict(X + 2, Y) = fxb(TX + 2, TY)
          End If
        End If
      End If
    End If
    CY = CY + YVX
  Next X
Next Y


Подсчеты fps показывают, что на каждый пиксел уходит по 85-90 тактов камня, причем скорость почти не зависит от угла поворота, как будто каждый пиксел происходят кэш-промахи... Странно это как-то. Что-то тут можно сделать?

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #1 Добавлено: 25.11.05 23:18
Можно попробовать заменить
TX = (CX \ 65536) * 3
на
TX = (CX \ 65536)
TX = TX + TX + TX
т.к. 3 сложения должны выполняться быстрее умножения. Хотя тоже не факт.

Можно попробовать определить, какое условие в парах >= / < выполняется реже, и поставить его первым.

Можно переписать на цпп или асм и вынести в длл.

Ответить

Номер ответа: 2
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #2 Добавлено: 25.11.05 23:26
Можно попробовать вынести
CX = SX за цикл в виде CX = SX - XVY, а вместо пары
CX = SX
SX = SX + XVY
оставить в цикле
CX = CX + XVY

И точно так же поступить с CY.

Ответить

Номер ответа: 3
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #3
Добавлено: 26.11.05 04:49
А ты попробуй оптимизацию доверить компилятору. Это в ассемблере пошагово оптимизируется, а компилятор оптимизирует формулы. Если у него не хватит регистров на все твои переменные, то он конечно же начнёт использовать память. Если будешь писать так как положено (формулами), то он по идее сам должен вынести за цикл что нужно.

Ответить

Номер ответа: 4
Автор ответа:
 Страшный Сон



Вопросов: 46
Ответов: 848
 Профиль | | #4 Добавлено: 28.11.05 12:13
Я попробовал переделать циклы и ввести статический массив fxb2 вместо pict, который был динамическим. А потом в pict все копирую. Почему-то так получается быстрее более чем в 1.5 раза...


Dim CX&, CY&, SX&, SY&, TX&, TY&, X&, Y&, A!, S&, C&, Sc!, Strt$, CenX&, CenY&, AA&
ZeroMemory fxb2(0, 0), 921600
A = Angle(320, 240, MP.X, MP.Y) + 216.8 * pi / 180
Sc = Dist(320, 240, MP.X, MP.Y) / 400
If Sc = 0 Then Exit Sub
CenX = 320
CenY = 240
S = Int(Sin(A) / Sc * 65536#)
C = Int(Cos(A) / Sc * 65536#)
SX = 20971520 + CenY * C - CenX * S
SY = 15728640 - CenX * C - CenY * S
Y = 0
DoY:
  CX = SX
  SX = SX - C
  CY = SY
  SY = SY + S
  X = 0
DoX:
    TY = CY \ 65536
    CY = CY + C
    If TY >= 0 Then
      If TY < 480 Then
        TX = (CX \ 65536) * 3
        If TX >= 0 Then
          If TX < 1920 Then
            fxb2(X, Y) = fxb(TX, TY)
            fxb2(X + 1, Y) = fxb(TX + 1, TY)
            fxb2(X + 2, Y) = fxb(TX + 2, TY)
          End If
        End If
      End If
    End If
    CX = CX + S
    X = X + 3
  If X < 1920 Then GoTo DoX
  Y = Y + 1
If Y < 480 Then GoTo DoY
CopyMemory pict(0, 0), fxb2(0, 0), 921600

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам