Актуальность исследования заключается в том, что стандартный язык программирования С++ является популярным [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.Список используемых источников
Сplusplus http://www.cplusplus.com/reference/cstdio/fopen/
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
Wikipedia https://ru.wikipedia.org/wiki/C%2B%2B
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
Wikipedia https://ru.wikipedia.org/wiki/SFML
Wikipedia https://ru.wikipedia.org/wiki/DirectX
Wikipedia https://ru.wikipedia.org/wiki/OpenGL
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
X-Ray (движок) https://github.com/OpenXRay/xray-16/tree/dev/src/xrCore
Основы С ++ http://lib.slon.pp.ru/programming/c++.pdf
C++: базовый курс Оригинальное название: C++ from the Ground Up Третье издание Автор: Герберт Шилдт Издательство: Вильямс Год: 2008
Технология программирования на C++. Win32 API-приложения Автор: Н. А. Литвиненко Издательство: БХВ-Петербург Год: 2010, http://forcoder.ru/bestbooks/cpp
Центр для разработки 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