Страница: 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 тактов камня, причем скорость почти не зависит от угла поворота, как будто каждый пиксел происходят кэш-промахи... Странно это как-то. Что-то тут можно сделать?
Ответить
|
Номер ответа: 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.
Ответить
|
Номер ответа: 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 / Sc * 65536#)
C = Int(Cos / 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 |
Поиск по форуму