c ++ 2D TileMap渲染优化

时间:2014-10-26 18:45:20

标签: c++ optimization 2d

我对2D TileMap Optimization有疑问。

我渲染了Tilemap,但速度太慢(帧率== 50)

我想我可以指定要渲染的图块。因此,不要渲染所有图块,只需在屏幕(设备)上渲染图块。

这是我目前的方法。



	//Lower Layer
		for(int y = 0; y < Height; ++y)
		{
			for(int x = 0; x < Width; ++x)
			{
				//if the tile index number is -1, then this is null tile (non drawing) 
				if( Layer1[y][x] != -1)
				{
					// this EPN_CheckCollision() Function is the AABB Collision Function. 
					// if there 2 Rect value's are collide , then return true. 

					if(EPN_CheckCollision( EPN_Rect(EPN_Pos(x*32, y*32)-CharacterPos) , EPN_Rect(0-32,0-32,1024+32,768+32) ) )
					{
					//EPN_Pos structure is consist of (float PosX , float PosY)
					EPN_Pos TilePos = EPN_Pos(x * 32, y * 32)-CharacterPos;

					//EPN_Rect structure is consist of below members
					//float Top X
					//float Top Y
					//float BottomX (not Width)
					//float BottomY (not Height)
					EPN_Rect TileRect = EPN_Rect( Layer1[y][x] % 8 * 32, Layer1[y][x] / 8 * 32, Layer1[y][x] % 8 * 32 + 32, Layer1[y][x] / 8 * 32+32);

					  //Blt is Texture render function. 
                     // 2nd Parameter is Render Pos and 3rd parameter is Render Texture's Rect.
					pEPN_TI->Blt("MapTileset",  TilePos, TileRect );
					}
				}
			}
&#13;
&#13;
&#13;

这是我的TileMapRender方法。

(我使用的是由DirectX制作的EPN引擎,它是未知的。所以我注释了我的代码)

我渲染了与DeviceScreen碰撞的tilemap(1024 * 768,但是为了保证金)  因为我想在屏幕上渲染可见的tilemap(我不会将瓷砖渲染到设备屏幕之外)。  所以我检查AABB碰撞每个瓷砖和(1024,768)设备屏幕,现在我只渲染必要的瓷砖。  但我认为这种方法有一个问题,即它不会渲染出屏幕拼贴。 对于声明也重复所有 maptiles; 这是一种效率低下的方法......  也许我的游戏帧速率问题就是这种方法。那么我可以问STACK OVERFLOW我怎么能做到这一点?

是否有其他方法可以优化tilemap渲染?  请给我一些提示。

P.S

对不起我的疑问。

请原谅我的英语能力。

1 个答案:

答案 0 :(得分:0)

您应该只渲染足够的图块来覆盖屏幕,例如,如果您的屏幕尺寸为640x480,并且图块尺寸为16x16则为:

Max tiles on X = (640/16)+2; 
Max tiles on Y = (480/16)+2;

请注意我们如何为每边添加2个边距。接下来我们要做的就是找出我们在瓷砖地图中的位置,为此我们只需将相机x位置除以瓷砖宽度。

例如,如果相机位于x=500y=20,则:

X tile index = 500/16
Y tile index = 20/16

您还必须以500%1620%16的偏移量渲染平铺网格,以便考虑“子平铺像素”滚动。 对于碰撞它更容易,你只需要检查与玩家所在瓷砖的碰撞,所以:

如果播放器尺寸为16x20像素且位置120,200

X tile index = 120/16
Y tile index = 200/16
Num X tiles to check = 16/16
Num Y tiles to check = 20/16

希望这是有道理的。