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=117)

KRIK 21.09.2005 04:39

1. Я долго думал, чем игры созданные на DerectX 9 отличаются от игр созданных на DerectX 7. Кто-то может ответить на этот вопрос, что в DerectX 9 лучше графика, но по моему графику делают в 3D приложениях и DerectX от этого не зависит. Ну короче говоря скажите чем они отличаются??? :dontknow:

2.И правда ли, что если создавать код в блитз3Д функциями, он будет работать быстрее, чем простой без функцией??? :dontknow:

SubZer0 21.09.2005 05:32

попробую ответить...

DirectX... на самом деле, чтоб запрограммировать элементарное отображение кубика на экране (3Д), нужно гораааздо больше писанины чем мы пишем на блице... DirectX это так называемый драйвер для отображения 2Д и 3Д на экране, для обслуживания игровых устройств и вывода звука. таким образом можно проследить такую последовательность прохода команд для отображения чегонить на экране: Блиц - DirectX - Драйвер видеокарты - видеокарта - монитор.

На счет того, чем 9-я версия лучше, чем 7-я я ответить не возьмусь, предположительно там какието ошибки исправили, появилась поддержка новых видеокарт (с новыми функциями), добавилось сервиса (набор команд)...

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


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

jimon 21.09.2005 08:51

directx 7 и directx9 - ихние отличия можно сопоставить с отличиями windows 98 с windows xp ... а написать реально чем они отличаются - слишком долго и нудно

ps. программируемые конвееры, улутчены работа с буферами, расширение команд, несколько фич всяких там mapingов и тд

KRIK 21.09.2005 12:20

1.Ну я тоже так думал, что с функциями работать будет хуже,просто меня смутила 1 вещь - очень много народу программирует функциям,но теперь я понел почему. :))

2.Ну я тоже понял приблезитнльную разницу.



СПАСИБО ЗА ОТВЕТЫ!

Жека 21.09.2005 17:34

"программируют функциями" - круто сказал! ;)
Я все же советую тебе использовать функции:
1. как сказал SubZer0 - читать код проще будет, а значит и возможные ошибки легче найти при возникновении
2. код становится более универсальным, т.е. если у тебя есть части проги, которые делают одно и то же, то заново переписывать смысла особого нет, а тут вызвал функцию - и все
3. функциями как законченными кусками проги всегда можно поделиться с товарищами, а обычный кусок кода - совсем другая тема...

Не передумал? - Дело твое...

SubZer0 21.09.2005 19:00

Хочу еще вот что сказать (хотя эту тему мы уже обсуждали):

Мне нравится когда люди говорят как хороши функции и как они полезны а сами творят следующее:

есть такой физический движок для Блица ODE... лежит тут, скачайте его, откройте архив... там в каталоге sample есть файл ode_tutorial_03_01.bb сожержимое файла позволю себе опубликовать:
Код:

;-----------------------------;
; BlitzODE ARKON Wrapper 0.5b;
; Tutorial 3        ;
;-----------------------------;

Const LENGTH# = 0.7 * 8
Const WIDTH# = 0.5 * 8
Const HEIGHT# = 0.2 * 8
Const RADIUS# = .16 * 8
Const STARTZ# = 5 + .5 * 8
Const CMASS# = 50
Const WMASS# = 10

Include "BlitzODE.bb"

;------ Initialize Graphics --------

Graphics3D 800, 600
SetBuffer BackBuffer()

SetFont LoadFont("Arial", 14, 1, 1, 0)

cam = CreateCamera()
PositionEntity cam, -10, 20, 0
lh = CreateLight()
PositionEntity lh, 100, 100, 100
RotateEntity lh, 90, 0, 0
LightColor lh, 100, 100, 100
AmbientLight 50, 50, 50

plane = CreatePlane()
;mirror = CreateMirror(plane)
EntityColor plane, 0, 0, 150
EntityAlpha plane, .8

SeedRnd MilliSecs()
;--------- Initialize ODE ----------

Global space = ODE_dWorldCreate(0)

;---- Setting contact parameters ---

ODE_dSetContactMode(dContactBounce)
ODE_dSetMU(40); Friction
;ODE_dWorldSetCFM(0.00001)
;-------- Create many box ---------

For i = 1 To 10
        g.TODEGeom = New TODEGeom
        g\body = ODE_dBodyCreate()
        g\geom = ODE_dCreateBox(space, 2, 2, 2, 10)
        ODE_dGeomSetBody g\geom, g\body
        ODE_dBodySetPosition(g\body, Rnd(-35, 35), Rnd(15, 25), Rnd(-35, 35))
        ODE_dBodySetRotation(g\body, Rand(-180, 180), Rand(-180, 180), Rand(-180, 180))
       
        g\mesh = CreateCube()
        EntityColor g\mesh, Rand(255), Rand(255), Rand(255)
        EntityShininess g\mesh, 0.7
Next

;------- Create many balls ---------

For i = 1 To 10
        g.TODEGeom = New TODEGeom
        g\body = ODE_dBodyCreate()
        g\geom = ODE_dCreateSphere(space, 1, 10)
        ODE_dGeomSetBody g\geom, g\body
        ODE_dBodySetPosition(g\body, Rnd(-35, 35), Rnd(15, 25), Rnd(-35, 35))
        ODE_dBodySetRotation(g\body, Rand(-180, 180), Rand(-180, 180), Rand(-180, 180))
       
        g\mesh = CreateSphere()
        EntityColor g\mesh, Rand(255), Rand(255), Rand(255)
        EntityShininess g\mesh, 0.7
Next

;------- Create fixed box ----------

geom = ODE_dCreateBox(space, 15, .1, 15, 10)
ODE_dGeomSetPosition(geom, 20, 2.5, 0)
ODE_dGeomSetRotation(geom, 0, 0, 20)
mesh = CreateCube()
PositionEntity mesh, 20, 2.5, 0
RotateEntity mesh, 0, 0, 20
ScaleMesh mesh, .5, .05, .5
ScaleEntity mesh, 15, 1, 15

;-----------------------------------

Function AddCCylinder()
        r# = Rnd(0.4, 2)
        h# = Rnd(r / 2.0, r / 2.0 + 2.5)
        cr = Rand(255)
        cg = Rand(255)
        cb = Rand(255)
        g.TODEGeom = New TODEGeom
        g\body = ODE_dBodyCreate()
        g\geom = ODE_dCreateCCylinder(space, r, h * 2, 1)
        ODE_dGeomSetBody(g\geom, g\body)
        g\mesh = CreatePivot()
        cl = CreateCylinder(8, 1, g\mesh)
        RotateEntity cl, 90, 0, 0
        EntityColor cl, cr, cg, cb
        ScaleEntity cl, r, h, r
        sh1 = CreateSphere(8, g\mesh)
        ScaleEntity sh1, r, r, r
        PositionEntity sh1, 0, 0, h
        EntityColor sh1, cr, cg, cb
        sh1 = CreateSphere(8, g\mesh)
        ScaleEntity sh1, r, r, r
        PositionEntity sh1, 0, 0, -h
        EntityColor sh1, cr, cg, cb
        px# = Rnd(-60, 60)
        py# = Rnd(15, 40)
        pz# = Rnd(-60, 60)
        ax# = Rnd(-180, 180)
        ay# = Rnd(-180, 180)
        az# = Rnd(-180, 180)
        ODE_dBodySetPosition(g\body, px#, py#, pz#)
        ODE_dBodySetRotation(g\body, ax#, ay#, az#)
        PositionEntity g\mesh, px#, py#, pz#
        RotateEntity g\mesh, ax#, ay#, az#
        gCount = gCount + 1
End Function

For i = 1 To 20
AddCCYlinder()
Next

Global cbody%[5], joint%[4], box%[1], sphere%[4]

;----------- Crete CAR -------------

;Car body
cbody[0] = ODE_dBodyCreate()
ODE_dBodySetPosition(cbody[0], 0, STARTZ, 0)
box[0] = ODE_dCreateBox(0, LENGTH, HEIGHT, WIDTH, CMASS)
ODE_dGeomSetBody(box[0], cbody[0])
g.TODEGeom = New TODEGeom
g\body = cbody[0]
g\geom = box[0]
g\mesh = CreateCube()
EntityColor g\mesh, 255, 255, 0
CAR = g\mesh
ScaleMesh g\mesh, .5, .5, .5
ScaleEntity g\mesh, LENGTH, HEIGHT, WIDTH
ODE_dBodySetMass(cbody[0], CMASS)
ODE_dBodyTranslateMass(cbody[0], 0, -1, 0)

;Car wheels
For i = 1 To 4
        cbody[i] = ODE_dBodyCreate()
        ODE_dBodySetRotation(cbody[i], 90, 0, 0)
        sphere[i - 1] = ODE_dCreateSphere(0, RADIUS, WMASS)
        ODE_dGeomSetBody(sphere[i - 1], cbody[i])
        g.TODEGeom = New TODEGeom
        g\body = cbody[i]
        g\geom = sphere[i - 1]
        g\mesh = CreateCylinder(16)
        ScaleEntity g\mesh, RADIUS, RADIUS * .2, RADIUS
        EntityColor g\mesh, 20, 0, 0
        ODE_dBodySetMass(cbody[i], WMASS)
Next

ODE_dBodySetPosition (cbody[1],0.5*LENGTH,-.5 + STARTZ-HEIGHT*0.5,WIDTH*0.5);
ODE_dBodySetPosition (cbody[2],0.5*LENGTH,-.5 + STARTZ-HEIGHT*0.5,-WIDTH*0.5);
ODE_dBodySetPosition (cbody[3],-0.5*LENGTH,-.5 + STARTZ-HEIGHT*0.5, WIDTH*0.5);
ODE_dBodySetPosition (cbody[4],-0.5*LENGTH,-.5 + STARTZ-HEIGHT*0.5,-WIDTH*0.5);

For i = 0 To 3
        joint[i] = ODE_dJointCreateHinge2()
        ODE_dJointAttach(joint[i], cbody[0], cbody[i + 1])
        ODE_dJointSetHinge2Anchor(joint[i], ODE_dBodyGetPositionX(cbody[i + 1]), ODE_dBodyGetPositionY(cbody[i + 1]), ODE_dBodyGetPositionZ(cbody[i + 1]))
  ODE_dJointSetHinge2Axis1 (joint[i],0,1,0)
  ODE_dJointSetHinge2Axis2 (joint[i],0,0,1)
Next

For i = 0 To 3
  ODE_dJointSetHinge2Param(joint[i], dParamSuspensionERP, .3)
  ODE_dJointSetHinge2Param(joint[i], dParamSuspensionCFM, .065)
Next

For i = 2 To 3
        ODE_dJointSetHinge2Param(joint[i],dParamLoStop,0)
        ODE_dJointSetHinge2Param(joint[i],dParamHiStop,0)
Next

ODE_dBodySetPosition cbody[0], 0, 5, 0

car_space% = ODE_dSimpleSpaceCreate(space)
ODE_dSpaceAdd(car_space, box[0])

For i = 1 To 4
        ODE_dSpaceAdd(car_space, sphere[i - 1])
Next

speed# = .1

CreateTriMesh()

;------------------------------------------


ODE_UpdateGeoms()

;-----------------------------------

gameFPS = 50.0
framePeriod = 1000 / gameFPS
frameTime = MilliSecs () - framePeriod

While Not KeyHit(1)
        Repeat
 frameElapsed = MilliSecs () - frameTime
        Until frameElapsed
       
        frameTicks = frameElapsed / framePeriod
        frameTween# = Float(frameElapsed Mod framePeriod) / Float(framePeriod)
        For frameLimit = 1 To frameTicks
 If frameLimit = frameTicks Then CaptureWorld
 frameTime = frameTime + framePeriod
 
        ;------------ Add Force and Torque ----------

 If KeyHit(57)
        For g.TODEGeom = Each TODEGeom
  ODE_dBodyEnable g\body
  ODE_dBodyAddForce g\body, 0, Rnd(20, 50), 0
  ODE_dBodyAddTorque g\body, Rnd(-10, 10), Rnd(-10, 10), Rnd(-10, 10)
        Next
 EndIf


        ;-------------- Update car physics ------------

 If KeyDown(200)
        speed# = speed# + .1
 ElseIf KeyDown(208)
        speed# = speed# - .1
 EndIf
 If Abs(speed) > .01
        speed# = speed# * .95
 EndIf
       
 If KeyDown(203)
        If steer# < .75 steer# = steer# + .05
 ElseIf KeyDown(205)
        If steer# > -.75 steer# = steer# - .05
 Else
        steer# = steer# * .95
 EndIf
       
 For i = 0 To 3
  ODE_dJointSetHinge2Param(joint[i],dParamVel2, speed# * 12)
  ODE_dJointSetHinge2Param(joint[i],dParamFMax2, 20.0)
 Next
       
  v# = steer# - ODE_dJointGetHinge2Angle1(joint[0])
  v = v * 11.0
  v1# = steer# - ODE_dJointGetHinge2Angle1(joint[1])
  v1 = v1 * 11.0
  ODE_dJointSetHinge2Param (joint[0],dParamVel,v)
  ODE_dJointSetHinge2Param (joint[0],dParamFMax, 50)
  ODE_dJointSetHinge2Param (joint[0],dParamLoStop,-0.75)
  ODE_dJointSetHinge2Param (joint[0],dParamHiStop,0.75)
  ODE_dJointSetHinge2Param (joint[1],dParamVel,v1)
  ODE_dJointSetHinge2Param (joint[1],dParamFMax, 50)
  ODE_dJointSetHinge2Param (joint[1],dParamLoStop,-0.75)
  ODE_dJointSetHinge2Param (joint[1],dParamHiStop,0.75)

 PointEntity cam, car

        ;------------ Update physics world ----------

 tm = MilliSecs()
 ODE_dWorldQuickStep 0.1
 pTime = MilliSecs() - tm

        ;---------- Fix car angular momuntum --------
 
 For i = 1 To 4
        ax# = ODE_dBodyGetAngularVelX(cbody[i]) * .998
        ay# = ODE_dBodyGetAngularVelY(cbody[i]) * .9
        az# = ODE_dBodyGetAngularVelZ(cbody[i]) * .998
       
        ODE_dBodySetAngularVel(cbody[i], ax#, ay#, az#)
 Next
 ax# = ODE_dBodyGetAngularVelX(cbody[0]) * .7
 ay# = ODE_dBodyGetAngularVelY(cbody[0]) * .8
 az# = ODE_dBodyGetAngularVelZ(cbody[0]) * .7

 ODE_dBodySetAngularVel(cbody[0], ax#, ay#, az#)
        Next
       
;---- Set geometry position and rotation ----

        ODE_UpdateGeoms()

;--------------------------------------------

        RenderWorld frameTween#
       
; FPS counter
        fr = fr + 1
        If MilliSecs() - frTime >= 1000
 fps = fr
 fr = 0
 frTime = MilliSecs()
        EndIf
       
        Color 255, 255, 255
        Text 5, 5, "FPS " + fps
        Text 5, 20, "Physics time " + pTime
        Text 5, 580, "Space - Add Force and Torque"

       
        Flip 0
Wend

ODE_dCloseODE()
End

Function CreateTriMesh()
        mesh = LoadMesh("002.b3d")
        ScaleEntity mesh, 1, 1, 1

        TriMesh = ODE_dTriMeshCreate(mesh)
       
        tex = CreateTexture(32, 32, 8)
        SetBuffer TextureBuffer(tex)
        ClsColor 0, 0, 100
        Cls
        Color 255, 255, 0
        Rect 0, 0, 31, 31, 0
        Rect 1, 1, 29, 29, 0

        ScaleTexture tex, .025, .025
        EntityTexture mesh, tex

SetBuffer BackBuffer()
       
End Function

смотрим внимательно на код, здесь использование функции AddCCylinder было крайне нобходимо неправда-ли?

пойдем по всем пунктам указанным Жекой:

1. удобочитаемость от этого ну прямо жутко улучшилась...
2. эта функция больше НИГДЕ не вызывалась
3. эта функция является НЕПЕРЕНОСИМОЙ потому, что для каждого случая пришлось бы переписывать ее заново, поскольку она не принимает никаких параметров, т.е. эта функция очень узкоспециализирована (имеется ввиду размер, цвет, позиция и угол)...

я говорил вот про такие случаи... :)

Жека 21.09.2005 20:03

Тяжелый случай... ;)

От темы отошли... А раз так, то: я все тела функций пишу после команды End, т.е. после всего. В этом случае не приходится смотреть на те функции, которые не нужны при написании: понадобилась функция - нажал на ее имя в списке справа (в редакторе кода), они типа независимы получаются... и основной код не засоряют....

impersonalis 21.09.2005 20:47

Цитата:

Originally posted by SubZer0@Sep 21 2005, 03:32 AM
программа получается немного удобочитаемей, чем без них
естественно подразумевалось
Цитата:

программа получается намного удобочитаемей, чем без них

исправляю досадную опечатку :P

SubZer0 21.09.2005 21:06

Цитата:

Originally posted by impersonalis+Sep 21 2005, 06:47 PM--><div class='quotetop'>ЦИТАТА(impersonalis @ Sep 21 2005, 06:47 PM)</div><div class='quotemain'>
Цитата:

Originally posted by SubZer0@Sep 21 2005, 03:32 AM
программа получается немного удобочитаемей, чем без них
естественно подразумевалось
Цитата:

программа получается намного удобочитаемей, чем без них

исправляю досадную опечатку :P[/b]



в свете вот этого:

<!--QuoteBegin-SubZer0
@Sep 21 2005, 05:00 PM
смотрим внимательно на код....., здесь использование функции было крайне нобходимо неправда-ли?

пойдем по всем пунктам..

1. удобочитаемость от этого ну прямо жутко улучшилась...
2. эта функция больше НИГДЕ не вызывалась
3. эта функция является НЕПЕРЕНОСИМОЙ потому, что для каждого случая пришлось бы переписывать ее заново, поскольку она не принимает никаких параметров, т.е. эта функция очень узкоспециализирована (имеется ввиду размер, цвет, позиция и угол)...
[/quote]

опечатка и правда досадная ;)


ЗЫ извиняюсь перед xxxKRIKxxx, за ненужный спор в топике


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

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