2014-10-26 7 views
0

У меня вопрос о 2D TileMap Optimization.C++ 2D TileMap Оптимизация рендеринга

я вынес Tilemap, но скорость слишком медленно (== фреймрейт 50)

Я думаю, что я могу указать плитки быть оказаны. Поэтому вместо того, чтобы отображать все плитки, просто отрисуйте плитки на экране (устройстве).

Это мой текущий метод.

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

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

 
\t \t \t \t \t //EPN_Rect structure is consist of below members 
 
\t \t \t \t \t //float Top X 
 
\t \t \t \t \t //float Top Y 
 
\t \t \t \t \t //float BottomX (not Width) 
 
\t \t \t \t \t //float BottomY (not Height) 
 
\t \t \t \t \t 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); 
 

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

Это мой TileMapRender метод.

(я использую EPN двигатель сделанный Directx, которое неизвестно. Поэтому я аннотированный мой код)

я вынес tilemap, столкнувшегося с DeviceScreen (1024 * 768, но для края) , потому что я хочу сделать видимый tilemap на экране (я не выношу плитки из экрана устройства). Итак, я проверяю AABB Collision на каждую плиту и (1024, 768) экран устройства, теперь я только обрабатываю необходимые плитки. Но я думаю, что этот метод имеет проблему, что он не выводит из экранных плит. Для справки также повторяйте все maptiles; Какой неэффективный метод ... Возможно, в этом методе может быть проблема с частотой кадров в моей игре. Могу ли я попросить STACK OVERFLOW, как я могу это сделать?

Есть ли еще один способ оптимизировать рендеринг tilemap? Дайте мне несколько советов.

P.S

Я сожалею о моем узловатом вопросе.

Прошу прощения за мой английский.

ответ

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 

Надеется, что это делает смысл.

+0

спасибо! Я прочитал ваши советы, и я понял это.но у меня больше вопросов про свиток. Теперь я могу знать индекс X, Y tile. но я до сих пор не могу понять о каждом RenderPos X, Y. Как я могу получить каждый элемент P X X X, когда я прокручиваю плавно? – HelloWorld

+0

Используйте 500% 16, это означает, что модуль остается, поэтому вам нужны плитки +2 буфера – paulm

+0

спасибо много! Есть ли какая-либо рекомендуемая система в stackoverflow? Я хочу порекомендовать ваш ответ наилучшим образом. – HelloWorld