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