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

Allegro中修改子位图后,如何更新主位图并同步至屏幕显示?

解决Allegro子位图修改后无法同步到屏幕的问题

我来帮你梳理下问题所在,以及具体的修复步骤:

核心问题分析

你当前的代码有两个关键问题导致修改不显示:

  1. 子位图的创建未正确关联到image变量:你调用al_create_sub_bitmap(grid, 0, 0, columns, rows);后,没有把返回的子位图赋值给image,导致image还是之前通过loadBitmapAtSize加载的独立位图,和grid完全无关——你修改这个image自然不会影响到grid。
  2. 修改后未将主位图重新绘制到屏幕缓冲:即使子位图修改同步到了grid,你也需要把更新后的grid重新画到显示的后台缓冲,再执行翻转显示才能让屏幕看到变化。

修复后的完整代码流程

1. 正确创建子位图

首先,在创建模型的步骤中,要把al_create_sub_bitmap的返回值赋值给image(记得先销毁之前加载的image,避免内存泄漏):

// 创建模型
// 先销毁之前加载的独立位图(如果不需要的话)
if (image != NULL) {
    al_destroy_bitmap(image);
}
// 创建grid的子位图并赋值给image
image = al_create_sub_bitmap(grid, 0, 0, columns, rows);
// 可以在这里把原始图像绘制到子位图(如果需要的话)
al_set_target_bitmap(image);
ALLEGRO_BITMAP* temp_img = loadBitmapAtSize(...);
al_draw_bitmap(temp_img, 0, 0, 0);
al_destroy_bitmap(temp_img); // 临时加载的位图用完销毁
al_set_target_bitmap(al_get_backbuffer(display));

2. 修改子位图并同步到屏幕

修改子位图的代码调整如下:

// 设置绘制目标为子位图image,修改像素
al_set_target_bitmap(image);
for (int y = 0; y < rows; ++y) {
    for (int x = 0; x < columns; ++x) {
        if(x == y || x-1 == y || x+1 == y || x == y-1 || x == y+1){
            al_draw_pixel(x, y, al_map_rgb(255, 255, 255));
        }
    }
}

// 关键:将更新后的主位图grid绘制到显示的后台缓冲
al_set_target_bitmap(al_get_backbuffer(display));
al_draw_bitmap(grid, 0, 0, 0);

// 翻转显示,让屏幕刷新
al_flip_display();

原理说明

Allegro的子位图和主位图是共享像素内存的——也就是说,你对子位图的任何像素修改都会直接反映到主位图上,不需要额外的同步操作。但你必须把更新后的主位图重新绘制到显示的后台缓冲,再通过al_flip_display()把后台缓冲的内容切换到前台,这样屏幕才能看到修改后的效果。

额外注意事项

  • 确保主位图grid的尺寸足够容纳子位图的区域(columns和rows不能超过grid的宽高),否则子位图创建会失败。
  • 子位图依赖于主位图的存在,如果主位图被销毁,子位图也会失效,不能再使用。
  • 所有加载或创建的位图,不再使用时要记得调用al_destroy_bitmap()释放内存,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:43:11