所以我试图为我的正方形数组实现一个渲染函数。数组表示爆炸的光线投射碰撞箱的输出:
对于绘图,我使用 SDL2 库,但一次绘制一个矩形要求太高。所以我遇到了纹理流。现在我有两个
for
循环正在遍历包含 hitbox 信息的数组。堆栈上的数组是 char
(ExplosionGrid)类型,代表屏幕上的矩形,如果矩形被碰撞击中,则存储 1
,如果没有,则存储 0
,如果存在障碍物,则存储 2
。
我有两个代码示例。
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);
它只是改变表面中的像素数据。
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 语句内的数组正在破坏我的性能,但我无法理解为什么。
您可以尝试通过计算
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);
以下内容有区别吗?
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
{