在开发thinkvd软件中,用的是SDL,实际应用中遇到了不少问题,有时想把它换掉。
今天又遇到两个比较麻烦的问题:
1。多窗口时,其中一个窗口图象不显示
2。内存泄漏,每次播放都会增加0.3--0.5M。
问题一:
在SDL函数SDL_Texture *SDL_CreateTexture(Uint32 format, int access, int w, int h)中
texture = (SDL_Texture *) SDL_calloc(2, sizeof(*texture));
若连续createTexture时,有时返回同一指针,它是调用了
void *dlcalloc(size_t n_elements, size_t elem_size)
{
void *mem;
size_t req = 0;
if (n_elements != 0) {
req = n_elements * elem_size;
if (((n_elements | elem_size) & ~(size_t) 0xffff) &&
(req / n_elements != elem_size))
req = MAX_SIZE_T; /* force downstream failure on overflow */
}
mem = dlmalloc(req);
if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
memset(mem, 0, req);
return mem;
}
为什么有时是同一指针,原因不明。出现的概率比较小,于是采用了尽可以少调用SDL_CreateTexture方法来解决.
问题二:内存泄漏
这个问题一直就知道,以前用的是固定播放窗口,问题不严重,此次改用了可更改播放窗口大小,问题就显现出来的。反复播放多次,应用程序内存很快就达到100M以上。
反复跟踪测试,先排除了createTexture内存泄漏问题,再看createWindow相关的,最后发现调用dx9的IDirect3DDevice9_Release(data->device);没有释放掉, 跟踪方法是用它在分配内存的位置后面调用,看是否能正常释放