Як отримати блоки, які бачить гравець?


15

Я пишу гру, подібну Minecraft, за допомогою двигуна Ogre, і у мене є проблеми. Я повинен оптимізувати свою гру, бо коли я намагаюся намалювати 10000 блоків, у мене є 2 FPS ... Отже, у мене з'явилася ідея блокувати показ площини і приховати невидимі блоки. Але у мене є проблема - як я можу знати, які блоки одночасно видно гравцеві?

І - якщо ви знаєте інші методи оптимізації для такої гри, напишіть, що і як ними користуватися в Ogre.

Відповіді:


16

Ну, Ogre вже реалізує знищення фрустуму (що в основному не малює нічого, що не можна було б побачити з камери), але я думаю, що ваша проблема інша.

Ви не повинні відображати 10000 блоків, що зазвичай робиться (або, принаймні, в кількох майкрафтах на базі Ogre3d, таких як клони, які я бачив (з яких я теж роблю), і в оригіналі) створює сітку ( деяких ділянок шматочків NxNxN), на яких зображені зовнішні грані кубів. Тобто, коли ви покладете 2 кубики поруч, 2 торкання обличчя не видно, і тому їх не потрібно малювати.

Ці обличчя також повинні бути намальовані приблизно так: http://www.ogre3d.org/tikiwiki/tiki-index.php?page=DynamicGrowingBuffers, оскільки сучасні відеокарти віддають перевагу одній сітці з 100000 полігонів проти 1000 сіт 100 полігонів.


10

У цій проблемі є кілька аспектів. По-перше, як ви малюєте свої 10000 блоків? Ви насправді малюєте їх як 10000 окремого об’єкта? Якщо так, це майже напевно горловина вашої пляшки, а не відсутність відключення оклюзії. Ви повинні згрупувати ці блоки в меншу кількість сіток (можливо, кілька тисяч на сітку), щоб зменшити дзвінки дзвінка.

Що стосується Вашого актуального питання, то існує три типи відключення оклюзії, які спадають на думку.

1) Блоки поза фруктовим видом. Це означає блоки, які знаходяться позаду вас або дві сторони. Огре вже видаляє їх через вигляд фрустуму.

2) Блоки, які є "під землею" або повністю оточені іншими блоками, тому їх ніколи не можна побачити з будь-якого кута. Ви можете визначити їх, переглянувши сусідні блоки siz. Якщо вони всі тверді, ваш блок прихований. Графічний процесор ніколи не повинен чути про ці блоки - їх слід пропускати, коли ви будуєте сітку, яка представляє вашу поверхню.

3) Блоки, які знаходяться на поверхні і видно з деяких позицій на рівні, але в даний час приховані пагорбом (або чимось). Це найскладніший випадок, про який я не звертався, але є хороший шанс, що для цього випадку можуть бути використані запити апаратної оклюзії.

Це безсоромний штекер, але у мене є досить зріла бібліотека, яку кілька людей використовують для розробки клонів Minecraft, в тому числі деякі використовують Ogre. Ви визначаєте вміст об'єму, і він генерує поверхневу сітку, яку ви зможете потім надати. Ось домашня сторінка:

http://www.thermite3d.org/

А ось відео чужого проекту, який його використовує:

http://www.youtube.com/watch?v=Jju6WRPEK7o


4

Ви можете використовувати відсікання задніх поверхонь, щоб зменшити вершини та пов'язані з ними пікселі, які не стикаються з програвачем. Глибинна буферизація повинна подбати про відпочинок. 10k блоків насправді не багато, мої 5770 можуть складати 100k вертів зі швидкістю 1500 кадрів в секунду. Я думаю, що ти робиш щось ще досить сильно неправильно.


Я згоден. Це, мабуть, проблема з чим-небудь іншим.
Нотабене

1

Якщо у вас є 10000 окремих об'єктів, вузьке місце, ймовірно, є примітивним підрахунком, а не вершиною, багатокутником або заповненням. Спікайте свої об'єкти на меншій кількості об'єктів з більшим полігоном для швидкості.

У Minecraft є концепція блоків кубів, але я не можу знайти посилання на даний момент.

Ось також мої експерименти з малювання тонн кубів різними техніками. Не включає випічку (поки що).


0

Що я роблю, це після створення мого масиву блоків, але перед створенням вершин я запускаю підрозділ під назвою UpdateBlockVisiblility.

Підрозділ просто перевіряє сусідів до блоку та відповідно оновлює Blocks без видимого булевого типу.

#define BLOCKFACE_NORTH 0

#define BLOCKFACE_SOUTH 1 

etc etc etc

if(IsBlockAt(NorthOfBlock))
  Blocks[Whatever].facevisible[BLOCKFACE_NORTH] = false;

Тоді я створюю лише вершини для обличчя, якщо воно видно! Просто :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.