Тема: C3D Engine
Показать сообщение отдельно
Старый 08.06.2012, 22:18   #57
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: C3D Engine

//отрисовка сцены
for(int i=0;i<_nodes.size();i++)
	{
		if(!_nodes[i]->vbo()) continue;
		float px = 0; float py= 0; float pz = 0;
		_nodes[i]->position(px,py,pz,true);//узнаю глобальные координаты (тут тормозит перемножение матриц парента и своей, прям сильно, хз че делать)
		if(_frustum->CubeInFrustum(px,py,pz,_nodes[i]->vbo()->box()))//если попадает во фрустум
			_nodes[i]->drawVBO(m_view, m_projection);//отрисовка
//отрисовка сетки

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

void CVBO::drawBuffers()
{
	if(g_last_drawed_vbo == this)//это если сетка назначена на несколько объектов (быстрее не становится все равно)
	{
		APP->render()->dips_up();
		glDrawElements(GL_TRIANGLES,_cnt_indices,GL_UNSIGNED_INT,0);//short быстрее не делает
		return;
	}

	if(_vbuffer)
	{
		glBindBufferARB( GL_ARRAY_BUFFER_ARB, _vbuffer );
		glVertexPointer( 3, GL_FLOAT, 0, (char *) NULL );
	}
	if(_nbuffer)
	{	
		glBindBufferARB( GL_ARRAY_BUFFER_ARB, _nbuffer );
		glNormalPointer(GL_FLOAT,0,(char*)NULL);
	}
	if(_tbuffer)
	{	
		glBindBufferARB( GL_ARRAY_BUFFER_ARB, _tbuffer );
		glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL );
	}
	if(_ibuffer)
	{
		APP->render()->dips_up();
		glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, _ibuffer);
		glDrawElements(GL_TRIANGLES,_cnt_indices,GL_UNSIGNED_INT,0);//short быстрее не делает
		//glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
	}
	g_last_drawed_vbo = this;
	//glDisableClientState(GL_VERTEX_ARRAY);
	//glDisableClientState(GL_NORMAL_ARRAY);
	//glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	//glDisableClientState(GL_ELEMENT_ARRAY_BUFFER_ARB);
}
	}
пользуюсь математической библиотекой glm, включил поддержку sse2, fps выросло всего на 4 + матрицы по ссылке стал передавать... в итоге на 10 fps прирост, мало
поднял fps с 25 до 60 при 4096 кубиках - ксорс на моем железе дает 90, axelinx 250... Unity 60
заметил снижает скорость передача матрицы в шейдер.. а как быть? один шейдер 4096 кубов, следовательно 4096 передач параметров для каждого куба.. как это оптимизировать?

Последний раз редактировалось pozitiffcat, 09.06.2012 в 00:07.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (09.06.2012)