Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с объектами DirectX / 5 сообщений из 5, страница 1 из 1
30.11.2021, 21:54
    #40116316
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с объектами DirectX
Наткнулся в одном проекте на такой код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
    FD3DDevice: IDirect3DDevice9;
    FID3DXFont: ID3DXFont;
    FD3DVB: IDirect3DVertexBuffer9;
    FD3DIB16: IDirect3DTexture9;
    FID3DSurface: IDirect3DSurface9;

procedure Init;
begin
  D3DXCreateFont(FD3DDevice, FFont.Handle, FID3DXFont);
  FD3DDevice.CreateVertexBuffer(C_COUNT_POINT_VERTEXBUFFER_MIN *
    SizeOf(TCUSTOMVERTEX), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX,
    D3DPOOL_DEFAULT, FD3DVB, nil);
  CreateTexture(C_WIDTH_TEXTURE_DIB16, C_HEIGHT_TEXTURE_DIB16, 0, 0,
    D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, FD3DIB16, nil);
  FD3DDevice.GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, FID3DSurface);
end;

procedure CleanUp;
begin
  if Assigned(FID3DXFont) then
  begin
    FID3DXFont._Release;
    FID3DXFont := nil;
  end;
  if Assigned(FD3DIB16) then
  begin
    FD3DIB16._Release;
    FD3DIB16 := nil;
  end;
  if Assigned(FD3DVB) then
  begin
    FD3DVB._Release;
    FD3DVB := nil;
  end;
  if Assigned(FID3DSurface) then
  begin
    FID3DSurface._Release;
    FID3DSurface := nil;
  end;
end;

Вопрос: CleanUp написан правильно? Или явный вызов _Release это ошибка? _AddRef явно нигде не вызывается. Direct3D объекты не требуют же дополнительного _Release?

Код похож на Copy-Paste из С++

С уважением, Vasilisk
...
Рейтинг: 0 / 0
01.12.2021, 11:29
    #40116407
Соколинский Борис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с объектами DirectX
_Vasilisk_, ошибка.
Точнее заплатка дурацкой фичи компилятора дельфей делать скрытые ссылки для интерфейсных переменных.
Видимо если это убрать при завершении приложения будет AV из-за того что библиотеки уже выгружены, а ссылки остались.
Да и заплатка так себе, ничего не гарантирует.
...
Рейтинг: 0 / 0
01.12.2021, 14:14
    #40116435
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с объектами DirectX
Соколинский Борис
Видимо если это убрать при завершении приложения будет AV из-за того что библиотеки уже выгружены, а ссылки остались.
Так достаточно оставить
Код: pascal
1.
Obj := nil;

Тогда это была бы заплатка. А явный _Release тут не пойми откуда
...
Рейтинг: 0 / 0
01.12.2021, 14:47
    #40116447
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с объектами DirectX
Нашел в древних исходниках старую реализацию и соседний метод
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
procedure Cleanup;
begin
  if Assigned (FID3DXFont) then begin
    try
      FID3DXFont._Release;
      FID3DXFont := nil;
    except
    end;
  end;
  if Assigned (FD3DIB16) then begin
    try
      FD3DIB16._Release;
      FD3DIB16 := nil;
    except
    end;
  end;
  if Assigned (FD3DIB32) then begin
    try
      FD3DIB32._Release;
      FD3DIB32 := nil;
    except
    end;
  end;
  if Assigned (FD3DIB64) then begin
    try
      FD3DIB64._Release;
      FD3DIB64 := nil;
    except
    end;
  end;
  if Assigned (FD3DVB) then begin
    FD3DVB._Release;
    FD3DVB := nil;
  end;
  if Assigned (FID3DSurface) then begin
    FID3DSurface._Release;
    FID3DSurface := nil;
  end;
end;

function DestroyDevice : boolean;
begin
  if Assigned (FID3DXFont) then begin
    try
//       FD3DDevice._Release;
      FFont.Free;
      FID3DXFont:=nil;
    except
    end;
  end;
  if Assigned (FD3DDevice) then begin
    try
//       FD3DDevice._Release;
      FD3DDevice:=nil;
    except
    end;
  end;
  if Assigned (FD3D) then begin
    try
//      FD3D._Release;
      FD3D := nil;
    except
    end;
  end;
  Result:=true;
end;

Пустые except секции намекают, что что-то происходило не так, а в DestroyDevice уже сообразили, что лишний
...
Рейтинг: 0 / 0
01.12.2021, 17:13
    #40116485
Sapersky
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с объектами DirectX
Да вроде всегда всё уничтожалось присвоением nil.
_Release - наверное, действительно калька с Си.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с объектами DirectX / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]