Dictionary 快板5:瓷砖地图->;滚动滞后

Dictionary 快板5:瓷砖地图->;滚动滞后,dictionary,tiles,lag,frame-rate,allegro,Dictionary,Tiles,Lag,Frame Rate,Allegro,我现在正在制作一个小游戏 现在我已经通过平铺贴图编辑器制作了一张贴图,并通过一个al_draw_bitmap_region循环将其放在屏幕上。 地图显示在屏幕上,但当我尝试滚动视图时,它需要很长时间才能向前移动。 这可能是由“大”贴图(100x100)引起的 ->在Allegro 4中,我也使用过一次这种方法,它对我来说效果很好(我曾经在doubleBuffer中blit所有内容,然后在屏幕上blit) 然而,到目前为止,我似乎还没有在allegro 5中找到解决问题的方法 我很抱歉,如果像这样

我现在正在制作一个小游戏

现在我已经通过平铺贴图编辑器制作了一张贴图,并通过一个al_draw_bitmap_region循环将其放在屏幕上。 地图显示在屏幕上,但当我尝试滚动视图时,它需要很长时间才能向前移动。 这可能是由“大”贴图(100x100)引起的 ->在Allegro 4中,我也使用过一次这种方法,它对我来说效果很好(我曾经在doubleBuffer中blit所有内容,然后在屏幕上blit)

然而,到目前为止,我似乎还没有在allegro 5中找到解决问题的方法 我很抱歉,如果像这样的董事会已经开放,我还没有找到解决我的问题的办法

我真的很感谢你的帮助

代码:

main.cpp:

#include<allegro5\allegro.h>
#include<allegro5\allegro_native_dialog.h>
#include<allegro5\allegro_primitives.h>
#include<allegro5\allegro_image.h>
#include<allegro5\allegro_font.h>
#include<allegro5\allegro_ttf.h>
#include "global.h"
#include "map.h"

using namespace std;



int main()
{

    ALLEGRO_DISPLAY *display = NULL;
    al_init_primitives_addon();
    al_init_image_addon();
    al_init_font_addon();
    al_init_ttf_addon();
    al_init();

    ALLEGRO_FONT *font18 = al_load_font("arial.ttf", 18, 0);

    if (!al_init())
    {
        al_show_native_message_box(NULL,NULL,NULL, "Could not initialize Allegro 5", NULL, NULL);
    }


    bool keys[] = {false, false, false, false};
    enum KEYS{UP,DOWN,LEFT,RIGHT};

    ALLEGRO_TIMER *timer = NULL;

    bool done=false;
    bool reDraw=true;
    int xOff =0;
    int yOff =0;
    int count = 0;
    int FPS = 5;
    int x=10, y=10;
    int moveSpeed = 5;


    display = al_create_display(ScreenWidth,ScreenHeight);

    if(!display)
        al_show_native_message_box(NULL,NULL,NULL, "Could not create Allegro Window", NULL,NULL);


    al_set_window_title(display,"Outfall-RPG");

    al_install_keyboard();
    ALLEGRO_EVENT_QUEUE *event_queue = NULL;

    event_queue = al_create_event_queue();
    timer = al_create_timer(1.0 / FPS);             // 1.0 = Sekunden; / FPS = Frames per Second

    al_register_event_source(event_queue, al_get_keyboard_event_source());
    al_register_event_source(event_queue, al_get_display_event_source(display));
    al_register_event_source(event_queue, al_get_timer_event_source(timer));

    al_start_timer(timer);



    while(!done)
    {
        ALLEGRO_EVENT ev;
        al_wait_for_event(event_queue, &ev);

        map map;
        map.Init();
        map.LoadMap("map1.txt");


        if(ev.type == ALLEGRO_EVENT_KEY_DOWN)
        {
            switch(ev.keyboard.keycode)
            {
                case ALLEGRO_KEY_ESCAPE:
                    done=true;
                    break;
                case ALLEGRO_KEY_LEFT:
                    keys[LEFT] = true;
                    break;
                case ALLEGRO_KEY_RIGHT:
                    keys[RIGHT] = true;
                    break;
                case ALLEGRO_KEY_UP:
                    keys[UP] = true;
                    break;
                case ALLEGRO_KEY_DOWN:
                    keys[DOWN] = true;
                    break;
            }
        }
        else if(ev.type == ALLEGRO_EVENT_KEY_UP)
        {
            switch(ev.keyboard.keycode)
            {
                case ALLEGRO_KEY_ESCAPE:
                    done=true;
                    break;
                case ALLEGRO_KEY_LEFT:
                    keys[LEFT] = false;
                    break;
                case ALLEGRO_KEY_RIGHT:
                    keys[RIGHT] = false;
                    break;
                case ALLEGRO_KEY_UP:
                    keys[UP] = false;
                    break;
                case ALLEGRO_KEY_DOWN:
                    keys[DOWN] = false;
                    break;
                }
        }
        else if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
        {
            break;
        }
        else if(ev.type == ALLEGRO_EVENT_TIMER)
        {
            xOff -= keys[RIGHT] * 3;
            xOff += keys[LEFT] * 3;
            yOff -= keys[DOWN] * 3;
            yOff += keys[UP] * 3;

            reDraw=true;
        }
        if(reDraw && al_is_event_queue_empty(event_queue))
        {
            map.Draw(xOff, yOff);
            //al_set_target_bitmap(al_get_backbuffer(display));
            al_flip_display();
            al_clear_to_color(al_map_rgb(0,0,0));



            reDraw=false;

        }
    }

    al_destroy_event_queue(event_queue);
    al_destroy_timer(timer);
    al_destroy_display(display);
    return 0;
}

#包括这些
地图::绘图的线条是可疑的:

bgSheet = al_load_bitmap("bilder/testas1.png");
buffer = al_create_bitmap(800,600);
map::Draw
每次调用位图时都会重新加载它。这不仅会给绘制循环带来不必要的负载,而且每次都会泄漏加载的位图

尝试在
map::Init
中加载
bgSheet
一次,并对每个绘图循环使用相同的位图

您还为每个draw调用分配并随后泄漏一个新的
缓冲区。您似乎没有使用缓冲区,因此我将完全删除
al\u create\u bitmap
调用。如果您的目的是将缓冲区加倍,那么在allegro5中通常不需要这样做


另外,它看起来像是在游戏循环中调用了
map::Init
,这意味着您正在重复加载map,并且可能要花费大量时间等待I/O。在游戏循环开始之前调用
map::Init

这些
map::Draw
行是可疑的:

bgSheet = al_load_bitmap("bilder/testas1.png");
buffer = al_create_bitmap(800,600);
map::Draw
每次调用位图时都会重新加载它。这不仅会给绘制循环带来不必要的负载,而且每次都会泄漏加载的位图

尝试在
map::Init
中加载
bgSheet
一次,并对每个绘图循环使用相同的位图

您还为每个draw调用分配并随后泄漏一个新的
缓冲区。您似乎没有使用缓冲区,因此我将完全删除
al\u create\u bitmap
调用。如果您的目的是将缓冲区加倍,那么在allegro5中通常不需要这样做


另外,它看起来像是在游戏循环中调用了
map::Init
,这意味着您正在重复加载map,并且可能要花费大量时间等待I/O。在游戏循环开始之前调用
map::Init

确实是map.Init导致了延迟,因为重新加载了map文件


谢谢

确实是map.init导致了延迟,因为重新加载了map文件


谢谢

欢迎来到堆栈溢出!请记住,这不是一个论坛,它是一个问答网站。因此,发布感谢信息作为问题的新答案并不是一个好的做法。你可以在回答的时候用这样的评论。虽然@rcorte接受了答案,但我认为。。。当你在这里时,请记住这些提示,欢迎再来一次:Doh抱歉,似乎我监督了这种方法:D当它最终成功时,我非常高兴(我已经搜索了几个小时)我没有花时间查看是否有“添加评论”按钮:D无论如何,我会记住这一点,感谢提醒和欢迎;)欢迎来到堆栈溢出!请记住,这不是一个论坛,它是一个问答网站。因此,发布感谢信息作为问题的新答案并不是一个好的做法。你可以在回答的时候用这样的评论。虽然@rcorte接受了答案,但我认为。。。当你在这里时,请记住这些提示,欢迎再来一次:Doh抱歉,似乎我监督了这种方法:D当它最终成功时,我非常高兴(我已经搜索了几个小时)我没有花时间查看是否有“添加评论”按钮:D无论如何,我会记住这一点,感谢提醒和欢迎;)另一个巨大的加速将是在绘图函数的开头添加
al\u hold\u bitmap\u drawing(true)
,并在函数的结尾添加一个
false
。这将只向GPU发送一个大的绘制调用,GPU将一次性绘制整个位图区域。另一个巨大的加速将是在绘制函数的开头添加
al\u hold\u bitmap\u drawing(true)
,并在函数的结尾添加一个
false
。这将只向GPU发送一个大的绘制调用,GPU将一次性绘制整个位图区域。
bgSheet = al_load_bitmap("bilder/testas1.png");
buffer = al_create_bitmap(800,600);