diff --git a/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html b/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html index 489eed04d..c093eb42e 100644 --- a/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html +++ b/InstallerSamples/OpenGL и OpenCL/Гайд по использованию OpenGL и OpenCL.html @@ -1042,7 +1042,7 @@ MyProc(default(gl_buffer));
Многие параметры подпрограмм в исходных библиотеках принимают перечисления (enum'ы).
Перечисления, как и имена, это числа. Но в отличии от имён - перечисления принимают заданные заранее константные значения.
В качестве примера:
-procedure gl.BeginQuery(target: QueryTarget; id: QueryName);
+procedure gl.BeginQuery(target: QueryTarget; id: gl_query)
Параметр target принимает одно из значений, сгрупированных в записи QueryTarget:
QueryTarget = record
@@ -1087,8 +1087,8 @@ gl.BeginQuery(QueryTarget.VERTICES_SUBMITTED, name);
procedure gl.Clear(mask: ClearBufferMask);
gl.Clear(
- ClearBufferMask.COLOR_BUFFER_BIT + // очистка поверхности рисования одним цветом
- ClearBufferMask.DEPTH_BUFFER_BIT // очистка буфера глубины - обязательна при рисовании 3D
+ ClearBufferMask.COLOR_BUFFER_BIT + // Очистка поверхности рисования одним цветом
+ ClearBufferMask.DEPTH_BUFFER_BIT // Очистка буфера глубины - нужна при рисовании 3D
);
@@ -1102,12 +1102,18 @@ gl.BeginQuery(QueryTarget.VERTICES_SUBMITTED, name);
По нажатию точки после cl вам так же покажет список всех функций в ядре OpenCL.
-С OpenGL немного сложнее: в каждом контексте у каждой подпрограммы может быть свой адрес.
-Поэтому подпрограммы надо получать в зависимости от контекста. В модуле OpenGL это реализовано так:
+С OpenGL немного сложнее:
+
+- В каждом контексте у каждой подпрограммы может быть свой адрес.
+- Получение адреса подпрограммы выглядит по-разному на разных платформах.
+
+В модуле OpenGL это реализовано так:
//ToDo Создание контекста и привязка его к текущему потоку
// Все адреса и экземпляры делегатов создаются в конструкторе
-var gl := new OpenGL.gl;
+// В "<>" указывается имя платформы
+// Можете написать "Pl" и нажать Ctrl+пробел, чтоб получить список платформ
+var gl := new OpenGL.gl<PlWin>;
while true do
begin
@@ -1123,25 +1129,26 @@ end;
У каждого расширения есть свой класс. К примеру, так используется расширение GL_AMD_debug_output:
//ToDo Опять же, сначала контекст
-var glDebugOutputAMD := new OpenGL.glDebugOutputAMD;
+var glDebugOutputAMD := new OpenGL.glDebugOutputAMD<PlWin>;
...
glDebugOutputAMD.DebugMessageEnableAMD(...);
-В модуле OpenGL так же есть особые классы, wgl и gdi:
+В модуле OpenGL так же есть особые классы, wgl, gdi и glx:
gdi содержит несколько методов библиотеки gdi32.dll. На этой библиотеке основано всё в System.Windows.Forms.
-Подпрограммы включённые в класс gdi - это то что может понадобиться вам чтоб настроить и подготовить форму для рисования на ней с помощью OpenGL.
+Подпрограммы включённые в класс gdi - это то, что может понадобиться вам, чтоб настроить и подготовить форму для рисования на ней с помощью OpenGL.
-wgl содержит методы для работы с OpenGL на Windows. Для других ОС есть класс glX, но он сейчас выключен из релиза.
-Это потому, что у меня нет компьютера, на котором установлена не_Windows, а значит я не могу
-заняться тестированием чтоб узнать как правильно объявлять всё в этом классе. Если у вас есть
-другая ОС и вы хотите помочь мне разобраться - пожалуйста, свяжитесь со мной (желательно в issue).
+wgl содержит методы для подключения OpenGL к окну Windows.
+
+glx содержит методы для подключения OpenGL к окну XWindow.
Оба этих класса работают как класс cl, то есть им не надо создавать экземпляр.
-И последнее что вам надо знать об этих классах: Если вы получаете NullReferenceException:
+И последнее что вам надо знать об этих классах:
+Если вы получаете NullReferenceException,
+при попытке вызова функции из инициализируемых классов, как gl:
Скорее всего вы попытались вызвать подпрограмму, которой нет в реализации библиотеки на вашем компьютере.
Проверьте версию библиотеки, или, если это подпрограмма из расширения - проверьте существование у вас этого расширения.
@@ -1826,10 +1833,16 @@ begin
d.DynamicInvoke(5); // вообще .DynamicInvoke это очень медленно
var p: integer->();
-// var p: Action<integer>; // такое же объявление как на предыдущей строчке, но в другом стиле
+ // Такое же объявление как на предыдущей строчке, но в другом стиле
+// var p: Action<integer>;
+ // И ещё один стиль. Этот особенный, потому что
+ // он неявно создаёт новый тип делегата
+// var p: procedure(i: integer);
p := p1;
- p(5); // типизированные делегаты можно вызывать быстрее и проще, так же как обычные подпрограммы
+ // Типизированные делегаты можно вызывать быстрее и проще,
+ // так же как обычные подпрограммы
+ p(5);
end.
@@ -1863,7 +1876,7 @@ end.
cl.SetEventCallback вызывает свой коллбек тогда, когда посчитает нужным (но обычно после того как вызов cl.SetEventCallback завершился);
-Делегаты - это классы. И на самом деле кроме самого адреса хранят ещё много всякой информации (как типы параметров);
+Делегаты - это классы.
Сборщик мусора распоряжается памятью классов и удаляет их, тоже когда посчитает нужным.
@@ -1874,9 +1887,9 @@ end.
Если сборщик мусора удалит делегат, а затем .dll попытается его вызвать -
это приведёт или к ошибке доступа, или к моментальному беззвучному вылету.
Чтоб запретить сборщику мусора удалять делегать - нужно создать GCHandle, привязанный к нему.
-Но в отличии от массивов - GCHandleType.Pinned не нужно, потому что сборщик мусора может перемещать
-в памяти данные о параметрах делегата, но не сам адрес (а он единственное что передаётся в .dll).
-Это потому что адрес хранится в виде указателя на неуправляемый код.
+Но в отличии от массивов - GCHandleType.Pinned не нужно, потому что сборщик мусора
+не может перемещать адрес исполняемого кода (а он единственное что передаётся в .dll).
+Это потому, что этот адрес хранится в виде указателя на неуправляемый код.
uses System.Runtime.InteropServices;
uses System;
uses OpenCL;
@@ -1889,8 +1902,8 @@ begin
Writeln($'{ev} перешёл в состояние {st}');
- // в данном случае освобождать GCHandle станет можно тогда, когда делегат 1 раз выполнится,
- // а значит очень удобно поставить освобождение в конец самого делегата
+ // В данном случае освобождать GCHandle станет можно тогда, когда делегат 1 раз выполнится,
+ // А значит очень удобно поставить освобождение в конец самого делегата
gc_hnd.Free;
end;
gc_hnd := GCHandle.Alloc(cb);
diff --git a/InstallerSamples/OpenGL и OpenCL/Справка OpenGLABC.html b/InstallerSamples/OpenGL и OpenCL/Справка OpenGLABC.html
index 5e1265767..73fecc8bb 100644
--- a/InstallerSamples/OpenGL и OpenCL/Справка OpenGLABC.html
+++ b/InstallerSamples/OpenGL и OpenCL/Справка OpenGLABC.html
@@ -878,7 +878,7 @@ window.onload = ()=>{
ToDo модуль OpenGLABC пока что не существует. Когда то он появится, но пока что есть только это сообщение.
Если хотите понять, было ли это сообщение оставлено тут 10 лет назад и забыто - вот дата, когда автор сообщения последний раз прочитал его:
-03.08.2020
+2021.01.05