为什么运动在优化后变得不稳定?

时间:2014-06-05 06:14:52

标签: c multithreading

我做了一个非常简单的3D游戏,这个动作变得不稳定。

我使用了4个包含可更换项的链接列表,其中每个列表都有不同的优先级来确定前面的内容。这是我之前用过SDL的东西,因为没有z轴。

但是现在我使用z轴与OpenGL,有4个不同的列表是没有意义的,我只是分配随机优先级值。所以我切换到一个列表,运动变得不那么顺利。

这是一些缓存问题吗? Aren现在从内存中检索到x0x1y0y1z0z1的值了吗?我试着让它们变得不稳定,但它没有帮助。

有2个线程,更新值的逻辑线程和呈现的线程。

以下是代码:

typedef struct {
    void *id;
    bool (*render)(void *yourself, game_clock_t time_ms);
    void (*clean)(void *yourself);
    pthread_mutex_t lock;
} Renderable;

typedef struct {
    Renderable renderable;
    Cube cube;
    int x0;
    int y0;
    int z0;
    int x1;
    int y1;
    int z1;
    game_clock_t t0;
    game_clock_t t1;
} Entity;

/* This function is called once for every node in the list */
static game_clock_t frame_time;
static void render_yourself(Node *node)
{
    Renderable *renderable = node->content;

    renderable_lock(renderable);

    if(renderable->render(renderable, frame_time)){
        list_remove_node(&render_list, renderable->id);
        renderable_unlock(renderable);
        renderable->clean(renderable);
        return;
    }

    renderable_unlock(renderable);
}

/* This is the function that draws the entity */
bool entity_render(void *entity_ptr, game_clock_t time)
{
    float x;
    float y;
    float z;
    float m;
    Entity *entity;

    entity = entity_ptr;

    if(time > entity->t1){
        x = entity->x1;
        y = entity->y1;
        z = entity->z1;
    }
    else
    if(time < entity->t0){
        x = entity->x0;
        y = entity->y0;
        z = entity->z0;
    }
    else {
        m = (float)(time - entity->t0) / (float)(entity->t1 - entity->t0);
        x = entity->x0 + (entity->x1 - entity->x0) * m;
        y = entity->y0 + (entity->y1 - entity->y0) * m;
        z = entity->z0 + (entity->z1 - entity->z0) * m;
    }

    cube_render(entity->cube, x, y, z);

    return false;   
}

为什么会发生这种情况以及解决方案是什么?

0 个答案:

没有答案