forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Советы по оптимизации (http://forum.boolean.name/showthread.php?t=17056)

burovalex 10.01.2013 23:10

Ответ: Советы по оптимизации
 
Забил на эту программульку, вручную создал LOD'ы - никаких рывков.
Да и своя технология создания выработалась )
Вот что у меня получилось
http://forum.boolean.name/showthread...982#post248982

burovalex 14.01.2013 13:33

Ответ: Советы по оптимизации
 
У меня возникла очередная идея )

Если большое количество Ентитей нагружает проц, а скрытие элементов не полностью не освобождает ресурсы. У меня возникла идея вместо использования AutoFade, уничтожать ентити с растоянием.
Я про те ентити, которые сидят в списках.
Затем проходить по спискам, допустим по 100 элементов в кадр и если нужно вернуть мешу - копируем её шаблона и трансформируем.

Как думаете, будет ли такой вариант быстрее, при расчете, что элементов допустим 3 тысячи.

И ещё, есть какие нибудь варианты вычислить расстояние до точки.
У меня только примитивный вариант, перемещать какой-нибудь пивот и вызывать EntityDistance(). :rolleyes:

burovalex 14.01.2013 22:14

Ответ: Советы по оптимизации
 
Ну что скажете? Что посоветуете?

burovalex 14.01.2013 22:18

Ответ: Советы по оптимизации
 
О, мистер Ф!! Заходи дорогой! ))

Mr_F_ 14.01.2013 22:39

Ответ: Советы по оптимизации
 
Цитата:

О, мистер Ф!! Заходи дорогой! ))
я хотел пройти незаметно, у меня сессия =/

ну ок:
Цитата:

уничтожать ентити с растоянием.
уничтожать может быть медленно, впрочем, цикл по миллиону ентитей внутри блица тоже может быть медленно, так что тести.

Цитата:

Я про те ентити, которые сидят в списках.
не понял о каких списках речь

Цитата:

И ещё, есть какие нибудь варианты вычислить расстояние до точки.
У меня только примитивный вариант, перемещать какой-нибудь пивот и вызывать EntityDistance().
погугли

SBJoker 14.01.2013 23:20

Ответ: Советы по оптимизации
 
Мудрость предыдущих поколений блитцеров гласит:
не используй HideEntity без крайней нужды ибо тормазит оно, используй EntityAlpha(0) вместо него, да ускорится программа твоя.

FREE MAN 15.01.2013 00:25

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от SBJoker (Сообщение 249445)
Мудрость предыдущих поколений блитцеров гласит:
не используй HideEntity без крайней нужды ибо тормазит оно, используй EntityAlpha(0) вместо него, да ускорится программа твоя.

Уважаемый SBJoker, а на Xors3d это распространяется?

SBJoker 15.01.2013 01:34

Ответ: Советы по оптимизации
 
За ксорс не скажу, но можно проверить, делается тест с сокрытием кучи энтатей по альфе и по сокрытию.

burovalex 15.01.2013 07:10

Ответ: Советы по оптимизации
 
Ладно, спс!
Ну списком я иногда подразумеваю записи тайпа.
Сегодня сделаю семпл по этой теме. И альфу с хайдом сравню.

Удачи тебе МрФ! Билетов попроще! )

burovalex 15.01.2013 07:30

Ответ: Советы по оптимизации
 
А у меня еще один вопрос родился. У меня при работе в ксорсе иногда зависает бук, похоже на ошибку обращения к памяти (синий экран смерти). Замечаю такую тенденцию, что в основном косяк происходит при нескольких MAV'ах.
Как думаете, может ли это быть связано с тем, что в корявом коде я обращаюсь на несуществующую ссылку в память, которая в своё время уже занята другим процессом - что приводит к краху системы?

burovalex 15.01.2013 10:50

Ответ: Советы по оптимизации
 
Отчет!!
Ну что, господа булочники)

Начну со слов Джокера
Цитата:

Мудрость предыдущих поколений блитцеров гласит:
не используй HideEntity без крайней нужды ибо тормазит оно, используй EntityAlpha(0) вместо него, да ускорится программа твоя.
Эта легенда не оправдалась.
У меня терпения хватило на 50к кубиков.
Скрытие в Ксорс, что с помощью xHideEntity (fps-60) ,что с помощью xEntityAlpha (fps-60)
Блитц HideEntity (fps-58 ) , EntityAlpha (fps-58 )
Легенда разрушена!! :-D

Зато порадовала производительность Ксорса, она выше блитца на + 20%
Тест на 40к кубиков, результат отдаление с AutoFade
Цитата:

Blitz 4к кубиков - fps(20)
Xors 5к кубиков - fps(20)

Blitz 15к кубиков - fps(6-7)
Xors 15к кубиков - fps(8-9)
семпл блитца
Global n=15000 ;Число кубиков count of cubes
;=========================
Graphics3D 1024,768,32,2
SetBuffer BackBuffer()

Global camera=CreateCamera()
Global camAX#,camAY#
PositionEntity camera,0,0,-10
RotateEntity camera,0,0,0
lit=CreateLight()

Type mesh
Field mesh
Field x#,y#,z#
Field ax,ay,az
Field scale#
Field r,g,b
End Type

For i=1 To n
mesh.mesh=New mesh
mesh\mesh=CreateCube()
dist#=Rnd(10,200)
mesh\x=Rnd(-dist,dist)
mesh\z=dist
mesh\ay=Rand(0,360)
mesh\scale=Rnd(0.2,0.4)
mesh\r=Rand(30,250) : mesh\g=Rand(30,250) : mesh\b=Rand(30,250)
PositionEntity mesh\mesh,mesh\x,mesh\y,mesh\z
ScaleEntity mesh\mesh,mesh\scale,mesh\scale,mesh\scale
RotateEntity mesh\mesh,mesh\ax,mesh\ay,mesh\az
EntityColor mesh\mesh,mesh\r,mesh\g,mesh\b
EntityAutoFade mesh\mesh,210,210
Next

Global mode=0
Global time,timeMean#
Global f1=MilliSecs()
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
While Not KeyHit(1)
frame=MilliSecs()
CameraControl(camera)
RenderWorld

If KeyHit(57) Then
mode=mode+1
RestoreAllMesh()
If mode=1 Then HideAllMesh()
If mode=3 Then AlphaAllMesh(0)
EndIf

Text 5,10,"Tris: "+TrisRendered()
Text 5,30,"Cubes: "+TrisRendered()/12
If time=0 Then time=17
fps=1000/time
timeMean=(timeMean+time)/2
Text 5,50,"FPS: "+fps+" "+1000/timeMean
Text 5,70,"Mode: "+mode
Text GraphicsWidth()/2,300,"Key SPACE to switch mode 1-hide, 3-alpha(0)"
Flip
time=MilliSecs()-frame
Wend
End

Function CameraControl(cam)
camAX=camAX-MouseXSpeed()*0.3
camAY=camAY+MouseYSpeed()*0.3
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
RotateEntity cam,camAY,camAX,0
MoveEntity cam,(KeyDown(205)-KeyDown(203))*3,0,(KeyDown(200)-KeyDown(208))*3
End Function

Function HideAllMesh()
For mesh.mesh=Each mesh
HideEntity mesh\mesh
Next
End Function

Function AlphaAllMesh(alp#)
For mesh.mesh=Each mesh
EntityAlpha mesh\mesh,alp
Next
End Function

Function RestoreAllMesh()
For mesh.mesh=Each mesh
ShowEntity mesh\mesh
EntityAlpha mesh\mesh,1
Next
End Function

семпл ксорса

Global n=15000 ;Число кубиков count of cubes
;=========================
xGraphics3D 1024,768,32,1,0
xCreateLog(1,1,"xors_log.html")
Include "./incl/maxMode3d.bb"
xSetTextureFiltering TF_ANISOTROPIC
xSetBuffer xBackBuffer()

Global camera=xCreateCamera()
Global camAX#,camAY#
xPositionEntity camera,0,2,-10
lit=xCreateLight()

Type mesh
Field mesh
Field x#,y#,z#
Field ax,ay,az
Field scale#
Field r,g,b
End Type

For i=1 To n
mesh.mesh=New mesh
mesh\mesh=xCreateCube();xCreateSphere(4)
dist#=Rnd(10,200)
mesh\x=Rnd(-dist,dist)
mesh\z=dist
mesh\ay=Rand(0,360)
mesh\scale=Rnd(0.2,0.4)
mesh\r=Rand(30,250) : mesh\g=Rand(30,250) : mesh\b=Rand(30,250)
xPositionEntity mesh\mesh,mesh\x,mesh\y,mesh\z
xScaleEntity mesh\mesh,mesh\scale,mesh\scale,mesh\scale
xRotateEntity mesh\mesh,mesh\ax,mesh\ay,mesh\az
xEntityColor mesh\mesh,mesh\r,mesh\g,mesh\b
xEntityAutoFade mesh\mesh,200,200
Next

Global mode=0
Global time,timeMean#
While Not xKeyHit(1)
frame=xMillisecs()
CameraControl(camera)
xRenderWorld

If xKeyHit(KEY_SPACE) Then
mode=mode+1
RestoreAllMesh()
If mode=1 Then HideAllMesh()
If mode=3 Then AlphaAllMesh(0)
EndIf

xText 5,10,"Tris: "+xTrisRendered()
xText 5,30,"Cubes: "+xDIPCounter()
xText 5,50,"FPS: "+xGetFPS()
If time=0 Then time=17
timeMean=(timeMean+time)/2
xText 5,70,"Mode: "+mode
xText xGraphicsWidth()/2,300,"Key SPACE to switch mode 1-hide, 3-alpha(0)"
xFlip
time=frame
Wend
End

Function CameraControl(cam)
camAX=camAX-xMouseXSpeed()*0.3
camAY=camAY+xMouseYSpeed()*0.3
xRotateEntity cam,camAY,camAX,0
xMoveEntity cam,xKeyDown(KEY_RIGHT)-xKeyDown(KEY_LEFT),0,xKeyDown(KEY_UP)-xKeyDown(KEY_DOWN)
End Function

Function HideAllMesh()
For mesh.mesh=Each mesh
xHideEntity mesh\mesh
Next
End Function

Function AlphaAllMesh(alp#)
For mesh.mesh=Each mesh
xEntityAlpha mesh\mesh,alp
Next
End Function

Function RestoreAllMesh()
For mesh.mesh=Each mesh
xShowEntity mesh\mesh
xEntityAlpha mesh\mesh,1
Next
End Function


Щас попробовал написать такую функцию:
Код:

Function AutoHFade(n)
For i=1 To n
        mesh.mesh=First mesh
        If EntityDistance(camera,mesh\mesh)>200 Then
                HideEntity(mesh\mesh)
                Else
                ShowEntity(mesh\mesh)
        EndIf
        Insert mesh.mesh After Last mesh
Next
End Function


Прироста нет! Даже небольшое падение на общёте

Щас попробовал еще одну функцию, с которой вся тема и завелась в моей голове.
Функция с растоянием удаляет ентити и восстанавливает из данных полей.
Function AutoHFade(n)
For i=1 To n
mesh.mesh=First mesh
dx=mesh\x-EntityX(camera)
dy=mesh\y-EntityY(camera)
dz=mesh\z-EntityZ(camera)
dist=Sqr(dx*dx+dy*dy+dz*dz)
If dist>200 Then
FreeEntity(mesh\mesh) : mesh\mesh=0
Else
If mesh\mesh=0 Then
mesh\mesh=CreateCube()
PositionEntity mesh\mesh,mesh\x,mesh\y,mesh\z
ScaleEntity mesh\mesh,mesh\scale,mesh\scale,mesh\scale
RotateEntity mesh\mesh,mesh\ax,mesh\ay,mesh\az
EntityColor mesh\mesh,mesh\r,mesh\g,mesh\b
EndIf
EndIf
Insert mesh.mesh After Last mesh
Next
End Function


сам семпл bb

Код:

Global n=15000                        ;Число кубиков  count of cubes
;=========================
Graphics3D 1024,768,32,2
SetBuffer BackBuffer()

Global camera=CreateCamera()
Global camAX#,camAY#
PositionEntity camera,0,0,-10
RotateEntity camera,0,0,0
lit=CreateLight()

Type mesh
        Field mesh
        Field x#,y#,z#
        Field ax,ay,az
        Field scale#
        Field r,g,b
End Type

For i=1 To n
        mesh.mesh=New mesh
        mesh\mesh=CreateCube()
        dist#=Rnd(10,200)
        mesh\x=Rnd(-dist,dist)
        mesh\z=dist
        mesh\ay=Rand(0,360)
        mesh\scale=Rnd(0.2,0.4)
        mesh\r=Rand(30,250) : mesh\g=Rand(30,250) : mesh\b=Rand(30,250)
                PositionEntity mesh\mesh,mesh\x,mesh\y,mesh\z
                ScaleEntity mesh\mesh,mesh\scale,mesh\scale,mesh\scale
                RotateEntity mesh\mesh,mesh\ax,mesh\ay,mesh\az
                EntityColor mesh\mesh,mesh\r,mesh\g,mesh\b
Next

Global distPivot=CreatePivot()

Global mode=0
Global time,timeMean#,timeHAF
Global f1=MilliSecs()
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
While Not KeyHit(1)
frame=MilliSecs()
CameraControl(camera)
AutoHFade(500)
timeHAF=xMillisecs()-frame
RenderWorld

If KeyHit(57) Then
        mode=mode+1
        RestoreAllMesh()
        If mode=1 Then HideAllMesh()
        If mode=3 Then AlphaAllMesh(0)
EndIf

Text 5,10,"Tris: "+TrisRendered()
Text 5,30,"Cubes: "+TrisRendered()/12
If time=0 Then time=17
fps=1000/time
timeMean=(timeMean+time)/2
Text 5,50,"FPS: "+fps+"    "+1000/timeMean
Text 5,70,"Mode: "+mode
Text 5,120,"AutoHFade time: "+timeHAF
Text GraphicsWidth()/2,300,"Key SPACE to switch mode 1-hide, 3-alpha(0)"
Flip
time=MilliSecs()-frame
Wend
End

Function CameraControl(cam)
        camAX=camAX-MouseXSpeed()*0.3
        camAY=camAY+MouseYSpeed()*0.3
        MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
        RotateEntity cam,camAY,camAX,0
        MoveEntity cam,(KeyDown(205)-KeyDown(203))*3,0,(KeyDown(200)-KeyDown(208))*3
End Function

Function HideAllMesh()
For mesh.mesh=Each mesh
        HideEntity mesh\mesh
Next
End Function

Function AlphaAllMesh(alp#)
For mesh.mesh=Each mesh
        EntityAlpha mesh\mesh,alp
Next
End Function

Function RestoreAllMesh()
For mesh.mesh=Each mesh
        ShowEntity mesh\mesh
        EntityAlpha mesh\mesh,1
Next
End Function

Function AutoHFade(n)
For i=1 To n
        mesh.mesh=First mesh
        dx=mesh\x-EntityX(camera)
        dy=mesh\y-EntityY(camera)
        dz=mesh\z-EntityZ(camera)
        dist=Sqr(dx*dx+dy*dy+dz*dz)
        If dist>200 Then
                        FreeEntity(mesh\mesh) : mesh\mesh=0
                Else
                        If mesh\mesh=0 Then
                                mesh\mesh=CreateCube()
                                PositionEntity mesh\mesh,mesh\x,mesh\y,mesh\z
                                ScaleEntity mesh\mesh,mesh\scale,mesh\scale,mesh\scale
                                RotateEntity mesh\mesh,mesh\ax,mesh\ay,mesh\az
                                EntityColor mesh\mesh,mesh\r,mesh\g,mesh\b       
                        EndIf               
        EndIf
        Insert mesh.mesh After Last mesh
Next
End Function


Я выполняю xFreeEntity(), а в диспечере смотрю за оперативкой и за процессором, там ничего не меняется!!
Че за фигня?!
У меня только один вывод, не придумывайте себе геморой, как это делаю я. Используйте меньше ентити и ЛОДы. Ибудет счастье!!

SBJoker 15.01.2013 11:22

Ответ: Советы по оптимизации
 
Объявление не моё, я просто разместил объяву ;)

Wegox 15.01.2013 15:42

Ответ: Советы по оптимизации
 
HideEntity - EntityAlpha
Цитата:

Скрывает объект так, что он становится невидимым и больше не участвует в столкновения.
Основное применение - позволяет Вам создавать все объекты в начале программы, скрывать их, а затем копировать их и показывать по мере необходимости в основном игра. Это более эффективно, чем создание объектов в процессе игры.
Если Вы желаете скрыть объект так, чтобы он стал невидим, но все еще участвовал в столкновениях, то используйте команду EntityAlpha 0 вместо HideEntity. Это сделает объект полностью прозрачным.
HideEntity действует на указанный объект и все его дочерние(привязанные к нему) объекты, если такие существуют.
Как видим, две совершено разные функции, выполняющие разные задачи
что их и отличает!
То-есть на мой взгляд, тест с кубиками без учёта коллизии не пруф, давай по честному тесты проводить, а то получается что функция работает процентов на 50% а с учётом коллизии будет на все 100%
Я же могу скрывать объект для оптимизации, но не трогать коллизию:)

burovalex 15.01.2013 16:26

Ответ: Советы по оптимизации
 
Вот к примеру, я не пользуюсь коллизиями вообще, для это я пользуюсь физ движком.
И тест не для проверки коллизий, а что быстрее робит.
Да и вообще Хайд и Альфа я тестил только из интереса слов Джокера
Цитата:

Мудрость предыдущих поколений блитцеров гласит:
не используй HideEntity без крайней нужды ибо тормазит оно, используй EntityAlpha(0) вместо него, да ускорится программа твоя.
Цитата:

А Джокер услышал это от кого то...
Цитата:

Объявление не моё, я просто разместил объяву


Ну вот я решил и развеять легенду.

А суть теста вообще в другом. За место автоФейда удалять ентити. Короче надо будет, сам прочитаешь отчет :)

HolyDel 15.01.2013 17:00

Ответ: Советы по оптимизации
 
Цитата:

Щас попробовал написать такую функцию:
они внутри движка итак отрежутся по фрустуму.

попробуй на 1кк кубиков. и скомпиль оба ексешника пожалуйста, а то не у всех есть блиц, а потестить охота))

еще бы померить время самого скрытия с помощью альфы и хайдом. у меня в движке есть два варианта скрытия Hide / Show - которое удаляет ссылку на енити из сценграфа. оно работает долго, но зато скрытая таким образом ентити вообще никак не участвует в расчетах. так можно и миллион скрыть - и все равно ничего не изменится. и есть SetVisible - которое просто устанавливает флаг. Сам вызов SetVisible очень быстр, но скрытая таким образом ентити все равно участвует в расчетах (пусть и всего лишь проверка булевой переменной).

burovalex 15.01.2013 18:29

Ответ: Советы по оптимизации
 
Цитата:

и скомпиль оба ексешника пожалуйста, а то не у всех есть блиц
Да у меня тут инет тупой, на вахте. Завтра домой приеду, скомпилирую.
Цитата:

попробуй на 1кк кубиков
Ты чтооо??!?!? Какой миллион, у меня комп повис на 200к кубиков у меня комп реагировал со скоростью 1 кадр секунд 10...

Вообще тут тупой сценограф
Freeentity не освобождает ентити со сценографа. КАК ТАК!?!?! >:(
При 100к ентити, скрываешь или удаляешь ентити, оперативка не высвобождается, проц также в напряге, и нормально становится только при 2 к кубиков.
А это фуфло! У меня в проекте уже вырастает 750 растений и 4000 плоских мешей для дебага скрытых, плюс парочках пост-эффектов с дополнительным рендером - фпс стабильное. :dontknow:

HolyDel 16.01.2013 13:26

Ответ: Советы по оптимизации
 
FreeEntity в блице должен удалять ентити и из сценграфа и из памяти. Т.е. это полное очищение)))

память по диспетчеру небось смотришь? там она может не сразу снизиться.

Цитата:

У меня в проекте уже вырастает 750 растений и 4000 плоских мешей для дебага скрытых, плюс парочках пост-эффектов с дополнительным рендером - фпс стабильное.
синглсюрфейс? у меня 4 кубиков на блице работает на 180 фпс на i7/2770K / 460GT.

burovalex 16.01.2013 23:30

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от HolyDel (Сообщение 249631)
FreeEntity в блице должен удалять ентити и из сценграфа и из памяти. Т.е. это полное очищение)))

Да я прекрасно понимаю! ) Но и сам не понимаю как это может тормозить. Завтра выкину екзешники, посмотри плиз, исходники там же будут.

Цитата:

Сообщение от HolyDel (Сообщение 249631)
память по диспетчеру небось смотришь? там она может не сразу снизиться.

Да, по диспечеру, но ни сразу не потом ничего не меняется.
Хотя кубики копейки весят наверное, там то только мб пишет..

Цитата:

Сообщение от HolyDel (Сообщение 249631)
синглсюрфейс? у меня 4 кубиков на блице работает на 180 фпс на i7/2770K / 460GT.

Не понял что 4?? миллиона?
Ну извини, не сравнивай хайтэк с буком ))

HolyDel 17.01.2013 01:52

Ответ: Советы по оптимизации
 
4 тысячи.

burovalex 17.01.2013 11:12

Ответ: Советы по оптимизации
 
Я знаю Холидел, что 4 к кубиков работает без проблем и у меня, но сють в другом, с твоим процом если вывести гдето 200к кубиков и скрыть 196 к кубиков, блитц будет тормозить..

burovalex 24.01.2013 22:47

Ответ: Советы по оптимизации
 
Извиняюсь, что на тему подзабил, выкидываю екзешник и исходник в спойлере.

Мой вывод был правильный, не создавайте геморой. Максимум что можно помудрить - это разбиение на секторы. И то, надо ли это... Вряд ли ктото будет делать Обливион или Фалаут )

Погоняйте пример, мне показалось что Хайд ентити чуть быстрее работает чем Альфа(0). Тестил в углу на 3к кубиках и Хайд выиграл на пару сотен кубиков )


Код:

Global n=30000                        ;Число кубиков  count of cubes
;=========================
Graphics3D 1024,768,32,2
SetBuffer BackBuffer()

Global camera=CreateCamera()
Global camAX#,camAY#
PositionEntity camera,0,0,-10
RotateEntity camera,0,0,0
CameraRange camera,0.1,400
lit=CreateLight()

Type mesh
        Field mesh
        Field x#,y#,z#
        Field ax,ay,az
        Field scale#
        Field r,g,b
End Type

Global cube=CreateCube()

For i=1 To n
        mesh.mesh=New mesh
        mesh\mesh=CopyMesh(cube)
        mesh\x=Rnd(-200,200)
        mesh\z=Rnd(-200,200)
        mesh\ay=Rand(0,360)
        mesh\scale=Rnd(0.2,0.4)
        mesh\r=Rand(30,250) : mesh\g=Rand(30,250) : mesh\b=Rand(30,250)
                PositionEntity mesh\mesh,mesh\x,mesh\y,mesh\z
                ScaleEntity mesh\mesh,mesh\scale,mesh\scale,mesh\scale
                RotateEntity mesh\mesh,mesh\ax,mesh\ay,mesh\az
                EntityColor mesh\mesh,mesh\r,mesh\g,mesh\b
        EntityAutoFade mesh\mesh,200,200
Next

Global distPivot=CreatePivot()

Global mode=0
Global time,timeMean#,timeHAF
Global f1=MilliSecs()
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
While Not KeyHit(1)
frame=MilliSecs()
CameraControl(camera)
If mode=1 Then AutoHFade(500)
timeHAF=MilliSecs()-frame
RenderWorld

If KeyHit(57) Then
        mode=mode+1
        RestoreAllMesh()
        If mode=2 Then HideAllMesh(n-3000)
        If mode=4 Then AlphaAllMesh(0,n-3000)
        If mode>4 Then mode=0
EndIf

Text 5,10,"Tris: "+TrisRendered()
Text 5,30,"Cubes: "+TrisRendered()/12
If time=0 Then time=17
fps=1000/time
timeMean=(timeMean+time)/2
Text 5,50,"FPS: "+fps+"    "+1000/timeMean
Text 5,70,"Mode: "+mode
Select mode
        Case 0 : modeStr$="normal auto fade"
        Case 1 : modeStr$="delete auto fade"
        Case 2 : modeStr$="hide entity"
        Case 3 : modeStr$="normal auto fade"
        Case 4 : modeStr$="Alpha = 0"
End Select
Text 5,90,"Mode: "+modeStr
Text 5,140,"AutoHFade time: "+timeHAF
Color 200,100,100 : Text GraphicsWidth()/2,300,"Key SPACE to switch mode!" : Color 255,255,255
Flip
time=MilliSecs()-frame
Wend
End

Function CameraControl(cam)
        camAX=camAX-MouseXSpeed()*0.3
        camAY=camAY+MouseYSpeed()*0.3
        MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
        RotateEntity cam,camAY,camAX,0
        MoveEntity cam,(KeyDown(205)-KeyDown(203))*3,0,(KeyDown(200)-KeyDown(208))*3
End Function

Function HideAllMesh(n)
m=0
For mesh.mesh=Each mesh
        m=m+1
        If m<n Then HideEntity mesh\mesh
Next
End Function

Function AlphaAllMesh(alp#,n)
m=0
For mesh.mesh=Each mesh
        m=m+1
        If m<n Then EntityAlpha mesh\mesh,alp
Next
End Function

Function RestoreAllMesh()
For mesh.mesh=Each mesh
        If mesh\mesh=0 Then
                mesh\mesh=CreateCube()
                PositionEntity mesh\mesh,mesh\x,mesh\y,mesh\z
                ScaleEntity mesh\mesh,mesh\scale,mesh\scale,mesh\scale
                RotateEntity mesh\mesh,mesh\ax,mesh\ay,mesh\az
                EntityColor mesh\mesh,mesh\r,mesh\g,mesh\b       
        EndIf
        ShowEntity mesh\mesh
        EntityAlpha mesh\mesh,1
        EntityAutoFade mesh\mesh,200,200
        If mode<>0 Then EntityAutoFade mesh\mesh,1000,1000       
Next
End Function

Function AutoHFade(n)
For i=1 To n
        mesh.mesh=First mesh
        dx=mesh\x-EntityX(camera)
        dy=mesh\y-EntityY(camera)
        dz=mesh\z-EntityZ(camera)
        dist=Sqr(dx*dx+dy*dy+dz*dz)
        If dist>200 Then
                        FreeEntity(mesh\mesh) : mesh\mesh=0
                Else
                        If mesh\mesh=0 Then
                                mesh\mesh=CreateCube()
                                PositionEntity mesh\mesh,mesh\x,mesh\y,mesh\z
                                ScaleEntity mesh\mesh,mesh\scale,mesh\scale,mesh\scale
                                RotateEntity mesh\mesh,mesh\ax,mesh\ay,mesh\az
                                EntityColor mesh\mesh,mesh\r,mesh\g,mesh\b       
                        EndIf               
        EndIf
        Insert mesh.mesh After Last mesh
Next
End Function



Компиль http://www.sendspace.com/file/ia8zkw

Arton 24.01.2013 23:17

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от burovalex (Сообщение 250592)
Извиняюсь, что на тему подзабил, выкидываю екзешник и исходник в спойлере.

Мой вывод был правильный, не создавайте геморой. Максимум что можно помудрить - это разбиение на секторы. И то, надо ли это... Вряд ли ктото будет делать Обливион или Фалаут )

Погоняйте пример, мне показалось что Хайд ентити чуть быстрее работает чем Альфа(0). Тестил в углу на 3к кубиках и Хайд выиграл на пару сотен кубиков )

ХайдЭнтити самое оно, остальное выдавало FPS от 1 до 16 максимум.

burovalex 25.01.2013 13:38

Ответ: Советы по оптимизации
 
Народ, посматрите пример пожалуйста.
Не могу понять что за косяк.

Смысл такой. Я делаю каждый кадр LinePick на воду в нескольких точках.
А когда появляется новое дерево с параметром EntityPickMode 2 ксорс начинает дико тормозить.
И так с каждым появлением нового пикнутого дерева.

код тормозов:
Код:

For i=0 To 50
        xLinePick(0,50,i*3,0,-50,0)
        xCameraProject(camera,xPickedX(),xPickedY(),xPickedZ())
        xText xProjectedX(),xProjectedY(),i
Next

И дело даже не в 50 повторах, и при 5-ти тормозит. Хотя 50 это не много!

Ссылка http://www.sendspace.com/file/hgrgxv

HolyDel 25.01.2013 13:43

Ответ: Советы по оптимизации
 
я не могу его скачать. там тыщи кнопок download(( лотерея, блин

burovalex 25.01.2013 14:01

Ответ: Советы по оптимизации
 
Нажми Click here to start download from sendspace

Mr_F_ 25.01.2013 14:15

Ответ: Советы по оптимизации
 
Цитата:

делаю каждый кадр LinePick на воду
Цитата:

дерево с параметром EntityPickMode 2
тебе надо пикать воду? но ты создаёшь деревья тоже с возможностью их пикать? тебе только воду надо пикать 50 раз, а деревья не надо? попробуй может пробежаться по деревьям и выключить им пикмод перед большой чередой пиков.

HolyDel 25.01.2013 14:27

Ответ: Советы по оптимизации
 
1,2,4 - на границе всинка - 60 фпс
0,3 - 30 фпс

выключение в драйверах синхроимпульса не помогло.

burovalex 25.01.2013 16:50

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от Mr_F_ (Сообщение 250652)
тебе надо пикать воду? но ты создаёшь деревья тоже с возможностью их пикать? тебе только воду надо пикать 50 раз, а деревья не надо? попробуй может пробежаться по деревьям и выключить им пикмод перед большой чередой пиков.

Нет, мне воду надо пикать один раз, чтобы правильно расположить "подводный" слой.
Но даже один раз падает гдето на 5-10, но чувствуется - не приятно

Проблема решается, если пик деревьев определять как бокс или сфера, но это не решение. У меня должно быть взаимодействие с деревьями :mad:

Цитата:

1,2,4 - на границе всинка - 60 фпс
0,3 - 30 фпс
Не понял что эти цифры означают.. Номер кадров чтоли?

Mr_F_ 25.01.2013 17:30

Ответ: Советы по оптимизации
 
Цитата:

Проблема решается, если пик деревьев определять как бокс или сфера, но это не решение. У меня должно быть взаимодействие с деревьями
что если сделать деревья сферами, а когда тебе действительно нужно пикать деревья, то после нахождения сферы дерева, включаешь только ему одному (и вероятно нескольким ближайшим) полигональную проверку и пикаешь повторно уже с большой точностью.

burovalex 25.01.2013 19:50

Ответ: Советы по оптимизации
 
Спс конечно за совет, но для меня пока это слишком замороченно )
Да меня эта тема зацепила, потому что я думал что Пик функции быстрые...
Я подумал сделать так - если игрок в воде (позиция У ниже уровня воды), тогда пикать воду.
Слой "под водой" хочу сделать изобычного плоского меша, расположенным прямо перед камерой, как думаете, Какой размер делать слоя и на каком расстоянии от камеры?
Чтобы не было артефактов от будущих пузырей

burovalex 25.01.2013 22:12

Ответ: Советы по оптимизации
 
ВСЁ!! Сделал тест, и был удивлён!

Тест проведён на 1000 сфер, с разным количеством вызовов CameraPick в 3-х возможных режимах

Код:

Режим      кол-во вызовов          FPS
Sphere          15                  60
Mesh            15                    3
Box            15                  30

Mesh            1                  40

Честно, не ожидал что такая большая нагрузка будет.

Ссылка http://www.sendspace.com/file/ha9vz2
Жмём Click here to start download from sendspace

Исходник

Код:

Global n=1000                        ;Число кубиков  count of cubes
;=========================
Graphics3D 1024,768,32,2
SetBuffer BackBuffer()

Global PCount
Global camera=CreateCamera()
Global camAX#,camAY#
PositionEntity camera,0,0,-10
RotateEntity camera,0,0,0
CameraRange camera,0.1,400
lit=CreateLight()

Type mesh
        Field mesh
        Field x#,y#,z#
        Field ax,ay,az
        Field scale#
        Field r,g,b
End Type

Global cube=CreateSphere(10)
Global sp=CreateSphere()
        ScaleEntity sp,0.2,0.3,0.2

For i=1 To n
        mesh.mesh=New mesh
        mesh\mesh=CopyMesh(cube)
        mesh\x=Rnd(-200,200)
        mesh\z=Rnd(-200,200)
        mesh\ay=Rand(0,360)
        mesh\scale=Rnd(0.8,1.2)
        mesh\r=Rand(30,250) : mesh\g=Rand(30,250) : mesh\b=Rand(30,250)
                PositionEntity mesh\mesh,mesh\x,mesh\y,mesh\z
                ScaleEntity mesh\mesh,mesh\scale,mesh\scale,mesh\scale
                EntityBox mesh\mesh,0,0,0,mesh\scale,mesh\scale,mesh\scale
                EntityRadius mesh\mesh,mesh\scale,mesh\scale
                RotateEntity mesh\mesh,mesh\ax,mesh\ay,mesh\az
                EntityColor mesh\mesh,mesh\r,mesh\g,mesh\b
        EntityAutoFade mesh\mesh,200,200
Next

Global distPivot=CreatePivot()

Global mode=0
Global time,timeMean#,timeHAF
Global f1=MilliSecs()
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
While Not KeyHit(1)
frame=MilliSecs()
CameraControl(camera)
For i=1 To PCount
        CameraPick camera,GraphicsWidth()/2,GraphicsHeight()/2
Next
        PositionEntity sp,PickedX(),PickedY(),PickedZ()
        EntityColor sp,120+120*Sin(frame/2),120+120*Sin(frame/3),120+120*Sin(frame/4)
RenderWorld

If KeyHit(57) Then
        mode=mode+1
        PickModeAllMesh()
        If mode>3 Then mode=0
EndIf
PCount=PCount+KeyHit(13)-KeyHit(12)

Text 5,10,"Tris: "+TrisRendered()
Text 5,30,"Cubes: "+TrisRendered()/12
If time=0 Then time=17
fps=1000/time
timeMean=(timeMean+time)/2
Text 5,50,"FPS: "+fps+"    "+1000/timeMean
Text 5,70,"Pick Lines count: "+PCount
Select mode
        Case 0 : modeStr$="no pick"
        Case 1 : modeStr$="sphere pick"
        Case 2 : modeStr$="mesh pick"
        Case 3 : modeStr$="box pick"
End Select
Text 5,90,"Pick Mode: "+modeStr
Color 200,100,100 : Text GraphicsWidth()/2,300,"Key SPACE to switch mode!" : Color 255,255,255
Color 200,100,100 : Text GraphicsWidth()/2,330,"Key '+' and '-' to count pick line" : Color 255,255,255
Flip
time=MilliSecs()-frame
Wend
End

Function CameraControl(cam)
        camAX=camAX-MouseXSpeed()*0.3
        camAY=camAY+MouseYSpeed()*0.3
        MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
        RotateEntity cam,camAY,camAX,0
        MoveEntity cam,(KeyDown(205)-KeyDown(203))*3,0,(KeyDown(200)-KeyDown(208))*3
End Function

Function PickModeAllMesh()
For mesh.mesh=Each mesh
        EntityPickMode mesh\mesh,mode
Next
End Function


Platon 26.01.2013 08:31

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от burovalex (Сообщение 250695)
Честно, не ожидал что такая большая нагрузка будет.

А чего удивляться-то, в режиме пика по треугольникам происходит тупой перебор треугольников, без каких-либо оптимизаций. Т.е. сначала происходит проверка по боксу, потом уже по треугольникам. Причем все эти проверки написаны неоптимально судя по sdk.
PS
А нет, там не тупой перебор, там бинарное дерево.

burovalex 26.01.2013 09:27

Ответ: Советы по оптимизации
 
Ну один хер работает убого.
И если бы сначала пикалось по боксу, то не было бы такого!

Код:

Mesh            15                    3
Box            15                  30


Platon 26.01.2013 09:34

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от burovalex (Сообщение 250738)
Ну один хер работает убого.

А я и говорю что там неоптимально сделано ( сама проверка луч-треугольник + куча оверхеда от говнокода, коего там 99% :) ), несмотря на проверку по бинарному дереву.

Цитата:

Сообщение от burovalex (Сообщение 250738)
И если бы сначала пикалось по боксу, то не было бы такого!

Во-первых там есть проверка по боксу по-умолчанию так сказать. Только потом, если тест по боксу прошел, происходит проверка по треугольникам ( если это меш и они есть в нем ). Инфа 100%, ибо это логично, да и в исходнике sdk это есть.
Во-вторых
Цитата:

Сообщение от burovalex (Сообщение 250738)
"не было бы такого!"

такого это какого? Приведенные цифры как-то противоречат вышеописанному?

burovalex 26.01.2013 11:47

Ответ: Советы по оптимизации
 
Цитата:

такого это какого? Приведенные цифры как-то противоречат вышеописанному?
Я тебе об этом и толкую!!
Запусти екзешник, сам посмотри

Цитата:

Ссылка http://www.sendspace.com/file/ha9vz2
Жмём Click here to start download from sendspace

Platon 26.01.2013 12:51

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от burovalex (Сообщение 250744)
Я тебе об этом и толкую!!

Я может чего-то непонимаю, но тебя удивляет что пик по треугольникам медленее чем пик по боксу? :)

burovalex 26.01.2013 17:06

Ответ: Советы по оптимизации
 
Нет, меня это не удивляет. Хотя думал будет работать быстрее.

Но твоё утверждение SDK с твоих слов по поводу перебора ентити по боксу, А уже далее по геометрии - чушь!

Platon 26.01.2013 17:46

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от burovalex (Сообщение 250776)
Но твоё утверждение SDK с твоих слов по поводу перебора ентити по боксу, А уже далее по геометрии - чушь!

Наркоман штоле??
Если ентити - меш, и стоит режим пика по треугольникам - происходит проверка по боксу ( точнее по дереву боксов ) и потом уже по треугольникам ( в листьях дерева )
Вот тебе пруф, развертка CameraPick ( некоторые неважные места я пропустил ):

файл blitz3dsdk/dev/source/bbsdk/bbblitz3d.cpp

функция bbCameraPick
Код:

943| Entity *  bbCameraPick( Camera *c,float x,float y ){
...|        ...
956|        Line l;
...|        ...
964|        return doPick( l,0 );
965| }

функция doPick
Код:

938| static Object *doPick( const Line &l,float radius ){
...|        ...
940|        return world->traceRay( l,radius,&picked );
941| }

файл blitz3dsdk/dev/source/blitz3d/world.cpp

метод World::traceRay
Код:

127| Object *World::traceRay( const Line &line,float radius,ObjCollision *curr_coll ){
...|        ...
139|        if( hitTest( line,radius,obj,obj->getWorldTform(),obj->getPickGeometry(),&curr_coll->collision ) ){
...|        ...
147| }

метод World::hitTest
Код:

87| bool World::hitTest( const Line &line,float radius,Object *obj,const Transform &tf,int method,Collision *curr_coll  ){
 88|        switch( method ){
 89|        case COLLISION_METHOD_SPHERE:
 90|                return curr_coll->sphereCollide( line,radius,tf.v,obj->getCollisionRadii().x );
 91|        case COLLISION_METHOD_POLYGON:
 92|                return obj->collide( line,radius,curr_coll,tf );
 93|        case COLLISION_METHOD_BOX:
 94|                Transform t=tf;
 95|                t.m.i.normalize();t.m.j.normalize();t.m.k.normalize();
 96|                if( curr_coll->boxCollide( ~t*line,radius,obj->getCollisionBox() ) ){
 97|                        curr_coll->normal=t.m*curr_coll->normal;
 98|                        return true;
 99|                }
100|        }
101|        return false;
102| }

файл blitz3dsdk/dev/source/blitz3d/object.h

метод Object::collide
Код:

48| virtual bool collide( const Line &line,float radius,::Collision *curr_coll,const Transform &t ){ return false; }
метод виртуальный, перегружается наследниками, поэтому в случае с мешем имеем Object => Model => MeshModel

файл blitz3dsdk/dev/source/blitz3d/meshmodel.cpp

этот самый перегруженный метод MeshModel::collide, берет коллайдер и проводит коллизию с сегментом
Код:

290| bool MeshModel::collide( const Line &line,float radius,Collision *curr_coll,const Transform &t ){
291|        return getCollider()->collide( line,radius,curr_coll,t );
292| }

метод MeshModel::getCollider, возвращает коллайдер ( как для коллизий, так и для пика, т.к. это одно и тоже )
Код:

282| MeshCollider *MeshModel::getCollider()const{
283|        return rep->getCollider();
284| }

собственно метод MeshModel::Rep::getCollider, возвращает коллайдер ( и пересчитывает его, если меш изменился )
Код:

133| MeshCollider *getCollider()const{
...|        ...
160|        return collider;
161| }

метод MeshCollider::collide, из сегмента вычисляет бокс и трассирует им дерево
непонятно конечно почему сразу лучом не трассирует, но не суть
Код:

54| bool MeshCollider::collide( const Line &line,float radius,Collision *curr_coll,const Transform &t ){
 55|
 56|        if( !tree ) return false;
 57|
 58|        //create local box
 59|        Box box( line );
 60|        box.expand( radius );
 61|        Box local_box=-t * box;
 62|
 63|        return collide( local_box,line,radius,t,curr_coll,tree );
 64| }

перегруженный метод MeshCollider::collide, собственно сама трассировка бинарного дерева
Код:

66| bool MeshCollider::collide( const Box &line_box,const Line &line,float radius,const Transform &tform,Collision *curr_coll,MeshCollider::Node *node ){
 67|        if( !line_box.overlaps( node->box ) ){
 68|                return false;
 69|        }
...|        ...
100|        return hit;
101| }

это рекурсивная функция
сначала проверка на пересечение с боксом узла дерева ( потом уже трассировка до листов дерева, а в листьях трассировка треугольнков )

ЗЫ
Есь чо возразить?:)

HolyDel 26.01.2013 17:49

Ответ: Советы по оптимизации
 
Цитата:

Есь чо возразить?
ты смотрел экзешник?
там даже при остуствии пика по бокусу (курсор уведен в сторону) проверка пика по геометрии работает в 15 раз медленне проверки по боксам. хотя должна быть одинаковой.

видимо blitz3D и blitz3D SDK не одно и то же.

Platon 26.01.2013 18:11

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от HolyDel (Сообщение 250783)
ты смотрел экзешник?
там даже при остуствии пика по бокусу (курсор уведен в сторону) проверка пика по геометрии работает в 15 раз медленне проверки по боксам. хотя должна быть одинаковой.

Вся соль в том, что происходит не рейкаст, а коллизия лучевого бокса ( см метод MeshCollider::collide ) с боксами дерева. Поэтому уводи или не уводи курсор, бокс все равно будет частично задевать другие ( только если совсем в сторону увести ). Что-ж поделаешь если блиц говно :-D
Кстати счетчик Stats3D ( 0 ) показывает ( странно что обнуление не сделали ) как раз кол-во треугольников "собранных" по время трассировки дерева, и по нему видно что даже когда уводишь курсор, трассировка доходит до листьев дерева.

Цитата:

Сообщение от HolyDel (Сообщение 250783)
видимо blitz3D и blitz3D SDK не одно и то же.

Да не, я как-то исследовал некоторые части ( структуры в основном ), совпадения были. Понятно конечно что сдк был лишь основан на части сырцов которыми Марк поделился со своими корешами, но похоже они не так уж и много там поменяли, какие-то баги замазали соплями, какие-то внесли, в целом многое совпадает :)

burovalex 26.01.2013 22:07

Ответ: Советы по оптимизации
 
Цитата:

Наркоман штоле??
Я то нет,и согласен с Холиделом
Цитата:

там даже при остуствии пика по бокусу (курсор уведен в сторону) проверка пика по геометрии работает в 15 раз медленне проверки по боксам. хотя должна быть одинаковой.
А вот что разработчики блитца, возможно и нарки грёбанные ))

Покрутил побольше тест с pick mode mesh, если в рендер попадают меши фпс сразу падает. Пробовал наводится на пустое место на небольшом расстоянии - фпс в норме. Далее начиная отдаляться,не двигая камеру, фпс начинает падать. Т.е. берутся пик-меши в опеределенном диапазоне от центра экрана.

А с другой стороны, если расположить шары в линию, т.е. чтоб выглядело как линия горизонта, и расположить центр чучуть выше -всё норм. Что противоречит предыдущему выводу. Короче - говнокод!

tormoz 26.01.2013 23:56

Ответ: Советы по оптимизации
 
Сами вы нарики, с кривыми руками на любом ЯП будет все тормозить.
Ну вот НАХЕРА пикать в цикле 100500 высокополигональных мешей?
Блеать, это на асме тоже будет тормозить !
Мозг включить надо и все "проблемы" уйдут.
Варианты всегда есть, как минимум сделать малополигональный невидимый "пик-меш" с отсечением по секторам, или расстоянию (иф двигался - выключить всем пикмод, включить тем кто близко и тд).
И да, используйте ентитипик, он быстрее на многих машинах и удобнее. Используйте ресурсоемкие функции ТОЛЬКО ПО НЕОБХОДИМОСТИ ПО УСЛОВИЮ, а не в цикле от балды (непременный атрибут говнокода всех начинающих). И хватит уже списывать свою убогость на прекрасный инструмент.

LLI.T.A.L.K.E.R. 27.01.2013 00:57

Ответ: Советы по оптимизации
 
http://www.youtube.com/watch?v=K0_eh...ilpage#t=66 s
блин надо не полениться и смастерить игрулю, показывающую "широкий мир" в B3d

burovalex 27.01.2013 08:43

Ответ: Советы по оптимизации
 
Слушай, тормоз, давай без оскарблений. Каждый может сказать, включи мозг, руки не от туда..
Ты сам мозг включи!
Во-первых там всего 1000 мешей, это вполне реальная цифра для сценографа.
Во-вторых. Я не собираюсь 1к мешей пикать. Это тест, меня просто заинтересовала производительность пика.

З.Ы. Для тебя может это глупым кажеся. Но кто-то для себя какие-то выводы сделает.

Platon 27.01.2013 08:53

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от tormoz (Сообщение 250809)
Сами вы нарики, с кривыми руками на любом ЯП будет все тормозить.

Разве кто-то про ЯП говорил? Речь-то про движок.
Цитата:

Сообщение от tormoz (Сообщение 250809)
Ну вот НАХЕРА пикать в цикле 100500 высокополигональных мешей?

1000 ентитей в сцене помоему вполне нормально. И с каких пор 360 треугольников это высокополигональный меш?
Цитата:

Сообщение от tormoz (Сообщение 250809)
с отсечением по секторам, или расстоянию

А вот это надо делать в самом движке, нормальную систему менджмента сцены, а не тупой перебор с копированием туда-сюда по массивам.
Цитата:

Сообщение от tormoz (Сообщение 250809)
И да, используйте ентитипик, он быстрее на многих машинах и удобнее.

С чего он быстрее будет когда EntityPick, LinePick, CameraPick и т.п. - это все это одна система коллизий, различия лишь в инициализации формы для проверки коллизии.
Цитата:

Сообщение от tormoz (Сообщение 250809)
И хватит уже списывать свою убогость на прекрасный инструмент.

Блиц прекрасен снаружи ( и то, только для нубов которые ничего другого и не видели и\или не могут юзать ), но внутри он убог и больше похож на студенческую "тяп-ляп" поделку.

tormoz 27.01.2013 22:12

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от Platon (Сообщение 250841)
1000 ентитей в сцене помоему вполне нормально. И с каких пор 360 треугольников это высокополигональный меш?

Ну епрст, еще раз: зачем пикать В ЦИКЛЕ ?
Я не могу представить ситуацию где бы это было нужно

Цитата:

А вот это надо делать в самом движке, нормальную систему менджмента сцены, а не тупой перебор с копированием туда-сюда по массивам.
Еще раз епрст. При чем тут движок? Это задача программиста - создать логичную схему, не перегружающую впустую систему.

Цитата:

С чего он быстрее будет когда EntityPick, LinePick, CameraPick и т.п. - это все это одна система коллизий, различия лишь в инициализации формы для проверки коллизии.
Это из опыта. На некоторых машинах лайнпик выполняется очень медленно. Может в новых версиях пофиксили, не знаю

Цитата:

Блиц прекрасен снаружи ( и то, только для нубов которые ничего другого и не видели и\или не могут юзать ), но внутри он убог и больше похож на студенческую "тяп-ляп" поделку.
Плохому танцору - хорошего хирурга!:-D

зы. я как-то вытащил свой древний нубский мега-проЭкт 2002 года и прооптимизировал. Цикл выполнялся 30 мс, после оптимизации 4-5 мс. Это без ускоряющих длл, только правильная логика игры и взаимодействий. А в игре объектов 7-11 тыс одномоментно.

burovalex 27.01.2013 22:40

Ответ: Советы по оптимизации
 
Да ладно, хватит писькой мериться. )
Без обид, тормоз, но ты реально иногда тормозишь. НИКТО НЕ СОБИРАЕТСЯ ПИКАТЬ 1000 мешей в цикле!!!

Цитата:

Во-первых там всего 1000 мешей, это вполне реальная цифра для сценографа.
Во-вторых. Я не собираюсь 1к мешей пикать. Это тест, меня просто заинтересовала производительность пика.
Я проверяю производительность разных методов большим количеством повторов и объектов. Другого метода не знаю, не считая гугла..

HolyDel 27.01.2013 23:19

Ответ: Советы по оптимизации
 
burovalex, без обид, но мал ты еще на тормоза наезжать :)

tormoz, вся фишка в тестах - узнать цену метода. ни больше - ни меньше. если методы быстрые - то можно меньше думать - больше прыгать. если методы медленные надо извращаться.

Цитата:

А в игре объектов 7-11 тыс одномоментно.
пфф. у меня было 4кк объектов. не полноценных конечно. но на блице мне бы пришлось каждый из них делать или ентити - и это ад, или писать в вершинный буфер через сюрфейс - это уже не такой ад, но все равно намного медленнее текущей реализации (которая полностью на ГПУ)

burovalex 28.01.2013 07:15

Ответ: Советы по оптимизации
 
holydel, ты как плагиат - тоже самое, только своими словами, без обид :-D

А на тормоза я и не наезжаю, просто пытаюсь объяснить, что смысл теста - это не кривые руки )

tormoz 28.01.2013 19:32

Ответ: Советы по оптимизации
 
Эти тесты 100500 раз уже сделаны и пережеваны. У меня батхерт, когда впустую на блитц наезжают.
К слову, еще в 2005 на офсайте проскакивала "грамотная система коллизий и пиков" на длл. И быстрее она была аж на 13% в коллизиях и 5% в пиках.
Так что кривизна движка сильно преувеличена.

burovalex 29.01.2013 07:44

Ответ: Советы по оптимизации
 
Цитата:

Сообщение от tormoz (Сообщение 250972)
Эти тесты 100500 раз уже сделаны и пережеваны. У меня батхерт, когда впустую на блитц наезжают.
К слову, еще в 2005 на офсайте проскакивала "грамотная система коллизий и пиков" на длл. И быстрее она была аж на 13% в коллизиях и 5% в пиках.
Так что кривизна движка сильно преувеличена.

Я не так давно блитцом занимаюсь, чтобы говорить что для меня всё разжовано.
И скажи, разве плохо что в теме "Советы оптимизации" появился пример с производительностью EntityPickMode???

tormoz 29.01.2013 19:02

Ответ: Советы по оптимизации
 
Мерить производительность ФПС - мягко говоря неправильно. Сделай нормальный тест с замером времени и правильной интерпретацией - похвалим. ;)


Часовой пояс GMT +4, время: 16:05.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot