III Международный конкурс
научно-исследовательских и творческих работ учащихся
«СТАРТ В НАУКЕ»
 
     

СЕМЕЙСТВО «МЕДВЕЖЬИ»
Соболевский И.В.
Автор работы награжден дипломом победителя второй степени
Диплом школьника      Диплом руководителя
Текст научной работы размещён без изображений и формул.
Полная версия научной работы доступна в формате PDF


1. Введение

Актуальность исследования заключается в том, что стандартный язык программирования С++ является популярным [1], но многие инструменты в С++ устарели из-за многослойных обновлений языка [2]. Поэтому в наши дни большинство разработчиков для своего программного обеспечения создают свои инструменты, которые должны облегчить работу при программирование.

Цель исследования состоит в сравнении стандартных и авторских библиотек в С++.

Объектом исследования является язык программирования С++. Предмет исследования - библиотеки используемые при работе на языке программирования С++.

Была выдвинута гипотеза, что “Семейство медвежьи” облегчает работу на С ++.

В данной работе применялись методы эмпирического уровня: тестирование, сравнение; экспериментального уровня: анализ; теоретического уровня: изучение и обобщение, абстрагирование.

Исследование проводилось в три этапа. Первый этап – изучение видов инструментов, используемых в работе языка программирования С++“ и инструментов «Семейство медвежьи”. Мною был самостоятельно изучен язык программирования С ++, с помощью книг и интернетных публикаций. При программировании на данном языке у меня возникли трудности, неудобства в использовании некоторых инструментов, поэтому я решил разработать свои инструменты, которые я назвал «Семейство медвежьи», для облегчения программирования. Второй этап - сравнение, с помощью тестирования данных инструментов С ++ и инструментов «Семейство медвежьи». Третий этап - анализ полученных результатов, составление рекомендаций по возможности замены стандартных инструментов на инструменты «Семейство медвежьи».

Основным результатом исследования стало подтверждение выдвинутой гипотезы. “Семейство медвежьи” облегчает работу на С++. Данные инструменты менее объемные, уменьшают время при написании программ.

Яркие примеры программирования: Epic Game(Unreal Engine), GSC Game World(Stalker) [3] и т.д., но если в С++ инструментах не всё так плохо, то в графических и звуковых инструментах всё намного сложней.

В настоящее время много операционных систем и разработчики, которым требуется графическая библиотека, попадают в сложную ситуацию, когда на каждую платформу нужна своя графическая библиотека, будь то Directx [4], или OpenGL [5] или другие разные версии этих библиотек и не все версии графических библиотек поддерживаются у клиентов. Принцип один и тот же, но код этих библиотек различный, из-за чего разработчики пишут свою библиотеку, которая объединяет одним кодом все графические библиотеки.

Существуют операционные системы которые поддерживают одну графическую библиотеку, есть те, которые поддерживаются только на движке, есть которые просто устарели, но большинство из них не раскрывают всю полноту и возможности графики.

В звуковых библиотеках всё намного прощё, но все же иногда тоже возникают проблемы.

2. Основная часть

2.1. Изучение видов инструментов, используемых в работе языка программирования С++“ и инструментов «Семейство медвежьи”

Рассмотрим бесплатные и общедоступные инструменты.

Первый инструмент, который мы рассмотрим это boost [6]. Он тяжелый инструмент (по размеру данных, по количеству классов), там есть много чего полезного, но многие сталкивались с такой проблемой, когда какая-нибудь библиотека, требующая этот boost, выдавала ошибки [7], так как возникали проблемы связанные с несовместимостью версий, из-за чего большинство разработчиков не используют данный инструмент в своей работе.

Другой инструмент sfml - библиотека имеет неплохую популярность. Она даёт много 2d инструментов, но не более и поддерживает только OpenGL [8].

Теперь рассмотрим инструмент «Семейство Медвежьи». Сам инструмент разделён на динамические библиотеки: BearCore – ядро, основные компоненты и BearGraphics - работа с графикой.

Давайте рассмотрим сам инструмент BearCore – ядро, из чего он состоит. (Приложение 1). Это типы данных; классы Compression; сжатие Config; информация Debug; отладка IO-Input/Output; Tools-Инструменты; Memory-Память; Net-Сеть; Parser-Декодеры; файлы (Таблица 1)

Таблица 1. Файлы BearCore

BearAlgorithm.h

В этом файле алгоритмы для работы с массивами.

BearFunction.h

В этом файле находятся инструменты для работы с функциями.

BearRepeatImport.h

Инструмент для повторение включений одного и того же файла для построение классах или функций

BearCore.hpp

Включение всех файлов библиотеки.

BearCoreForMain.hpp

Включение всех файлов библиотеки для главного файла исходного кода, где находится функция int32 BearMain();

BearGraphics – графика состоит также из классов и RHI - для динамических библиотек (Приложение 2).

2.2. Сравнение, с помощью тестирования данных инструментов.

Сравнение возможностей стандартных инструментов в С ++ и BearCore после тестирования приведены в таблицах сравнения (Таблица 2., Таблица 3.). Сравнение по объему написания программы (Таблица 4.).Сравнение по времени написания программ в графической библиотеке представлено в виде диаграммы (Диаграмма 1.).

Таблица 2.

Возможности BearCore

+ и -

Стандартные

+ и -

Работа с памятью

Есть отладка проверка на утечку,

выделение

 

Выделение

Редактор текста

Удалять

Заменить

Найти

Конвертировать

 

Нет возможности конвертировать и

заменить

Редактор файлов

Всё в одном классе

Много гибких инструментов

 

Большинство конвертаций приходиться делать в ручную

Таблица 3.

Возможности BearGraphics

+ и -

Стандартные

+ и -

Работа с текстурами

Редактор текстур

Поддержка:dds png jpg bmp

Есть разные режимы

цветовых каналов.

Поддержка mip levels

Sfml

Не поддерживает mip levels

Только один цветовой канал:RGBA

Работа с моделями

Поддержка:obj,

object(x-ray)

ogf(x-ray)

fbx

Sfml

Отсутствует

Разные графические библиотеки

Directx11

OpenGL 4

Directx10

Sfml

Только opengl

Диаграмма 1. Сравнение по времени написания программ в графической библиотеке

Таблица 4. Сравнение по объему написания программы.

Стандартная (Поиск файлов)

BearCore (Поиск файлов)

BOOL SearchFiles(LPCTSTR lpszFileName, LPSEARCHFUNC lpSearchFunc, BOOL bInnerFolders = TRUE)

{

LPTSTR part;

char tmp[MAX_PATH]; // временный массив

char name[MAX_PATH];

HANDLE hSearch = NULL;

WIN32_FIND_DATA wfd;

memset(&wfd, 0, sizeof(WIN32_FIND_DATA));

// сначало поиск внутри вложенных папках ...

if(bInnerFolders)

{

if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) return FALSE;

strcpy(name, part);

strcpy(part, "*.*");

// если папки существуют, то делаем поиск

wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;

if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE))

do

{

// в каждой папке есть две папки с именами "." и ".."

// и эти папки мы не трогаем

// пропускаем папки "." и ".."

if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2))

continue;

if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если мы нашли папку

{

char next[MAX_PATH];

if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE;

strcpy(part, wfd.cFileName);

strcat(next, "");

strcat(next, name);

SearchFiles(next, lpSearchFunc, TRUE);

}

}

while (FindNextFile(hSearch, &wfd)); // ищем следующий файл

FindClose (hSearch); // заканчиваем поиск

}

if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE)

return TRUE; // в противном случае выходим

do

if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // если мы нашли файл

{

char file[MAX_PATH];

if(GetFullPathName(lpszFileName, MAX_PATH, file, &part) == 0) return FALSE;

strcpy(part, wfd.cFileName);

lpSearchFunc(file);

}

while (FindNextFile(hSearch, &wfd)); // ищем следующий файл

FindClose (hSearch); // заканчиваем поиск

return TRUE;

}

static void BearFileStream::FindFiles(BearList &list,const bchar path, const bchar fileextension,bool allpath=true, bool all=true) ;

3. Заключение

“Семейство медвежьи” облегчает работу на С++, менее объемное, уменьшение времени при написании программ.

В «Семейство медвежьи» массив и ассоциативный массив почти не имеет разницу между стандартным в С++ (std::vector и std::map), но редактор текста и файловая система имеют большую разницу. В С++ работа с файлами расположена по классам и файлам, что предоставляет неудобство при работе, например редактор файла находится в [9] , а поиск в [10], а в «Семейство медвежьи» всё (создание, удаление, поиск, переименование, папки, загрузка и сохранение) в одном классе. Все программисты на С++ знают std::ofstream и std::ifstream, но мало кто ими пользуется, они не популярны [11]. Популярность имеет или fopen. В «Семейство медвежьи» инструмент для записи или считывания файла рассчитаны по большей части для работы с бинарными файлами (Приложение 3). Также инструменты «Семейство медвежьи» облегчают работу с клавиатурой (Приложение 4.). Как было сказано ранее, графические библиотеки очень сложный инструмент и «Семейство медвежьи» как и другие инструменты по графики очень сильно упрощают работу с графикой. Например: функция создание текстуры. (Приложение 5.).

Рекомендации по работе с графикой на С ++.

При работе на языке программирования С++ рекомендую использовать инструменты «Семейство медвежьи», BearCore и BearGraphics, так как они менее объемны, удобны в использовании и менее затратные по времени.

4.Список используемых источников

  1. Сplusplus http://www.cplusplus.com/reference/cstdio/fopen/

  2. Github https://github.com/luabind/luabind/issues/31, https://github.com/OpenXRay/xray-16/blob/dev/src/xrCore/LocatorAPI.cpp, https://github.com/SFML/SFML/blob/master/src/SFML/System/FileInputStream.cpp

  3. Wikipedia https://ru.wikipedia.org/wiki/C%2B%2B

  4. Wikipedia https://ru.wikipedia.org/wiki/C%2B%2B#.D0.A1.D0.B8.D0.BD.D1.82.D0.B0.D0.BA.D1.81.D0.B8.D1.81

  5. Wikipedia https://ru.wikipedia.org/wiki/SFML

  6. Wikipedia https://ru.wikipedia.org/wiki/DirectX

  7. Wikipedia https://ru.wikipedia.org/wiki/OpenGL

  8. Wikipedia https://ru.wikipedia.org/wiki/Boost#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.87.D0.B0.D0.BD.D0.B8.D1.8F

  9. X-Ray (движок) https://github.com/OpenXRay/xray-16/tree/dev/src/xrCore

  10. Основы С ++ http://lib.slon.pp.ru/programming/c++.pdf

  11. C++: базовый курс Оригинальное название: C++ from the Ground Up Третье издание Автор: Герберт Шилдт Издательство: Вильямс Год: 2008

  12. Технология программирования на C++. Win32 API-приложения Автор: Н. А. Литвиненко Издательство: БХВ-Петербург Год: 2010, http://forcoder.ru/bestbooks/cpp

  13. Центр для разработки Windows https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa364418(v=vs.85).aspx

Приложение 1.

BearCore - ядро

Типы данных

Тип

Предназначение

Размер

int8

Число

[−127, +127]

uint8

Число

[0,+255]

int16

Число

[−32767, +32767]

uint16

Число

[0, +65535]

int32

Число

[-2147483647, +2147483647]

uint32

Число

[0, +4 294 967 295]

bchar

Символ

В ansi режиме [0,255]

В utf8 режиме [0, 65535]

bchar16

Символ

[0, 65535]

int64

Число

[−9 223 372 036 854 775 807, +9 223 372 036 854 775 807]

uint64

Число

[0, 18 446 744 073 709 551 615]

bptr

Позиция в памяти

В x32 режиме [0, +4 294 967 295]

В x64 режиме [0, 18 446 744 073 709 551 615]

bsize

Размер

В x32 режиме [0, +4 294 967 295]

В x64 режиме [0, 18 446 744 073 709 551 615]

Compression - Сжатие

class BearZlib;

Сжатие данных или разжатие через zlib.

Config - Информация

class BearCommandLine;

Работа с командной строкой.

class BearFileSystem;

Работа файловой системой.

class BearSystem;

Работа с операционной системой.

Debug-Отладка

class BearDebug;

Инструменты отладки.

class BearLog;

Работа с лог файлам.

IO-Input/Output

class BearInput;

Работа с клавиатурой и мышкой .

class BearFileStream;

Работа с файлом или файлами.

class BearPackage;

Работа с архивом .bpk.

class BearPackageFile;

Работа с файлом архива.

class BearReaderBase;

Скелет класса загрузки.

class BearWriterBase;

Скелет класса записи.

Tools-Инструмнты

template < class P> class BearFlags;

Работа с флагами.

class BearFraction;

Математическая дробь.

class BearInclude;

Скелет класса назначение(include) файлов.

template < class P,

typename pr = BearDefaultCompare,

typename sw = BearDefaultSwap>

class BearList;

Массив.

template

class BearMap;

Ассоциативный массив.

class BearMath;

Математические формулы.

class BearString;

Редактор текста.

template

class BearSString;

Статистический редактор текста.

class BearStringBase;

Скелет редактора текста.

class BearThread;

Работа с патокам.

class BearTime;

Переменная времени .

template class BearVectorN

Вектор c N координатами

BearVector2-x,y

BearVector3-x,y,z

BearVector4 -x,y,x1,y1

class BearWindow;

Работа с окном в операционной системе.

Memory-Память

class BearMemory;

Работа с операционной системой.

class BearMemoryStream;

Редактор памяти.

Net-Сеть

class BearIP;

Работа с ip адресом.

class BearNetTcpClient;

Клиент tcp сети.

class BearNetTcpServer;

Сервер tcp сети.

Parser-Декодеры

class BearDynamicLibrary;

Работа с динамическими библиотеками

class BearINI;

Редактор INI фалов

class BearScript;

Язык программирования No Name

class BearXML;

Загрузка XML файлов

Time-Время

class BearLocalTime;

Получения времени.

class BearTimer;

Таймер

Приложение 2.

BearGraphics - графика

Классы и RHI - для динамических библиотек

class BearRHIBuffer;

Скелет класса для создания буфера памяти видеокарты.

class BearRHIDevice;

Скелет управления графической библиотекой.

class BearRHIShader;

Скелет компиляция Shader.

class BearRHIStats;

Скелет настроек.

class BearRHITexture;

Скелет управления текстур.

class BearRHIView;

Скелет Depth Stencil и Depth и Render Target

class BearRHIViewport;

Скелет класса для вывода изображение на экран

Tools-Инструменты.

class BearCamera;

Класс для работы с матрицей камеры.

class BearColor;

Класс

class BearMatrix;

Матрица 4x4

Rendered-Графические инструменты.

class BearBuffer;

Класс для создания буфера памяти видеокарты .

class BearDevice;

Класс для управления графической библиотекой .

class BearShader;

Класс для компиляция Shader.

class BearStats;

Класс для настроек графической библиотеки .

class BearTexture;

Класс для управления текстур.

class BearRHIView;

Класс для управления Depth Stencil и Depth и Render Target

class BearRHIViewport;

Класс для вывода изображение на экран

Resources-Ресурсы .

class BearFont;

Компилятор шрифта.

class BearImage;

Работа с загрузкой разных форматов текстур.

class BearModel;

Работа с моделей.

сlass BearMovies;

Видео проигрыватель.

class BearText;

Класс для прорисовки текста.

Приложение 3.

Стандартное в С++

Семейство медвежьи

FILE *fp;

if ((fp = fopen("test", "rb")) == NULL)

{

printf("He удается открыть файл.n");

exit(1);

}

uint32 a=0;

int32 b=0;

float d=0;

fread(&a, sizeof(uint32),1, fp);

fread(&b, sizeof(int32),1, fp);

fread(&c, sizeof(float),1, fp);

fclose(fp);

BearFileStream test("test");

if (test.eof())

{

printf("He удается открыть файл.n");

exit(1);

}

uint32 a = test.readUint32();

int32 b = test.readInt32();

float c = test.readSingle();

test.close();

Приложение 4.

Стандартное в С++

Семейство медвежьи

int update()

{

bool key_prees[6];

while (isUpdate())

{

bool key_esc=(GetAsyncKeyState(VK_ESCAPE) & 0x8000) != 0;

if (!key_prees[0]&& key_esc)

{

key_prees[0] = true;

break;

}

else if(!key_esc)

{

key_prees[0] = false;

}

bool key_A = (GetAsyncKeyState('A') & 0x8000) != 0;

if (!key_prees[1] && key_A)

{

key_prees[1] = true;

break;

}

else if (!key_A)

{

key_prees[1] = false;

}

bool key_B = (GetAsyncKeyState('B') & 0x8000) != 0;

if (!key_prees[2] && key_B)

{

key_prees[2] = true;

break;

}

else if (!key_B)

{

key_prees[2] = false;

}

}

BearInput in;

while (isUpdate())

{

in.update();

if(in.preesKey(in.Escape))

break;

if(in.preesKey(in.A))

break;

if(in.preesKey(in.B))

break;

draw();

}

Приложение 5.

Стандартное в С++

Семейство медвежьи

D3D11_SHADER_RESOURCE_VIEW_DESC srDesc;

ZeroMemory(&srDesc, sizeof(srDesc));

D3D11_TEXTURE2D_DESC desc;

desc.Width = width1;

desc.Height = height1;

desc.MipLevels = 1;

desc.ArraySize = 1;

desc.Format = flag == DXTT_RenderTarget ? TranslateRenderTargetPixelFormat(px) :TranslatePixelFormat(px);

desc.SampleDesc.Count = 1;

desc.SampleDesc.Quality = 0;

desc.Usage = flag==DXTT_DephtStencil||flag ==DXTT_RenderTarget? D3D11_USAGE_DEFAULT:D3D11_USAGE_DYNAMIC;

desc.BindFlags = flag == DXTT_DephtStencil ?D3D11_BIND_DEPTH_STENCIL:( flag == DXTT_RenderTarget?(D3D11_BIND_RENDER_TARGET| D3D11_BIND_SHADER_RESOURCE): D3D11_BIND_SHADER_RESOURCE);

desc.CPUAccessFlags = flag == DXTT_DephtStencil || flag == DXTT_RenderTarget ?0: D3D11_CPU_ACCESS_WRITE;

desc.MiscFlags = 0;

ID3D11Texture2D* res = 0;

m_px = px;

DX_CHK( device.device->CreateTexture2D(&desc, 0, &res));

texture = res;

width = desc.Width;

height = desc.Height;

count_textures++;

if (flag == DXTT_DephtStencil)return;

srDesc.Format = desc.Format; ;

srDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;

srDesc.Texture2D.MostDetailedMip = 0;

srDesc.Texture2D.MipLevels = 1;

DX_CHK(device.device->CreateShaderResourceView(res, &srDesc, &texture_view));

// FATALERROR1(desc.Height >= 32 && desc.Width >= 32, "Разрешение должно быть не меньше 32x32");

BearTexture texture;

texture.create(PF_R8G8B8, TT_Texture2D, 32, 32);

17