我做了一个非常简单的3D游戏,这个动作变得不稳定。
我使用了4个包含可更换项的链接列表,其中每个列表都有不同的优先级来确定前面的内容。这是我之前用过SDL的东西,因为没有z轴。
但是现在我使用z轴与OpenGL,有4个不同的列表是没有意义的,我只是分配随机优先级值。所以我切换到一个列表,运动变得不那么顺利。
这是一些缓存问题吗? Aren现在从内存中检索到x0
,x1
,y0
,y1
,z0
,z1
的值了吗?我试着让它们变得不稳定,但它没有帮助。
有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;
}
为什么会发生这种情况以及解决方案是什么?