[C ++中的3D游戏环境

问题描述 投票:3回答:3

我对C ++还是很陌生,我很难创建3D游戏板。 董事会的大小可以在整个游戏过程中增加

我的第一个想法是使用嵌套向量。vector<vector<vector<int>>> board

想法是,它很容易实现(board[z][y][x]),我不会在动态分配方面遇到问题。但是我听说嵌套向量不是一个好主意,因为它破坏了“缓存友好性”。相反,我应该使用1d向量和使用数学的“伪”维。

我认为这意味着创建大小为(x * y * z)的向量。在那种情况下,当我想“转到” nested_vector_board [0] [1] [0]时,我使用board [x]。如果我想转到nested_vector_board [1] [1] [0],请使用board [x * y + x]。

我的理解正确吗?调整董事会规模时该怎么办?例如,如果我想扩大板子的范围,似乎我需要手动移动所有数据。更重要的是,有没有更好,更简单的方法?

我将欢迎您提出任何建议,并非常感谢您!

c++ vector memory-management
3个回答
0
投票

如果您不知道您的访问模式将是什么,则无法选择最佳解决方案。另外,如果您没有可行的解决方案,则可以衡量性能,只能猜测什么是最佳解决方案,并且您可能会猜错。

我建议使用清晰的界面来标记自己的3D电路板类,并检查您的简单解决方案是否足够好。如果太慢,可以将实现换成更合适的实现。

这里是一个示例,说明如何实现您的电路板:

#include <iostream>
#include <unordered_map>
#include <map>

template <class ValueType>
class board_3d {
public:
    using key_t = std::tuple<size_t, size_t, size_t>;
    using value_t = ValueType;

    ValueType& operator[](key_t key) {
        return m_data[key];
    } 

    const ValueType& operator[](key_t key) const {
        return m_data[key];
    } 

private:
    std::map<key_t, ValueType> m_data;
};

int main()
{
    board_3d<int> my_board;
    my_board[{0,0,0}] = 5;
    return 0;
}

std::map可能最终不是您想要的。访问为O(log n)。要进行优化,您可以将std::unordered_map与O(1)访问结合使用,或者使用向量进行任何实现。您还可以添加一个调整大小功能,该功能负责将数据从旧存储复制到新存储。


0
投票

我认为您可以使用稀疏表示形式:

std::map<int, std::map<int, std::map<int, int> > > board;

您可以使用方括号引用此地图中的值:

board[x][y][z] = 13;

0
投票

为了避免嵌套向量,如何在堆栈上建立一个固定大小(设置为电路板大小上限)的二维指针网格,并用单个向量保存所有数据?像这样的东西(在这里用智能指针实现):

#include <iostream>
#include <vector>
#include <memory>

int main() {
    const int MAXSIZE = 512
    int width = 5;
    int height = 5;
    int depth = 5; 
    std::unique_ptr<std::vector<int>> grid[MAXSIZE][MAXSIZE];
    for (int i = 0; i < width; ++i) {
       for (int j = 0; j < height; ++j) {
          grid[i][j] = std::make_unique<std::vector<int>>();
          for (int k = 0; k < depth; ++k) {
              grid[i][j]->push_back(k);
          }
       }
    }
    //To iterate over all the contents:
    for (int i = 0; i < width; ++i) {
        for (int j = 0; j < height; ++j) {
            for (int k = 0; k < depth; ++k) {
                std::cout << grid[i][j]->at(k) << " ";
            }
            std::cout << " // ";
        }
        std::cout << std::endl;
    }
    return 0;
}

根据游戏的工作方式,您可能不得不使用std::shared_ptr。我的理解是,与嵌套矢量方法相比,这种结构可实现更有效的内存访问。不利的一面是必须一次分配更大的网格?

© www.soinside.com 2019 - 2024. All rights reserved.