我对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;
这是我的TileMapRender方法。
(我使用的是由DirectX制作的EPN引擎,它是未知的。所以我注释了我的代码)
我渲染了与DeviceScreen碰撞的tilemap(1024 * 768,但是为了保证金) 因为我想在屏幕上渲染可见的tilemap(我不会将瓷砖渲染到设备屏幕之外)。 所以我检查AABB碰撞每个瓷砖和(1024,768)设备屏幕,现在我只渲染必要的瓷砖。 但我认为这种方法有一个问题,即它不会渲染出屏幕拼贴。 对于声明也重复所有 maptiles; 这是一种效率低下的方法...... 也许我的游戏帧速率问题就是这种方法。那么我可以问STACK OVERFLOW我怎么能做到这一点?
是否有其他方法可以优化tilemap渲染? 请给我一些提示。
P.S
对不起我的疑问。
请原谅我的英语能力。
答案 0 :(得分:0)
您应该只渲染足够的图块来覆盖屏幕,例如,如果您的屏幕尺寸为640x480
,并且图块尺寸为16x16
则为:
Max tiles on X = (640/16)+2;
Max tiles on Y = (480/16)+2;
请注意我们如何为每边添加2个边距。接下来我们要做的就是找出我们在瓷砖地图中的位置,为此我们只需将相机x位置除以瓷砖宽度。
例如,如果相机位于x=500
和y=20
,则:
X tile index = 500/16
Y tile index = 20/16
您还必须以500%16
和20%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
希望这是有道理的。