【发布时间】:2015-10-19 16:51:04
【问题描述】:
我有以下 Pascal 代码,使用标准 SDL2 库。所有代码都是有效的,图像位于正确的目录中,并且在极少数情况下会加载所需的图像。然而,在 99% 的情况下,它只显示其背后窗口内容的静态图片。
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, sysutils, SDL2, SDL2_image
{ you can add units after this };
const
SWIDTH = 709;
SHEIGHT = 488;
var
Window: PSDL_Window;
ScreenSurface, Symbol: PSDL_Surface;
begin
WriteLn(GetCurrentDir);
if SDL_Init(SDL_INIT_VIDEO) < 0 then halt;
SDL_Init(SDL_INIT_EVERYTHING);
Window:= SDL_CreateWindow('Symbol Test', SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SWIDTH, SHEIGHT, SDL_WINDOW_SHOWN);
ScreenSurface:= SDL_GetWindowSurface(Window);
IMG_Init(IMG_INIT_PNG);
Symbol:= IMG_Load('symbol.png');
SDL_BlitSurface(Symbol, nil, ScreenSurface, nil);
SDL_UpdateWindowSurface(Window);
SDL_Delay(5000);
SDL_FreeSurface(Symbol);
SDL_FreeSurface(ScreenSurface);
SDL_DestroyWindow(Window);
SDL_Quit();
end.
【问题讨论】:
-
可能与垂直同步有关。尝试循环显示多次直到 5 秒过去,或者禁用加速 (SDL_HINT_FRAMEBUFFER_ACCELERATION)。你也不应该释放
ScreenSurface,但这与你的问题无关。 stackoverflow.com/questions/32500491/… 如果您使用启用了组合的 OS/WM 可能会有所帮助,尽管它没有提供明确的解决方案。 -
@keltar:太棒了!你是对的,这是垂直同步的问题。我现在已经修复了它,并且在轮询事件循环内进行更新是我所要做的。非常感谢!
标签: opengl sdl-2 freepascal lazarus