Пример #1
0
//Main loop
void Main::run()
{
	int frames = 0, frameAtBase = 0;
	double baseTime = highResTime();
	while (true)
	{
		if(render && glfwWindowShouldClose(window)) //process close only if rendering
			break;
		if(logging)
			profileLog<<"Frame "<<frames<<endl;
		double time = highResTime();

		if(render)
		{
			glfwPollEvents();

			//Set camera for raycaster
			camera.update();
			rayCaster.setCamera(camera);
		}

		//Simulate one step using OpenCL
		simulation->step();

		if(render)
		{
			//Get image from raycaster, pass it to OpenGL
			rayCaster.shoot();
			g.updateTexture(rayCaster.getTexture());
	 
			// Render the raycasted texture on a quad
			g.renderTexture();
		}


		double delta;
		delta = highResTime() - time; //current time delta
		framesLog<<frames<<" "<<delta<<endl; //frame time log

		/* Limit framerate to targetFPS (turned off, let autotuner handle)
		while(true)
		{
			delta = highResTime() - time;
			double rest = (1.0/targetFPS) - delta;
			if(rest <= 0)
				break;
			usleep(rest / 1000000); //sleep off the rest of the frame
		}
		*/

		//A major change is that of the resolution, in which case
		//the raycaster also needs to know.
		bool changed = tuner.report(delta);
		if(render && changed)
		{
			rayCaster.setN(simulation->getN());
			rayCaster.setVolume(simulation->getOutputVolume());
		}

		//FPS counter - update once a second
		frames++;
		if(time - baseTime > 1)
		{
			cout<<"FPS "<<frames - frameAtBase<<endl;
			if(logging)
			{
				framesLog<<"FPS "<<frames - frameAtBase<<endl;		
				framesLog.Commit();
				profileLog.Commit();
			}
			frameAtBase = frames;
			baseTime = highResTime();
		}
	}
}