You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SDL程序创建纹理矩形运行时出现黑屏问题求助

SDL程序黑屏问题的解决方法

核心问题分析

你的代码存在资源创建顺序颠倒的致命错误:

  • 调用SDL_CreateTextureFromSurface创建纹理时,renderer还未初始化(值为nullptr),导致纹理创建失败,最终渲染无有效内容。
  • 窗口和渲染器的创建步骤被放在纹理创建之后,完全不符合SDL的工作流程。

另外还有两个潜在问题:

  • 缺少资源加载/创建失败的错误检查,无法快速定位问题。
  • Xcode项目中,资源文件路径可能并非./Images/smile.bmp,需确保图片已正确添加到项目的Copy Bundle Resources中。

修复后的完整代码

#include <SDL2/SDL.h>
#include "dinoHeader.h"

int main(int argc, const char * argv[]) {
    
    if(SDL_Init(SDL_INIT_EVERYTHING) < 0){
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL初始化失败: %s", SDL_GetError());
        return 1;
    }
    
    SDL_Window* window = nullptr;
    SDL_Renderer* renderer = nullptr;
    
    // 第一步:先创建窗口和渲染器
    window = SDL_CreateWindow("Dino", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, ScreenWidth, ScreenHeight, SDL_WINDOW_OPENGL);
    if(!window){
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "窗口创建失败: %s", SDL_GetError());
        SDL_Quit();
        return 1;
    }
    
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if(!renderer){
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "渲染器创建失败: %s", SDL_GetError());
        SDL_DestroyWindow(window);
        SDL_Quit();
        return 1;
    }
    
    // 第二步:加载图片表面并创建纹理
    SDL_Surface* surface = SDL_LoadBMP("./Images/smile.bmp");
    if(!surface){
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "图片加载失败: %s", SDL_GetError());
        SDL_DestroyRenderer(renderer);
        SDL_DestroyWindow(window);
        SDL_Quit();
        return 1;
    }
    
    SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
    if(!texture){
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "纹理创建失败: %s", SDL_GetError());
        SDL_FreeSurface(surface);
        SDL_DestroyRenderer(renderer);
        SDL_DestroyWindow(window);
        SDL_Quit();
        return 1;
    }
    
    SDL_FreeSurface(surface);
    
    SDL_Rect rect;
    rect.w = 100;
    rect.h = 100;
    rect.x = (ScreenWidth / 2) - (rect.w / 2);
    rect.y = (ScreenHeight / 2) - (rect.h / 2);
    
    bool game = true;
    
    while (game) {
        SDL_Event event;
        while(SDL_PollEvent(&event)){
            if(event.type == SDL_QUIT){
                game = false;
            }
        }
        
        SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE);
        SDL_RenderClear(renderer);
        
        SDL_RenderCopy(renderer, texture, NULL, &rect);
        
        SDL_RenderPresent(renderer);
    }
    
    // 按创建逆序销毁资源
    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return 0;
}

额外注意事项

  • Xcode资源路径检查:右键项目 -> Build Phases -> Copy Bundle Resources,确保smile.bmp在列表中。若路径无效,可尝试直接使用文件名(如"smile.bmp"),或通过Xcode文件引用设置正确相对路径。
  • 资源销毁顺序:销毁资源需遵循“创建逆序”,先销毁纹理,再销毁渲染器,最后销毁窗口,避免悬空指针问题。

内容的提问来源于stack exchange,提问作者Holo Graphic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:27:35