DirectX Darstellung ruckelt.



  • moin 🙂

    ich lade 5 meshes die ich von CAD exportiert, in Blender Importiert und als X-File exportiert habe. die sind zusammen etwa 55MB groß. das kann auch hinkommen das es viele punkte sind. bzw rundungen. (es ist ein Hexapod bein, mit 4 Servos)

    ich lade die meshes einmalig in meiner InitGraphics funktion und speicher alle inhalte in einem Struct:

    struct lmesh{
    	LPD3DXMESH			mesh;
    	DWORD				numMaterials;
    	D3DMATERIAL9*		meshMaterials;		
    	LPDIRECT3DTEXTURE9* meshTextures;
    } lmesh[5];
    

    hier einmal die ausgabe funktion:

    void render_frame(void){
    	unsigned long int i, j;
    
    	for(i = 0; i < 5; i++){
    		if(data.index[i] == 180)
    			data.dir[i] = -1;
    		if(data.index[i] == 0)
    			data.dir[i] = 1;
    		data.index[i] += data.dir[i];
    	}
    
        d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    	d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    
        d3ddev->BeginScene();
    
        D3DXMATRIX matView;    // the view transform matrix
    
        D3DXMatrixLookAtLH(&matView,
                           &D3DXVECTOR3 (0.0f, 10.0f, 25.0f),    // the camera position
                           &D3DXVECTOR3 (0.0f, 0.0f, 0.0f),    // the look-at position
                           &D3DXVECTOR3 (0.0f, 1.0f, 0.0f));    // the up direction
        d3ddev->SetTransform(D3DTS_VIEW, &matView);    // set the view transform to matView
    
    	D3DXMATRIX matProjection;
    	D3DXMatrixPerspectiveFovLH  (&matProjection,		
    								D3DXToRadian(45),
    								(FLOAT)SCREEN_WIDTH / (FLOAT)SCREEN_HEIGHT,
    								1.0f,
    								100.0f);
    
    	d3ddev->SetTransform(D3DTS_PROJECTION, &matProjection);
    
    	D3DXMATRIX matTranslate[5];
    	D3DXMATRIX matRotationX[5];
    	D3DXMATRIX matRotationY[5];
    	D3DXMATRIX matRotationZ[5];
    	D3DXMATRIX matScaleRel[5];
    
    	for(i = 0; i < 5; i++){
    		D3DXMatrixRotationX(&matRotationX[i], 0);
    		D3DXMatrixRotationY(&matRotationY[i], 0);
    		D3DXMatrixRotationZ(&matRotationZ[i], D3DXToRadian(90));
    		D3DXMatrixTranslation(&matTranslate[i], 0.0f, 0.0f, 0.0f);
    		D3DXMatrixScaling(&matScaleRel[i], 0.1f, 0.1f, 0.1f);
    	}
    
    	//D3DXMatrixRotationZ(&matRotationZ[0], D3DXToRadian(90));
    	D3DXMatrixTranslation(&matTranslate[0], 15.0f, 0.0f, 0.0f);
    	D3DXMatrixTranslation(&matTranslate[1], 13.0f, -0.4f, 0.0f);
    	D3DXMatrixTranslation(&matTranslate[2], 12.0f, -0.4f, 0.0f);
    	D3DXMatrixTranslation(&matTranslate[3], 10.5f, -0.4f, 0.0f);
    	D3DXMatrixTranslation(&matTranslate[4], 3.7f, -0.4f, 0.0f);
    
    	D3DXMatrixRotationZ(&matRotationZ[4], D3DXToRadian(data.index[4]));
    
    	for(j = 0; j < data.meshcount; j++){
    		d3ddev->SetTransform(D3DTS_WORLD, &(matScaleRel[j] * matRotationX[j] * matRotationY[j] * matRotationZ[j] * matTranslate[j]));
    
    		for(i = 0; i < lmesh[j].numMaterials; i++){
    			d3ddev->SetMaterial(&lmesh[j].meshMaterials[i]);
    			//d3ddev->SetTexture(0,&lmesh[j].meshTextures[i]);
    			lmesh[j].mesh->DrawSubset(i);
    		}
    	}
        d3ddev->EndScene();
    
        d3ddev->Present(NULL, NULL, NULL, NULL);
    }
    

    ich spiele das ganze jetzt auf meinem Netbook, (AMD Fusion 450) sprich Graka mit CPU mix bei 2x 1,6ghz, ab.
    ich durchlaufe ja mit jedem schleifendurchlauf 1 Grad. dennoch brauch der äußere Arm geschätzt 30 sekunden für die 180 grad. sprich 6 frames pro sekunde.
    CPU auf 100%.
    worran liegt es das es so langsam ist?

    - Die hochauflösenden Meshes (55MB)
    - fehler in der Programmierung?
    - Netbook (sprich die geschwindigkeit ist normal für das geforderte und dem geringen core)


  • Mod

    cl90 schrieb:

    worran liegt es das es so langsam ist?

    a) Die hochauflösenden Meshes (55MB)
    b) fehler in der Programmierung?
    c) Netbook (sprich die geschwindigkeit ist normal für das geforderte und dem geringen core)

    wieso fragst du uns statt es auszuprobieren? ich sage c), weil c statistisch am oeftersten gewinnt. der naechste sagt a, der naechste b und du bist wo du am anfang warst.
    probierst du es aus, bist du auf der sicheren seite, also?
    a) kleineres mesh testen
    b) anderes program ausprobieren
    c) andere hardware ausprobieren



  • ich wollte eig nur überprüfen ob ich irgendwo einen fehler in der programmierung habe. irgendwas das nicht sein muss...

    ich hab meine frage wohl zu blöd gestellt 😞
    sollte ich mir abgewöhnen.


Anmelden zum Antworten