C ++中的3D游戏环境

库萨沃斯

我对C ++非常陌生,我很难创建3D游戏板。在整个游戏过程中,棋盘的大小都会增加

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

想法是,它很容易访问(board[z][y][x]),而我不会在动态分配方面遇到问题。但是我听说嵌套向量不是一个好主意,因为它破坏了“缓存友好性”。取而代之的是,我应该使用1d向量和“ fake”维度来进行数学计算。

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

我的理解正确吗?调整板子尺寸时该怎么办?例如,如果我想使板子更宽,则似乎需要手动移动所有数据。更重要的是,有没有更好,更简单的方法呢?

我将欢迎任何建议,并在此先非常感谢您!

越界

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

我建议使用清晰的界面来标记自己的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_mapO(1)访问或使用向量的任何实现。您还可以添加一个调整大小功能,该功能负责将数据从旧存储复制到新存储。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章