LINUX.ORG.RU

Поясните инициализацию SDL2

 , , ,


0

1

Решил я тут потыкать SDL, смотрю на код:

	//Initialize SDL
	if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
	{
		printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
	}
	else
	{
		//Create window
		window = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
		if( window == NULL )
		{
			printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
		}
		else
		{
Зачем нужна проверка на (window == NULL)? Может ли в реальности быть такая ситуация, что SDL успешно инициализировался, а окно создать не может? Как воспроизвести?

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)
Ответ на: комментарий от EXL

Я читаю код тут. Пример там же взял. Надеюсь, автор не обидится, что без письменного соглашения.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

https://wiki.libsdl.org/SDL_CreateWindow
Return Value
Returns the window that was created or NULL on failure; call SDL_GetError() for more information.

По-моему, это стандартная проверка на ошибку. Типа, если вернулось какое-то отрицательное или NULL значение, значит не все в порядке. Не только в сдл так делается.

nagibator
()
Ответ на: комментарий от nagibator

Я про это и спрашиваю. Как протестировать эту ветку алгоритма? Как искусственно создать условия, в которых SDL_Init() успешно выполнится, но окно будет создать невозможно?

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

Как искусственно создать условия, в которых SDL_Init() успешно выполнится, но окно будет создать невозможно?

У меня на ARM девайсе с OpenGL ES SDL_Init отрабатывает, а SDL_CreateWindow фэйлится. SDL был собран с поддержкой OpenGL(но без OpenGL ES). А вообще тебе правильно посоветовали - кури сырцы.

Хотя я не понимаю если честно вопроса - тебе что, от этой проверки хуже будет? Если API предполагает, что может быть возвращен NULL - лучше эту ситуацию обработать.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 2)

Может ли в реальности быть такая ситуация, что SDL успешно инициализировался, а окно создать не может?

Вполне. В случае использования X Window в SDL_Init происходит открытие соединения с X сервером через XOpenDisplay, а в SDL_CreateWindow делается вызов XCreateWindow, а он может зафейлиться даже при условии успешного открытия соединения с сервером.

endeneu13
()

Может ли в реальности быть такая ситуация, что SDL успешно инициализировался, а окно создать не может? Как воспроизвести?

Само собой. Сам когда-то собирал SDL для звука с null-видеодрайвером или что-то типа того. Как раз NULL тут возвращало.

EXL ★★★★★
()
Ответ на: комментарий от CYB3R

Никак наверное. Но у меня падало при создании окна, так что проверка там не лишняя.

FIL ★★★★
()

Если код не плоская простыня, как у тебя щас (например, поддерджано несколько движков) - вполне может :) Инициализация отдельно видео - это еще не весь SDL. Она может произойти и в другом месте программы (где инициализируется все и сразу)... Или не произойти (и если не произошло - можно отдельно попробовать инициализировать видео - проверка на нуль спасет тебя - или по крайней мере позволит быстро найти где косяк). Особенно если разрешения и флаги не лезут в имеющееся железо (при переносе кода с десктопа на мобилку).

П.С. Хотя, в SDL2 уже два вызова для окна и рендера делать не обязательно - есть же в доках пример инициализации окна и рендера одним вызовом.

https://wiki.libsdl.org/MigrationGuide

SDL_Window *sdlWindow;
SDL_Renderer *sdlRenderer;
SDL_CreateWindowAndRenderer(0, 0, SDL_WINDOW_FULLSCREEN_DESKTOP, &sdlWindow, &sdlRenderer);

Но коды ошибок и инициализируемые указатели на NULL проверять на каждый чих не вредно (оно авторами SDL прямо рекомендуется).

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

Хотя я не понимаю если честно вопроса - тебе что, от этой проверки хуже будет?

Может, опу лень писать проверки :) Ну и спрятал бы их в макрос, как в тех же примерах делают.

slackwarrior ★★★★★
()

Зачем нужна проверка на (window == NULL)?

Затем, что инициализация != созданию окна.

andreyu ★★★★★
()
Ответ на: комментарий от slackwarrior

Может, опу лень писать проверки

А потом люди удивляются, откуда берутся segfault-ы и null pointer dereference :-)

Pinkbyte ★★★★★
()

В иксах достаточно сделать env DISPLAY= ./MySDLApplication, чтобы получить эту ошибку.

anonymous
()
Ответ на: комментарий от CYB3R

батя твой тоже случайно. а нам теперь терпеть

anonymous
()
Ответ на: комментарий от anonymous

На openbsd играют? Что за изощренный мазахизм?
Да и должно оно там быть, так же как и на FreeBSD.

FIL ★★★★
()
Последнее исправление: FIL (всего исправлений: 1)
Ответ на: комментарий от anonymous

SFML, Allegro, Cocos2d, LÖVE, Pyglet, только не сабжевый копролит.

Что за бред? У половины той хрени, что ты перечислил, бэкенд в Linux как раз на SDL и идёт.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от anonymous

Потому что лучше этой VALVe'овской библиотеки так ничего и нету. Своеобразный DirectX в POSIX-совместимых (и не только) системах.

EXL ★★★★★
()
Ответ на: комментарий от anonymous

Внезапно, на устройство, на котором вертится Linux SDL достаточно элементарно переносится. В отличие от иксанутой allegro, например.

За примерами далеко ходить не нужно: SDL работает даже на допотопных Linux'овых девайсах, типа Motorola A1200/E6/Z6/ZN5 или GP2X, GCW Zero, Dingoo. А SDL2 имеет поддержку Android OS и iOS.

Так что с уверенностью можно сказать, что SDL, как Doom, можно портировать на любую микроволновку.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

Что за бред? У половины той хрени, что ты перечислил, бэкенд в Linux как раз на SDL и идёт.

Какую половину ты имеешь в виду? Или так, в лужу пёрнул? SDL использует только LÖVE, и то не для отрисовки.

anonymous
()
Ответ на: комментарий от anonymous

Ещё один юродивый. С пустой переменной DISPLAY не будет инициализирован SDL.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от anonymous

А что нужно использовать?

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от anonymous

SFML

C++. Говно.

Allegro

Этот, конечно, неплох, но какой-то не очень прогрессивный.

Cocos2d

Python, Objective-C, C++. Всё говно.

LÖVE

Lua, что, конечно, не очень плохо. Сойдёт.

Pyglet

Python. Говно.

А вот SDL хорош.

CYB3R ★★★★★
() автор топика
 cd  /tmp ; apt-get source libsdl2
 cd  /tmp/libsdl2*/src/video
 vim SDL_video.c ++1208
Dron ★★★★★
()
Ответ на: комментарий от anonymous

Потом дам ссылку на гитхаб в качестве вброса.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от Mixail

Годно, писал на нём. Смутило только то, что принудительно нужно использовать OpenGL, нет ничего попроще.

CYB3R ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.