C ++ получает параметры перед циклом for или нет - PullRequest
0 голосов
/ 19 сентября 2019

Какова лучшая практика в этом случае:

Должен ли я получить переменные перед запуском цикла for следующим образом:

void Map::render(int layer, Camera* pCam)
{
    int texture_index(m_tilesets[layer]->getTextureIndex());

    int tile_width(m_size_of_a_tile.getX());
    int tile_height(m_size_of_a_tile.getY());

    int camera_x(pCam->getPosition().getX());
    int camera_y(pCam->getPosition().getY());

    int first_tile_x(pCam->getDrawableArea().getX());
    int first_tile_y(pCam->getDrawableArea().getY());

    int map_max_x( (640 / 16) + first_tile_x );
    int map_max_y( (360 / 16) + first_tile_y );

    if (map_max_x > 48) { map_max_x = 48; }
    if (map_max_y > 28) { map_max_x = 28; }

    Tile* t(nullptr);

    for (int y(first_tile_y); y < map_max_y; ++y) {
        for (int x(first_tile_x); x < map_max_x; ++x) {

            // move map relative to camera
            m_dst_rect.x = (x * tile_width) + camera_x;
            m_dst_rect.y = (y * tile_height) + camera_y;

            t = getTile(layer, x, y);
            if (t) {
                pTextureManager->draw(texture_index, getTile(layer, x, y)->src, m_dst_rect);
            }
        }
    }
}

или лучше получить его непосредственно в циклевот так (в данном случае код короче, но менее читабелен):

void Map::render(int layer, Camera* pCam)
{
    int first_tile_x(pCam->getDrawableArea().getX());
    int first_tile_y(pCam->getDrawableArea().getY());

    for (int y(first_tile_y); y < (640 / 16) + first_tile_x; ++y) {
        for (int x(first_tile_x); x < (360 / 16) + first_tile_y; ++x) {

            // move map relative to camera
            m_dst_rect.x = (x * m_size_of_a_tile.getX()) + pCam->getPosition().getX();
            m_dst_rect.y = (y * m_size_of_a_tile.getY()) + pCam->getPosition().getY();

            Tile* t(getTile(layer, x, y));
            if (t) {
                pTextureManager->draw(m_tilesets[layer]->getTextureIndex(), getTile(layer, x, y)->src, m_dst_rect);
            }
        }
    }
}

Влияет ли это на производительность при использовании одного метода над другим?

1 Ответ

1 голос
/ 19 сентября 2019

Синтаксически вторая версия должна быть предпочтительной, так как она содержит объект в области действия, в которой он используется, не пропуская его в различные контексты.С точки зрения производительности вам нужно будет профилировать, но я был бы удивлен, если бы была какая-либо разница, потому что компилятор часто замечает, что результаты не меняются, по крайней мере для простых функций, и делаю эту оптимизацию для вас.

Для функций, которые являются более сложными или потенциально динамическими, но вы знаете, что они не изменят свой результат во время цикла for, имеет смысл определить их перед циклом.

...