Обновить
-19

Пользователь

10
Подписчики
Отправить сообщение
Скрытый текст
пещеры
пещеры

я щас вернулся в генерацию мира, предположим мы генерируем мир с шума 2д, тогда наша задача стоит возможность создания пещер в горах, если залететь без коллизии в гору там будет красивый вид, суть пещер, которые на чанках стоят на поверхности чтоб был вход/выход, гора(чем больше тем лучше, а дальше как говорится дело техники), предположим биом или карту местности можно ограничить, и генерировать 2 слоя, тогда мы увидем такое

Скрытый текст
я нашел клевую пещеру и залетел внутрь
я нашел клевую пещеру и залетел внутрь

а мир образно такой

Скрытый текст
вид мира +- на сиде
вид мира +- на сиде

ситуация когда пещера имеет вход и уходит вниз вот тут заключается тоже инженерный поиск как такое организовать

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

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

я после раста перешел обратно в С++, и ....... пишу владение памяти ресурсов(для ресурсов)

если дальше всё спрятать под коробку языка, то на поверхности должен быть ультра понятный язык, тоесть что-то ближайшее к промпту, так как это будущая, возможно нереальная крайность, смею предположить реализации того до чего вы додумались аналог памяти владения pmr (если влезло в хранилище размещаем, если кончилось выделяем блоки, если блоки кончились идём в систему, как-то так) по сути одна и та же проблема, это надо исследовать наверно.... сложно сказать

начинайте смотреть по сторонам иногда просто смотрите на описание языков какие выходят, там есть что в зиг интересное например, может в других еще есть кусочки инсайтов ) потом можно собрать все инсайты воедино и попытаться сделать мега-язык будущего )

тоесть возможно это ada zig mojo odin франкенштейн ) из них я смотрел только зиг лично )

если знаете С вы не ограничены, ставьте при компиляции 23/26 стандарт, используйте структуры, деструкторы, классы, лямбды, помните в С управление памятью например в текстовом редакторе? так вот это можно сварганить на С++, или взяв std::vector, или написав свою обертку дженерика по принципу того управления памятью со всеми вытекающими, по сути С++ в базе даёт просто удобство использования стандартных контейнеров и возможность создания своих контейнеров, вопрос для досуга(напишите функцию на С++, которая понимает где const char[] а где const char*), вы задаёте вопрос по-сути правильный тут главное точно понять зачем мы изобретаем всё заново и для чего.... в С++ всё для этого есть, разве что ждём Send/Receive или качаем либу от Nvidia или еще кого )

отвечая на вопрос, С++ имеет возможность уйти от никоуровневости за счет абстракций/библиотек, или можно написать проект снизу вверх, замиксив асм/симд/С/фишки в С++, которые есть в стандартной библиотеке, например всё теже маллок и тп, так же есть возможность заюзать другие аллокаторы mimalloc jemalloc..., это как фишки зиг, посмотрите язык на досуге, какие там фишки(компил тайм, аллокаторы, симд из коробки удобный, синтаксис визуально сишный, свой билдер, так же можно билдить С/С++ проекты. посмотрите может вам этого достаточно будет)

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

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

а в эпоху где всё перепроверять и zero trust - это практически нереальная миссия....

да ничего, в 3д если вам интересно, можно начинать с базового бвх в нём коробки ААББ(просто визуализируете коробки эти, делаете физику солверов контактов типо, по началу можно инстансом, потом лучше через ссбо), хотя у вас спатиал это делает, просто я смотрел у себя на бвх, задолго до вызода бкс3д, и смотрел без многопотока, ну кароче там по техникам просто вы настроите MDI+SSBO+multithreading там дорожная карта если попутно читать - вникать в gl всё понятно станет... как я считаю(просто когда приступите к прототипу держите в голове что кусок памяти должен быть 1 через MDI, а подгрузка должна быть многопоточной в него, но пока на момент прототипа тестов ElementsDraw хватает, но поитогу если сидеть с профайлером RenderDoc вы поймёте, что еффективнее рисовать без переключений драйвера и накладных расходов, а это MDI+SSBO, или полностью отрисовка в шейдерах всего - но до сюда доходят только те кто реально знает почему ему надо отрисовывать всё в шейдере. www.scratchapixel.com/index.html - тут тоже что-то есть по инфе...)

вообще как я это узнал, просто сделал клон-майнкрафт многопотоковый бесконечный локальный, вот там реально наглядно видно всю технику около ААА(почему около? потомучто это проверка гипотезы, это компиляция техник и управления памятью.... можете делать ответвление в клон майнкрафта, чтобы понять все техники для около идеальной отрисовки) - отсюда ответ откуда я тейкаю за управление памятью - всё дело в том, что я проверял техники эти на Расте просто.... в С++ просто через время, я вернулся, потомучто с указателями попроще жить чтоли если проще выражаться....

ну можно впринципе и в zig смотреть, как вы знаете там аллокаторы не придётся изобретать, кароче у зиг - аллокаторы и симд из каробки удобные...

лично у меня всё вокруг этого закрутилось

Скрытый текст
int main() {
  Window window(" Spatial Grid Visualizer",3,3,800,600);//
  glEnable(GL_DEPTH_TEST);

  // unsigned int brick=;

  Alloca::Ref myAllocator = Alloca::create();
  HashMap<const char*,Texture::Ref> textures(myAllocator);
  TextureCache textureCache(&textures);
  //textureCache.InsertTexture("Brick","assets/texture/brick1.tga");
  textureCache.InsertTexture("Brick","assets/texture/brick1.tga");

  HashMap<const char*, GameObject::Ref> objs2D(myAllocator);
  HashMap<const char*, GameObject::Ref> objs(myAllocator);
  HashMap<const char*, Shader::Ref> shade(myAllocator);

  Camera camera(glm::vec3(0.0f, 1.0f, 10.0f), 45.0f,800.0f,600.0f, 800.0f/600.0f);
  //Quad2D quad2d(1.f,1.f,0.f,0.f);
  Quad3D quad3d(1.f,1.f,0.f,0.f,0.f,Anchor::CENTER);
  Scene scene(&objs, &shade,&objs2D,&camera);

  scene.Add2DObject("Quad0",
      new GameObject(
          new Mesh(quad3d.getVertices(), quad3d.getSizeofVertices(), quad3d.getIndices(), 6),
          textureCache.GetTexture("Brick"),
          Transform3D { glm::vec3(100.0f,100.0f,0.0f),glm::vec3(0.0f),glm::vec3(200.5f) } ) );
  scene.AddObject("Quad1",
      new GameObject(
          new Mesh(quad3d.getVertices(), quad3d.getSizeofVertices(), quad3d.getIndices(), 6),
          textureCache.GetTexture("Brick"),
          Transform3D{ glm::vec3(0.0f),glm::vec3(0.0f),glm::vec3(1.0f) }));

  scene.AddShader("Base", new Shader("assets/shaders/vertex.glsl","assets/shaders/fragment.glsl"));

  while (window.running) {
    SDL_Event event;
    while (SDL_PollEvent(&event)) {
      if (event.type == SDL_QUIT) window.running = false;
      if (event.type == SDL_WINDOWEVENT) {
          if (event.window.event == SDL_WINDOWEVENT_RESIZED) {
              window.updateSize(event.window.data1, event.window.data2);
              scene.camera->UpdateAspect(event.window.data1, event.window.data2,window.getAspect());
          }
      }
    }
    const uint8_t* state = SDL_GetKeyboardState(NULL);
    scene.camera->ProcessKeyboard(state);
    ClearColorWindow();
    scene.Render();
    EnableBlenWindow();
    scene.Render2D();
    DisableBlenWindow();
    window.updateContext();
  }
  return 0;
}

*так как у меня контроль памяти свой, я делаю нью всё равно да) я до конца не изучил этот нюанс, но трекинг памяти работает...

=== СБОРКА В РЕЖИМЕ DEBUG ===
[2/2] Linking app
--- Запуск (Debug) ---
Bytes Allocated: 1049344  Counter Allocs: 2
Bytes Free: 1048576  Counter Free: 1
Add Brick
Bytes Allocated: 1051648  Counter Allocs: 5
Bytes Free: 1049344  Counter Free: 2
Bytes Allocated: 1051648  Counter Allocs: 5
Bytes Free: 1050112  Counter Free: 3
Bytes Allocated: 1051648  Counter Allocs: 5
Bytes Free: 1050880  Counter Free: 4
[Texture] Удалена из GPU, ID: 1
Bytes Allocated: 1051648  Counter Allocs: 5
Bytes Free: 1051648  Counter Free: 5

может кто-то скажет это переусложнение, но уже хз, и вот кстати когда осознал зачем управлять памятью, сразу все книги по С++ пригодились, а до этого реально не понимал, почему всё это надо(небольшой спойлер - всё вокруг управления ресурсами все эти архитектуры, сложный подход в кодинге и пр.)

вообще этот подход классный все пробросы от системы на самом низу, в файле coreSystem.cppm - это реально удобная магия пирога архитектуры, ну да статичная, но пока пофиг, это не мега крутой релиз для бизнеса, это изучать/исследовать десятилетиями...... этот подход тоже интересен ващето

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

переиспользование(архитектура) - будет подразумевать написание своей архитектуры всё равно, чтобы не писать то, что исследовано по новой. от симда не уйти перемножать матрицы быстрее на ней, от BVH/ускоряющейструктуры не уйти, так что как не крути, чтобы приблизиться к вулкану по скорости это gl4.5+, и управление памятью(модули в проекте это просто удобство для создания кода и ускорения компиляции как не крути).

просто если щас у вас 1-5 хакатонов/прототипов/побыстреесделать, вам категорически запрещается думать об этом, скачайте библиотек или анриал енжин с нанитами проку больше будет...

итоги - мои тейки сложно пробить )

~ https://github.com/erincatto/box3d вот получается то*** , что вы хотели частично или движок(Анриал).

*(частично, модули всё еще нужны, другие ускорялки тоже наверно, библиотеки всякие или движки как там всё это организовать ) кароче как не крути путь долгий )...

**ну и еще парочка пейперов придётся почитать, потомучто всё это исследовать проверять надо помимо профилирования...

Какая скорость в итоге

вы показали кстати! 1000-5000, дальше можно отвязаться от stl(vector, hashmap) и попытаться наколбасить своё управление памятью.... я может не прав, но со своим аллокатором(который связан интрузивно с кор подсистемой памяти будет) и подсчетом байт удобнее чем с вектором, но отлаживать гемор(хотя кому как наверно), попробуйте посмотреть в сторону интрузивных счетчиков ссылок, как итог ваши буферы станут чуточку удобнее и тесты можно будет проводить на 10к-100к(тоесть в 3д уходить наверно не знаю в обьём(кубики или другие примитивы, тут я не знаю, но там тоже есть SpatialHashGrid/SpatialGrid/BVH(за счет того что ваши частички вроде не уникальны это можно будет отрисовывать через MultiDrawElementsIndirect закидывая матрицы в ssbo, за 1 вызов типо считайте сами какой прирост...) или еще что поидее)) наверно, плюс можно на С++ наколбасить свой модуль по SIMD(берете спецификацию файла симд по 4.1/4.2 и пишите бинды свои! в модуле именно в модуле .cppm), плавно переходящий в свои расчеты типо.... всё это конечно гемор....

ну и так по мелочи модули(именно модули .cppm). конечно, на любителя, на алгоритмы я последнее время в последнюю очередь смотрю, щас приоритет на архитектуру с кор системы...

Скрытый текст

у меня щас так выглядит все .cppm это модули, и скрипт свой на сборку проекта

классно у вас получается, на реддите видел и походу какую-то вселенную, и такую вселенную (почему бы нет как визуализация контекстов так сказать ) )

building_foundation_for_future_nanite_like_tech/

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

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

если мы говорим о тензорах, то матешу можно свою сделать, главные кирпичики(вектор, строки, хеш-мапа хотябы) типовые делать свои, систему аллокаций свою такая идея, я об этом подумал...

суть в том в таком подходе, что мы делаем как на С в текстовом редакторе, управляем выделением памяти буферов и временем жизни обьектов со своей базовой core-system....

да там и проблема и сложность определенная, но вроде это уже осмысленная структура получится, и не прикручивание вектора сбоку в реализацию тензора типо...

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

why_generally_large_projects_write_their_own

похоже на интрузивный счетчик ссылок потоков тоесть такая сущность шедулер, которая отслеживает использование памяти(или комбо: память+ссылки),в С++, мне это напомнило

кароче даже с интрузивным подходом нужна пачка политик под аллокаторы поидее, там и трекер можно докрутить, а счетчики следят за выходом границ, но за локами поидее всё равно придётся следить, и зачем копировать зомби? сделайте сначала как понимаете наверное, просто понятную архитектуру с понятным трекером памяти + шедулер наверно... пофиг на этот линукс если честно.... )

поидее 2 месяца с агентами это надо считать сколько електроенергии потратили агенты сопоставляя с качеством кода, тоесть, грубо говоря 7 лет команда делает проект, изменяя приходя к какому-то граалю своему, это трата ресурсов так? и ваши 2 месяца, это тоже ресурсы только потраченные ресурсы в виде потери електричества на агентов поидее как я понимаю, может я ошибаюсь, но где-то тут поидее будут тоже интересные наблюдения...

получается первый промпт на агентах даёт около проект, человеку надо в нём разобраться, потестить, чтобы довести до релиза, сопоставляя с командой у которой ушло 7 лет, человек так или иначе спросит у своих агентов, что-то еще, и тут начнётся то самое, что может приблизить потерю к той команде поидее или нет?

или агенты с первого раза без ошибок делают качество, сопоставив с командой 7 лет? да это вайбкод, но именно в таких деталях заключается суть как я понял. ведь если задача была только в каркасе и человек сам способен доделать без агентов код выданный от первого промпта над которым работали агенты 2 месяца, это одно, и если человек после такого промпта опять идёт к агентам это поидее потеря ресурсов или нет?

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

*поидее можно забыть название сниппета, ну тогда можно сделать сниппет на создание файла где сверху, будут продублированы названия сниппетов и их функционал, поидее норм(как типо твой личный кор концепт к файлам и организации, типо тут так, тут так, там так).

если отказаться от std::vector* и реализовать свой итератор с вектором интересно было бы быстрее? наверно не совсем, но если писать свой вектор, своё выделение памяти и свои итераторы в рамках контейнера, как бы тут была скорость, понятно что можно еще шлифануть это всё SIMD наверно.

я не експерт просто посмотрел на код в шапке. я щас как раз тесчу свои контейнеры на своих задачках...

*ну тоесть просто написать свой array с той модной защитой интрузивной + своё выделение.

std::ptrdiff_t поидее можно будет превратить в такой тип указателя и повесить на итератор специфический, если я правильно понимаю. там еще тип тривиал можно будет ускорить поидее, но возможно оно и в стандартном векторе тоже ускоряет... ну вообщем интересно.

наверно, поэтому пока так просто и написано, чтобы не запутаться типо.

https://youtu.be/vXaWOJTCYNg сказ о том, как mojang unit-тесты для себя открыли. Если нужна дата, сами найдете, когда внутри бинарников API появилось.

Это примерно отражает культуру разработки компании. Если считать по таксономии автора, Minecraft до, примерно, 1.13 (2018) пребывал в первой фазе. 1.13 - первая версия, от которой можно смело считать переход на (частичный) data-driven подход. Data packs того же толка нововведения. А отсутствие хоть сколько стабильного modding API чем назвать? Если ядро настолько нестабильно, что даже Forge и т.п. за всё время стабильную прослойку не написали? Кульминацией этого цирка стал Fabric, где захукать чей-то код на свой страх и риск сделали нормой.

но своего примера - своего взгляда не показали!

По-моему автор уже столько всего нагляделся, что остается только покуривать в сторонке и грести вперед к релизу в меру сил. Иными словами - единственно верного подхода не выходит.

так в срезе примеров типо:

вода. тезисы, маркеры слов(игры/технологии/движки) какие-то связующие нюансы не выходящие от, воды.

class A : public B {};

вода. тезисы, маркеры слов(игры/технологии/движки) какие-то связующие нюансы не выходящие от, воды.

---

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

---

был бы пет проект как пример, вы бы могли тоже написать ничего не понятно, а так мы просто читаем перечисление сорофанного радио, что "было бы лучше" - остаётся теорией, оно не подкреплено какими-то примерами конкретными, в этом направлении вектора. а так пока воды больше, напиши вам, что это димагогия, вы напишите, что это не понятно, выдай вам готовый пет-проект с ошибками, вы скорее всего так же продублируете, возможно, тезис, что ничего не понятно.

---

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

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

так правильно это помойму называется димагогия, мы накидываем тезисов, но сути в этом нету, а там где есть конкретика есть какие-то критерии же поидее.

классная у вас идея.

я хочу подмножество Forth from scratch вытащить в С синтаксис сохраняя подгрузку слов в форт и ответные функции

тоесть база Forth <-> даёт С и добавляем слова в форт, добавляем функцию в С, получается следующий язык С как выходец из Форта, но возможно так нельзя сделать )

Автор спасибо, вы сделали правильно, что поняли, что шишки приходят через собственное включение в ситуацию, сразу определили, что вам интересно и по цепочке появляющихся вопросов как я понял вы сразу смотрите фундаментальные пробелы(то что вы это поняли это условно мотивация для получения знаний). то, что сейчас так у вас на локальном компе нормальная ситуация, при определенном подходе, и желании освоитесь и перепишете потом, городите ошибки, за вас никто их не сделает, главное потом откалиброваться и устаканиться на правильных практиках после заполнения пробелов. можете так же начать игры делать, сначала 2д(локально), потом 3д(локально). там будет(локально) вот прям вообще наглядно. не забывайте про флаги сборки и санитайзерах, инструментарий - валгринд, дебагер, иногда годболт удобно с включенным PVS, иногда яву можно подключать для прототипа, потом и на С++ можно перейти или Раст, если вам действительно интересен С, потом вы столкнотёсь с некоторыми особенностями просто.

отдельно можно добавить, надо где-то на старте помимо желаний, делать практику, надо где-то отыскать тонны задач(задачи на последовательности, на хитрый счет какой-нибудь, на контейнеры(это отдельный челенж например делаем задачи(100 задач на каждом контейнере) и всё на ифах как пример, фиксируем ошибки логику, упор на привыкание к контейнерам), отдельно на деревья и так далее ), и в расслабленном состоянии там решать их так как вам хочется(чисто логически не подглядывая), потом нормально(типо попытаться понять), ну и так далее.

путь долгий, желаю вам успехов.

Скрытый текст

исходя из вашей глубины обзоров обсуждать вертикальную V без горизонтальной V не имеет смысла, да и плюс надо видеть структуру минимального запускаемого примера! поэтому получается, мы можем трактовать, как уб словесное обсуждение (просто словами), то что упрощенно можно показать, в подверждении того что вы хотели сказать прикрепляя свои примеры - свой взгляд, чтобы за вашими тезисами были не как говорят слухи про "вот говорят, что у майнкрафта был плохой код в 2010 году", ну говорят и? ну и пусть говорят, сдесь и сейчас в статье вы перечисляете движки или игры, но своего примера - своего взгляда не показали!

нету вашей линии, вашего ответа на всё это, лично вашего взгляда, потомучто мы не на экзамене, где повторить сарафанку это самоцель, нет это не цель, должны быть критерии какие-то, что конкретно в тех движках, что конкретно в коде майнкрафта не так, и я думаю вы не расскажете об этом, вы среди прочего прилинковали ссылки на конференции, но те конференции придерживаются правила чистоты своих рассуждений, по крайней мере тех, что я смотрел, там нет воды, нет мне показалось, там есть какая-то конструктивщина. А в примере как создать обьект какая конструктивщина, если условных нюансов дофига! А вы показываете на голубом глазу какой-то там из наивных. Попробуй догодайся, что вы имели ввиду.

Студия, которая десять лет прожила на г...коде это Mojang и оригинальная Java-кодовая база Minecraft, которую сообщество и сами разработчики в шутку называли "нельзя удалять строки", но это не помешало игре стать самой продаваемой в истории.

понял значит вы не осилили впринципе подход вокселей

в целом как я понял вы программист прикладного уровня, у вас страдает описание => всего, буквально вам всего не хватает в каждой статье, нет ни одного адекватного примера из раздела геймдев снизу вверх, вы наверху, как будто тот самоуверенный геймдизайнер где, чтобы он ввёл хотелку надо сделать много чего.

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

1
23 ...

Информация

В рейтинге
7 191-й
Зарегистрирован
Активность

Специализация

Специалист
C++
Разработка игр
Linux
C