Сообщение от impersonalis
Товарищ, я по математике не блистал познаниями, да и прогером формально никогда не был, но уже начало вашего кода уныло чуть боее чем полностью.
|
И чем же оно "уныло"? Цитаты приведи с пояснениями или только ля-ля-тополя?
Сообщение от impersonalis
Откуда эти константы (в плане - хрен ли так оформлено, а не - откуда взяты значения)? Где переменные?
|
В упор не вижу констант, где ты их там нашел? Или ты иеешь ввиду угол и дальность обзора? Так я их для примера взял. Непонимаю.
Сообщение от impersonalis
Почему код настолько конкретен (простая смена разрешения рушит всё к чертям)?
|
Что она рушит? Прямо сейчас сменил разрешение - все работает как работало. Тоже непонимаю
Сообщение от impersonalis
Вызов функции Text сжирает производительность многократно.
|
Помоему это даже любому нубу понятно что функции Text использованы не более чем для наглядности, для проверки работает или нет.
Сообщение от impersonalis
Уважайте чужой труд - ссылка на Carmack’s Unusual Inverse Square Root (game/code/q_math.c) не помешает
|
Ну если этот быстрый обратный корень Кармак придумал - честь и хвала ему, я не знал, припомнить откуда я этот трюк вычитал я уже не смогу, давно это было.
ЗЫ
Хотите тесты? Их есть у меня!

;kernel32.decls:
;
;.lib "kernel32.dll"
;Sleep(time%)
;QueryPerformanceCounter(count*)
;QueryPerformanceFrequency(frequency*)
;Для расчета времени из 64-битных значений RDTSC:
;Код на PureBasic:
;ProcedureDLL.f Time(*cnt1.QUAD, *cnt2.QUAD, *freq.QUAD)
; ProcedureReturn (*cnt2\q - *cnt1\q) * 1000.0 / *freq\q
;EndProcedure
;Оригинал
Function entity_in_view1%(from%, what%, dist#, view#)
If (EntityDistance(from, what) < dist) Then
If ((Abs(DeltaYaw(from, what)) < view) And (Abs(DeltaPitch(from, what)) < view)) Then
Return 1
EndIf
EndIf
Return 0
End Function
;Аналог
Function entity_in_view2%(from%, what%, dist#, view#)
Local xsub#, ysub#, zsub#, temp#
xsub = EntityX(what) - EntityX(from)
ysub = EntityY(what) - EntityY(from)
zsub = EntityZ(what) - EntityZ(from)
temp = xsub * xsub + ysub * ysub + zsub * zsub
If (temp < dist) Then
temp = 1.0 / Sqr(temp)
xsub = xsub * temp
ysub = ysub * temp
zsub = zsub * temp
temp = xsub * GetMatElement(from, 2, 0) + ysub * GetMatElement(from, 2, 1) + zsub * GetMatElement(from, 2, 2)
If (temp > view) Then
Return 1
EndIf
EndIf
Return 0
End Function
Const CDIST# = 10.0 ;Расстояние обзора
Const CVIEW# = 25.0 ;Угол обзора (+\-)
Local from%, what%, dist#, view#
Local cnt1%, cnt2%, freq%, pass%, res1#, res2#
Graphics3D(800, 600, 32, 2)
SetBuffer(BackBuffer())
;Два обьекта
from = CreateCube()
what = CreateCube()
;Отодвигаем немного
PositionEntity(from, 0.0, 0.0, +3.0)
PositionEntity(what, 0.0, 0.0, -3.0)
;Банки для RDTSC
cnt1 = CreateBank(8)
cnt2 = CreateBank(8)
freq = CreateBank(8)
;Оригинал -------------------------------------------------
dist = CDIST
view = CVIEW
Sleep(25)
QueryPerformanceCounter(cnt1)
For pass = 1 To 1000000
entity_in_view1(from, what, dist, view)
Next
QueryPerformanceCounter(cnt2)
QueryPerformanceFrequency(freq)
res1 = Time(cnt1, cnt2, freq)
;--------------------------------------------------------
;Аналог -------------------------------------------------
dist = CDIST * CDIST
view = Cos(CVIEW)
Sleep(25)
QueryPerformanceCounter(cnt1)
For pass = 1 To 1000000
entity_in_view2(from, what, dist, view)
Next
QueryPerformanceCounter(cnt2)
QueryPerformanceFrequency(freq)
res2 = Time(cnt1, cnt2, freq)
;--------------------------------------------------------
RuntimeError("Оригинал: " + Str(res1) + Chr(13) + "Аналог: " + Str(res2))
End
К сожалению RDTSC юзают 64-битные переменные, потому пришлось написать вспомогательную DLL для расчета, исходник на PureBasic в начале приведен, там же и нужный decls.
Ну или качайте аттач с dll и деклсами, у кого PureBasic нету или кому просто лень
