Qt基元类型,与QTimer和C++比赛

Qt primitive types, racing with QTimer, and C++

本文关键字:QTimer C++ 比赛 类型 Qt      更新时间:2023-10-16

我在处理这段特定的代码时遇到了一些麻烦。它要么有比赛条件,要么有昆汀8的问题。

quint8 chunk3[CHUNK_SIZE_MULT];
memset(chunk3,0x00, sizeof(chunk3));
for (int cx = 0; cx < CHUNK_SIZE; cx++)
    for (int cz = 0; cz < CHUNK_SIZE; cz++) {
        int i = cx * CHUNK_SIZE + cz;
        float abs[2];
        abs[0] = x * CHUNK_SIZE + lastPosX + cx;
        abs[1] = z * CHUNK_SIZE + lastPosZ + cz;
        int perlin = (int)(wallsPerlin->Get(abs[0], abs[1])) % 8;
        chunk3[i] = perlin > 6 ? perlin : 0;//(int)(sin(i) + 1.0 * 32.0);
    }

如果我使用chunk3[I]=0或30或I%30,它将正常工作。然而,当我引入sin函数、rand函数或perlin噪声时,它会抛出抛出内存故障。我原以为这可能是从double到char的转换,但现在看来不太可能了。

有人能澄清一下这是与五分之一还是时间有关吗?

如果使用QTimer间隔来调用上述代码和OpenGL相关函数,QTimer是否有可能在没有完成前一个事件的情况下触发事件?

如果是这样的话,我如何用Qt更好地构建我的游戏循环?使用usleep?

编辑:我现在明白了,这不是时间问题,因为离开perlin并打印它,但将chunk3[I]设置为固定的30可以很好地工作。

编辑:将int转换为quint8似乎并不能解决问题。

        quint8 perlin = (quint8)((int)(wallsPerlin->Get(abs[0], abs[1])) % 8 + 8);

修复它。