>[оверквотинг удален]
> и при том постоянно, как я погляжу. увы.
>> Угу, бесполезное, когда ты делаешь проект который весит не хило.
>> А когда твоя цель чем меньше тем лучше ?
>> ( значит все кто делает 64k демки занимаются бесполезными делами ?? )
> да сколько угодно «переписывай хидеры от библиотек» — размер от этого ни
> разу не поменяется. ты просто не знаешь, что такое «хидер», видимо.
>> там за каждые байт бьёшся.. и юзать стандартные хидеры очень не выгодно
>> становится…
> ну-ка, ну-ка: таки я хочу знать, как от «переписывания хидеров» меняется размер
> — при том, что на саму библиотеку это никак не влияет. а вот представьте себе
меняются, пишу обычно на pascal(delphi 2010, free pascal (Win/Linux) ) компиляторах, и иногда gcc под Linux и Win32..
почитайте как идёт инициализация OpenGL.
Подцепление процедур идёт динамически
{$IFDEF LINUX}
const
RTLD_LAZY = $001;
RTLD_NOW = $002;
RTLD_BINDING_MASK = $003;
// Seems to work on Debian / Fedora
LibraryLib = {$IFDEF Linux} 'libdl.so.2'{$ELSE} 'c'{$ENDIF};
function dlopen(Name: PAnsiChar; Flags: LongInt): Pointer; cdecl; external LibraryLib name 'dlopen';
function dlclose(Lib: Pointer): LongInt; cdecl; external LibraryLib name 'dlclose';
function dlsym(Lib: Pointer; Name: PAnsiChar): Pointer; cdecl; external LibraryLib name 'dlsym';
{$ENDIF}
function xLoadLibrary(Name: PChar): Pointer;
begin
{$IFDEF WIN}
Result := Pointer(LoadLibrary(Name)); {$else}
Result := dlopen(Name, RTLD_LAZY);
{$ENDIF}
end;
function xFreeLibrary(LibHandle: Pointer): Boolean;
begin
{$IFDEF WIN}
Result := FreeLibrary(HMODULE(LibHandle)); {$ELSE}
Result := dlclose(LibHandle) = 0;
{$ENDIF}
end;
function xGetProcAddress(ProcName: PAnsiChar; LibHandle: Pointer = nil): Pointer;
begin
Result := nil;
{$IFDEF WIN}
Result := GetProcAddress(HMODULE(LibHandle), ProcName);
if result <> nil then exit;
if Addr(wglGetProcAddress) <> nil then Result := wglGetProcAddress(ProcName);
{$ELSE}
if Addr(glXGetProcAddress) <> nil then Result := glXGetProcAddress(ProcName);
if result <> nil then exit;
if Addr(glXGetProcAddressARB) <> nil then Result := glXGetProcAddressARB(ProcName);
if result <> nil then exit;
end;
Result := dlsym(LibHandle, ProcName);
{$ENDIF}
end;
function InitOpenGL(LibName, GLULibName: String): Boolean;
begin
Result := False;
GLHandle := xLoadLibrary(PChar(LibName));
GLUHandle := xLoadLibrary(PChar(GLULibName));
if (GL_LibHandle <> nil) then begin
{$IFDEF WIN}
wglCopyContext := xGetProcAddress('wglCopyContext');
wglCreateLayerContext := xGetProcAddress('wglCreateLayerContext');
wglCreateContext := xGetProcAddress('wglCreateContext');
wglDeleteContext := xGetProcAddress('wglDeleteContext');
wglDescribeLayerPlane := xGetProcAddress('wglDescribeLayerPlane');
wglGetCurrentContext := xGetProcAddress('wglGetCurrentContext');
wglGetCurrentDC := xGetProcAddress('wglGetCurrentDC');
wglGetLayerPaletteEntries := xGetProcAddress('wglGetLayerPaletteEntries');
wglGetProcAddress := xGetProcAddress('wglGetProcAddress');
wglMakeCurrent := xGetProcAddress('wglMakeCurrent');
wglRealizeLayerPalette := xGetProcAddress('wglRealizeLayerPalette');
wglSetLayerPaletteEntries := xGetProcAddress('wglSetLayerPaletteEntries');
wglShareLists := xGetProcAddress('wglShareLists');
wglSwapLayerBuffers := xGetProcAddress('wglSwapLayerBuffers');
wglSwapMultipleBuffers := xGetProcAddress('wglSwapMultipleBuffers');
{$ELSE}
// GLX_VERSION_1_4 (needs to be first)
glXGetProcAddress := xGetProcAddress('glXGetProcAddress', nil, True);
// GLX_ARB_get_proc_address (also needs to be first)
glXGetProcAddressARB := xGetProcAddress('glXGetProcAddressARB', nil, True);
glXChooseVisual := xGetProcAddress('glXChooseVisual');
glXCopyContext := xGetProcAddress('glXCopyContext');
glXCreateContext := xGetProcAddress('glXCreateContext');
glXCreateGLXPixmap := xGetProcAddress('glXCreateGLXPixmap');
glXDestroyContext := xGetProcAddress('glXDestroyContext');
........
А это просто инициализация самого OpenGL..
а теперь представим что я пошёл стандартные ф-и и расширения читать ?
например если мне нужен occlusion query ???
procedure Read_occlusion_query;
begin
glGenQueriesARB := xGetProcAddress('glGenQueriesARB');
glDeleteQueriesARB := xGetProcAddress('glDeleteQueriesARB');
glIsQueryARB := xGetProcAddress('glIsQueryARB');
glBeginQueryARB := xGetProcAddress('glBeginQueryARB');
glEndQueryARB := xGetProcAddress('glEndQueryARB');
glGetQueryivARB := xGetProcAddress('glGetQueryivARB');
glGetQueryObjectivARB := xGetProcAddress('glGetQueryObjectivARB');
glGetQueryObjectuivARB := xGetProcAddress('glGetQueryObjectuivARB');
end;
Много да ?
Каждый вызов xGetProcAddress жрёт байты...
Так что не нужно меня за нубьё считать, я знаю что такое хидеры, сам их писал для своего движка 1000 раз.
на сях загрузка таже =)
>> Простой пример:
>> Загрузка OpenGL может быть сделана целиком
> это как это?
А вот так вот как представлено выше, можно грузить частично можно целиком.
>> и мы получим доступ ко всем
>> его функциям, но они то нам и не нужны, размер зря
>> увеличился, а увеличился он на 70-80кб у пустого окна…
> у тебя какой-то очень больной компилятор, коли не умеет выцеплять только нужное.
> попробуй какой-нибудь современный компилятор — будешь приятно удивлён.
Угу тут компилятор современный то поможет, прям на все 100%....
выциплять как видать то нечего.
>> так что вы не правы друг мой, что это бесполезное дело =)
> бесполезное.
угу очень прям бесполезное, что кб так и хотят сократиться =)
надеюсь такой немного расширенный ответ удовлетворит вас мой друг ?