c++ - C ++在for循环之前是否获取参数
问题描述
在这种情况下,最佳做法是什么:
我应该在运行这样的 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);
}
}
}
}
使用一种方法对性能有影响吗?
解决方案
从语法上讲,第二个版本是首选的,因为它确实在使用它的范围内包含对象,而不是将其泄漏到不同的上下文中。性能方面,您需要进行分析,但如果有任何差异,我会感到惊讶,因为编译器经常会注意到结果不会改变,至少对于简单的函数来说,并且会为您进行优化。
对于更复杂或潜在动态的函数,但您知道它们不会在 for 循环期间更改其结果,因此在循环之前定义它们是有意义的。
推荐阅读
- javascript - 如何使用 Chart.js 恢复 xAxes?
- python - 如何使用 Early Stopping 监控 Tensorflow 中的损失?
- c# - 如何将 UTC 格式“yyyy-MM-dd'T'HH:mm:sszzzz”解析为“MM/dd/yyyy”?
- php - WooCommerce 中具有多个折扣百分比的一张优惠券
- excel - 如何将 Workbook1/Sheet3 中的选定行与 Workbook2/Sheet3 中的选定行进行比较
- php - Stripe 订阅计划切换问题
- c# - 在 Bot Framework V4 中保留自定义提示验证
- laravel - Vue Laravel 使用其他组件中的按钮提交表单
- php - 调用未定义函数 __()
- android - 如何添加一个用于动态 HTML 文本?