The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Microsoft намерена блокировать сторонние ОС на..."
Отправлено svsd_val, 16-Янв-12 19:00 
>[оверквотинг удален]
> и при том постоянно, как я погляжу. увы.
>> Угу, бесполезное, когда ты делаешь проект который весит не хило.
>> А когда твоя цель чем меньше тем лучше ?
>> ( значит все кто делает 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%....
выциплять как видать то нечего.

>> так что вы не правы друг мой, что это бесполезное дело =)
> бесполезное.

угу очень прям бесполезное, что кб так и хотят сократиться =)

надеюсь такой немного расширенный ответ удовлетворит вас мой друг ?

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру