Примитивные типы Qt, гонки с QTimer и C ++ - PullRequest
1 голос
/ 07 марта 2012

У меня проблемы с этим конкретным фрагментом кода. У него либо состояние гонки, либо проблема с quint8.

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, она будет генерировать ошибки памяти броска. Я думал, что это могло быть преобразование из двойного в символ, но теперь это кажется маловероятным.

Может кто-нибудь уточнить, связано ли это с quint8 или временем?

Использует ли интервал QTimer для вызова вышеуказанного кода и функций, связанных с OpenGL, возможно ли, чтобы QTimer инициировал событие, не завершив предыдущее?

Если так, как я мог бы лучше построить свою игровую петлю с помощью Qt? Используя usleep?

РЕДАКТИРОВАТЬ: теперь я вижу, что это не проблема синхронизации, так как оставив perlin и напечатав его, но установив chunk3 [i] на фиксированное значение 30, работает нормально.

РЕДАКТИРОВАТЬ: приведение int к quint8, похоже, не решает проблему.

1 Ответ

0 голосов
/ 07 марта 2012
        quint8 perlin = (quint8)((int)(wallsPerlin->Get(abs[0], abs[1])) % 8 + 8);

Исправлено.

...