Thread et Ogre3D

Généralités sur la programmation 3D
Avatar de l’utilisateur
Guillot
Messages : 522
Inscription : jeu. 25/juin/2015 16:18

Thread et Ogre3D

Message par Guillot »

salut les codeurs,

j'ai un probleme
pour la v8 de ma serie Paysage, je souhaite agrandir le terrain (pour avoir la même profondeur de vu que dans ma demo "montagnes")
jusqu'ici toutes les tuiles étaient contruites a l'avance
dans la v8, les tuiles sont construites en temps réel
pour éviter les temps de latences, je souhaite le faire en multithreading
hors, en opengl, la creation de mesh en multithreading ne fonctionne pas

quelqu'un à une solution ?

ci dessous un exemple de création de mesh en multithreading (compiler en opengl pour voir le plantage)

Code : Tout sélectionner

Procedure threadmesh(i)
	Shared Mutex
	;LockMutex(Mutex)
	CreateSphere(i,10+i*2)
	;UnlockMutex(Mutex)
	Debug "threadmesh "+i
EndProcedure


InitEngine3D():InitSprite():InitKeyboard():InitMouse()
OpenWindow(0, 0, 0, 0,0, "test",#PB_Window_Maximize)
ex=WindowWidth (0,#PB_Window_InnerCoordinate)
ey=WindowHeight(0,#PB_Window_InnerCoordinate)
OpenWindowedScreen(WindowID(0), 0, 0, ex, ey, 0, 0, 0)

CreateCamera(0, 0, 0, 100, 100):MoveCamera(0,0,0,-30):CameraLookAt(0,0,0,0)
CreateLight(0,$888888, 10000, 5000, 2000)
CameraBackColor(0,$220000) 
AmbientColor($444444)

ndt=4
Mutex = CreateMutex()
Dim thread(ndt-1)
For i=0 To ndt-1
	thread(i)=CreateThread(@ threadmesh(),i)
	Debug ""+thread(i)+" "+i
Next
For i=0 To ndt-1:WaitThread(thread(i)):Next
Debug "ok"

CreateTexture(0,256,256):StartDrawing(TextureOutput(0)):For i=0 To 1000:Circle(Random(255),Random(255),Random(10),Random($ffffff)):Next:StopDrawing()
CreateMaterial(0,TextureID(0)):ScaleMaterial(0,0.1,0.2)
CreateEntity(0,MeshID(0),MaterialID(0))

Define.f depx,depz,mousex,mousey,dist

Repeat
	WaitWindowEvent()
	ExamineKeyboard()
	ExamineMouse()
	depx=(-Bool(KeyboardPushed(#PB_Key_Left))+Bool(KeyboardPushed(#PB_Key_Right)))*0.1
	depz=(-Bool(KeyboardPushed(#PB_Key_Down))+Bool(KeyboardPushed(#PB_Key_Up   )))*0.1+MouseWheel()*2
	MouseX = -MouseDeltaX() *  0.05
	MouseY = -MouseDeltaY() *  0.05
	RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
	dist+(depz-dist)*0.05:MoveCamera  (0, depX, 0, -dist)
	RenderWorld()
	FlipBuffers()    
Until KeyboardReleased(#PB_Key_Escape) Or MouseButton(3)