小编Qua*_*leA的帖子

为什么不在C++游戏中经常分配和释放内存?

我最近转换为C++用于游戏编程 - 我在处理C#中的内存管理和垃圾收集问题方面有很多经验,但对C++没有那么多.

我过去听过一些模糊的建议,以避免游戏过程中的分配和解除分配(即newdelete),并预先分配你可能需要的所有东西.但是,这比在游戏运行时(敌人,粒子等)根据需要分配和释放游戏对象要繁琐且在架构上更复杂.

我认为我读到的建议是指资源受限的平台 - 我的目标是主要针对PC开发,我认为经常变化的游戏状态数据最多只能达到几兆字节.其余的是我要预加载的纹理,声音资产等.

所以我的问题是:在与GB的内存电脑的世界,它是值得的头痛建立缜密的内存池,预分配,等我的比赛状态数据?或者这只是一些无可争议的"最佳实践"传统,在最大化有限平台时发展,现在又作为福音重复了?

如果我的2 MB游戏数据变得支离破碎并且现在已经超过4MB,我无法想象在1990年之后在PC上做出的任何事情 - 但我很想知道我是否遗漏了一些东西:).

c++ memory-management game-engine

14
推荐指数
1
解决办法
4028
查看次数

更改.cpp文件导致Visual Studio 2012重新编译不相关的文件

好奇,如果有人知道如何解决这个问题; 我有一个特定的.cpp文件,由于某种原因,每当我修改它(甚至只是添加一个空白字符)并构建项目时,都会导致重新编译其他无关的.cpp文件(其中10-20个).

该文件在任何其他文件中都不是#include(我从不直接#include .cpp文件,只有.h)并且没有其他我能想到的依赖项 - 在我看来,像Visual Studio一样误解了依赖树,或者有一些与其构建过程相关的腐败内部状态.我已经尝试删除.sdf,.suo,ipch /,.user和目标文件目录,但问题会在短时间后再次出现.

修改任何其他.cpp文件会导致仅按预期重新编译该文件.

我对MSBuild有点了解,但在.vxproj文件中没有看到任何明显的错误 - 有问题的.cpp文件只在ClCompile项目组中出现一次,其标题只在ClInclude组中出现一次.

如果这有任何响铃,或者如果有人有任何关于如何跟踪它并对其进行故障排除的提示,我们将不胜感激!

更新:

我跑了msbuild /verbosity:Detailed但不幸的是,为什么不相关的文件被编译的解释是不透明的:

Using "CL" task from assembly "Microsoft.Build.CppTasks.Common.v110, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "CL"
Read Tracking Logs:
    Debug\cl.read.1.tlog
Output details (109 of them) were not logged for performance reasons.
{UnrelatedFile1.cpp} will be compiled as {PROBLEM_FILE.CPP} was modified at 4/30/2013 3:28:02 PM.
{UnrelatedFile2.cpp} will be compiled as {PROBLEM_FILE.CPP} was modified at 4/30/2013 3:28:02 PM.
(etc...)
Run Code Online (Sandbox Code Playgroud)

如果这对任何人都有意义让我知道 - 似乎无法找到关于CL任务的内部工作的大量信息,或者为什么它会看到这些不相关的CPP文件之间的依赖关系.

c++ msbuild visual-studio visual-studio-2012

5
推荐指数
1
解决办法
1505
查看次数

C++字符串/容器分配

对于C++非菜鸟来说这可能是显而易见的,但它让我感到有些不满 - 一个类的字符串成员是否在该类中分配了可变数量的空间?或者只是在内部为内存中的其他空间分配一个指针?例如,在这个例子中:

class Parent {
    public:
    vector<Child> Children;
}

class Child {
    public:
    string Name;
}
Run Code Online (Sandbox Code Playgroud)

如果我创建一个"new Parent()"并添加一些具有不同长度字符串的子节点,那么如何在堆上分配?父4字节,子4字节(或指针大小,加上固定大小的内部数据),然后在堆上的其他地方随机堆一串字符串?或者它是否都在内存中捆绑在一起?

我猜一般来说,容器类型本身总是固定大小,只包含指向其可变大小数据的指针,并且这些数据总是在堆上吗?

c++ string stl

4
推荐指数
1
解决办法
360
查看次数

将 boost::regex_search() 与字符串迭代器一起使用

我试图让 boost::regex 为我提供搜索字符串中出现的所有模式。认为这样的事情会很简单,但是让 boost 和 STL 在所有内容之上添加 10 个元层模板混淆:)。

我最近的尝试是使用 regex_search(),但不幸的是我的调用似乎与任何重载都不匹配。这是一个超级蒸馏的例子:

std::string test = "1234567890";
boost::regex testPattern( "\\d" );
boost::match_results<std::string::const_iterator> testMatches;
std::string::const_iterator startPos = test.begin();
while( regex_search( startPos, test.end(), testMatches, testPattern ) ) {
    // Do stuff: record match value, increment start position
}
Run Code Online (Sandbox Code Playgroud)

我对 regex_search() 的调用会触发智能感知,并且无法编译(“没有'regex_search'实例与参数列表匹配”)。

我试图调用的重载是:

template <class BidirectionalIterator,
    class Allocator, class charT, class traits>
bool regex_search(BidirectionalIterator first, BidirectionalIterator last,
    match_results<BidirectionalIterator, Allocator>& m,
    const basic_regex<charT, traits>& e,
    match_flag_type flags = match_default );
Run Code Online (Sandbox Code Playgroud)

这似乎与我的调用相匹配。

任何想法表示赞赏!以及做此类事情的替代方法。我最终想要做的是将字符串拆分为:

"0.11,0.22;0.33,0.444;0.555,0.666"
Run Code Online (Sandbox Code Playgroud)

进入浮点字符串的组成列表,然后我可以解析它。

在任何其他正则表达式包中,这都很简单 - …

c++ regex boost-regex

3
推荐指数
1
解决办法
5995
查看次数

哪些版本的Windows不支持unicode API调用?

基于C的Win32 API具有许多函数的双重版本,以支持unicode(UTF-16)字符串和较旧的8位代码页字符串.API还定义了泛型函数和类型,以便稍微抽象出来并允许从同一代码库中编译这两个版本.

Microsoft建议始终使用泛型(请参阅函数原型的约定),以便您可以编译这两个版本.但我的问题是 - 通过8位字符串API,我们在这里讨论支持哪些版本的Windows?如果它是Windows 95,那么我的优先级就不再高了:).如果泛型仅用于支持极端遗留情况,那么直接使用UTF-16调用似乎更容易和更清晰.

c windows unicode

3
推荐指数
1
解决办法
735
查看次数

带有可变参数(...)的C++方法报告错误的arg值

我无法将变量参数正确传递给方法 - 该方法旨在选择加权分布中的随机值并返回所选结果的索引.

一个示例用法是:

int pickupType = randomManager->ByWeights( 3, 0.60f, 0.20f, 0.20f );
switch( pickupType ) {
    // ... pickupType should be 0 to 2, which we can then branch on
}
Run Code Online (Sandbox Code Playgroud)

该功能定义如下:

#include <cstdarg>

int RandomManager::ByWeights( int weightCount, ... ) {

    va_list argList;

    // Get the total of all weights
    va_start( argList, weightCount );
    float weightTotal = 0;
    for ( int i = 0; i < weightCount; i++ ) {
        weightTotal += va_arg( argList, float );
    }
    va_end( argList …
Run Code Online (Sandbox Code Playgroud)

c++ variadic-functions

1
推荐指数
1
解决办法
146
查看次数