You need to enable JavaScript to run this app. SDL2纹理出现在错误表面问题:角色随机渲染到文本框中
优惠活动
大模型
产品
解决方案
定价
更多

SDL2纹理出现在错误表面问题:角色随机渲染到文本框中

问题根因
  • 纹理销毁后悬垂指针+ID复用:你销毁ftexture后没有将指针置空,SDL内存分配机制会优先复用刚释放的纹理内存块/ID,此时文本框绘制逻辑仍在判断ftexture非空就执行绘制,刚好新创建的主角精灵纹理占用了原ftexture的地址,就会把精灵当成文本纹理绘制到文本框区域。
  • 逻辑时序不同步:纹理销毁操作放在事件处理逻辑中间执行,没有和渲染帧周期对齐,可能出现当前帧已经提交了ftexture的绘制指令,还没完成渲染就把纹理替换成了精灵纹理,最终绘制出来的内容就是精灵。
  • 状态判断缺失:当前销毁ftexture的逻辑没有和文本显示状态做互斥,可能出现已经触发了文本显示逻辑,又同时销毁了文本纹理的冲突情况。

你提到鼠标移动到其他悬浮对象就恢复,本质是这个操作会重新触发文本纹理的创建逻辑,覆盖了被复用的地址,因此显示回归正常。

修复方案
  1. 销毁纹理后立刻置空对应指针,同时所有绘制ftexture的位置新增双重校验,必须同时满足ftexture非空+interactionMessage非空才绘制文本:
else {              
    SDL_DestroyTexture(ftexture);
    ftexture = nullptr; // 新增置空操作
    SDL_DestroyTexture(Textures::spriteTexture);
    Textures::spriteTexture = nullptr; // 新增置空操作
    Textures::spriteTexture = SDL_CreateTextureFromSurface(renderer, Textures::spriteDown1);
}
  1. 调整纹理操作的时机,统一将纹理销毁、创建操作放到当前帧所有渲染指令执行完成后,下一帧逻辑处理前执行,避免和渲染流程冲突。
  2. 新增状态互斥判断,当interactionMessage非空(即需要显示文本)时,不执行ftexture的销毁逻辑,等文本显示周期结束后再处理。
  3. 偶发低概率问题可以加延迟销毁机制:把需要销毁的纹理先存入临时待销毁队列,等1~2帧所有已提交的渲染指令都执行完成后,再统一执行销毁操作,彻底避免复用冲突。

内容的提问来源于stack exchange,提问作者Mr Tea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 11:36:04