Показать сообщение отдельно
Старый 03.04.2009, 10:00   #18
Venom
Оператор ЭВМ
 
Регистрация: 25.02.2008
Сообщений: 24
Написано 8 полезных сообщений
(для 30 пользователей)
Ответ: Памагитяяяяяяяяяя...

Сообщение от 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 нету или кому просто лень
Вложения
Тип файла: zip Time.zip (1.3 Кб, 395 просмотров)

Последний раз редактировалось Venom, 03.04.2009 в 10:08.
(Offline)
 
Ответить с цитированием