在 if 语句中访问数组会显着降低性能

问题描述 投票:0回答:2

所以我试图为我的正方形数组实现一个渲染函数。数组表示爆炸的光线投射碰撞箱的输出:

Algorithm output

对于绘图,我使用 SDL2 库,但一次绘制一个矩形要求太高。所以我遇到了纹理流。现在我有两个

for
循环正在遍历包含 hitbox 信息的数组。堆栈上的数组是
char
(ExplosionGrid)类型,代表屏幕上的矩形,如果矩形被碰撞击中,则存储
1
,如果没有,则存储
0
,如果存在障碍物,则存储
2

我有两个代码示例。

  1. 没有性能影响:
SDL_LockTexture(ExplTextFast, NULL, &ExplSurfFast->pixels, &ExplSurfFast->pitch);
            int StartRendX = (int)((crosshair.x + 10) / 6);
            int StartRendY = (int)((crosshair.y + 10) / 6);
            for (int i = 0; i < 65; i++)
            {
                for (int j = 0; j < 65; j++)
                {
                        if (1)
                        {
                            *(((int*)ExplSurfFast->pixels) + j + (i * 65)) = 0;
                        }
                        else
                        {
                            *(((int*)ExplSurfFast->pixels) + j + (i * 65)) = 0xFFFFFFFF;
                        }
                }
            }
            SDL_UnlockTexture(ExplTextFast);
            SDL_RenderCopy(renderer1, ExplTextFast, NULL, &DrawingRectExpl);

它只是改变表面中的像素数据。

  1. 性能大幅下降:
SDL_LockTexture(ExplTextFast, NULL, &ExplSurfFast->pixels, &ExplSurfFast->pitch);
            int StartRendX = (int)((crosshair.x + 10) / 6);
            int StartRendY = (int)((crosshair.y + 10) / 6);
            for (int i = 0; i < 65; i++)
            {
                for (int j = 0; j < 65; j++)
                {
                        if (ExplosionGrid[i][j] == 1)
                        {
                            *(((int*)ExplSurfFast->pixels) + j + (i * 65)) = 0;
                        }
                        else
                        {
                            *(((int*)ExplSurfFast->pixels) + j + (i * 65)) = 0xFFFFFFFF;
                        }
                }
            }
            SDL_UnlockTexture(ExplTextFast);
            SDL_RenderCopy(renderer1, ExplTextFast, NULL, &DrawingRectExpl);

如您所见,迭代次数非常少。但同时它使用了20%的cpu。第一个示例使用

0.0xx%
。 这些方法每秒重复 100 次。但迭代次数仍然很小。

如果我使用

if (rand()%2)
,性能会很好。但似乎访问堆栈上的数组并在
if
语句中使用它会出现问题。

我尝试分析我的代码,发现 if 语句内的数组正在破坏我的性能,但我无法理解为什么。

arrays c performance sdl sdl-2
2个回答
0
投票

您可以尝试通过计算

ExplosionGrid[i][j]
的调用值来减少错误预测的分支数量,而不是测试和分支:

SDL_LockTexture(ExplTextFast, NULL, &ExplSurfFast->pixels, &ExplSurfFast->pitch);

    int StartRendX = (int)((crosshair.x + 10) / 6);
    int StartRendY = (int)((crosshair.y + 10) / 6);
    for (int i = 0; i < 65; i++)
    {
        for (int j = 0; j < 65; j++)
        {
            *(((unsigned int *)ExplSurfFast->pixels) + j + (i * 65)) = -(ExplosionGrid[i][j] != 1);
        }
    }
    SDL_UnlockTexture(ExplTextFast);
    SDL_RenderCopy(renderer1, ExplTextFast, NULL, &DrawingRectExpl);

0
投票

以下内容有区别吗?

        for (int i = 0; i < 65; i++)
        {
            char *temp = ExplosionGrid[i]; // <== new pointer
            for (int j = 0; j < 65; j++)
            {
                    if (temp[j] == 1)      // <== use pointer
                    {
© www.soinside.com 2019 - 2024. All rights reserved.