Skip to content

Commit

Permalink
new blog
Browse files Browse the repository at this point in the history
  • Loading branch information
XieYHccc committed Apr 18, 2024
1 parent b34e9fd commit d3df07d
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ struct RenderObject {
游戏引擎还可以抽象一些渲染游戏场景的函数,比如把渲染几何,渲染GUI,渲染背景的逻辑给区分开:
```c++
void DrawGeometry(VkImageView targetView, const DrawContext& context);
void DrawImgui(VkImageView targetView, VkExtent2D extent);
void DrawBackGround(VkImageView targetView, VkExtent2D extent);
void DrawGeometry(VkImageView targetView, const DrawContext& context);
void DrawImgui(VkImageView targetView, VkExtent2D extent);
void DrawBackGround(VkImageView targetView, VkExtent2D extent);
```

开发一个游戏引擎的渲染模块并不等同于重新开发一套渲染API用来渲染游戏画面(理论上也可以,但我真觉得没必要,工作量太大了,大公司可以这样做,比如Unity或者Unreal)。开发者依然需要了解Vulkan API才能进行游戏渲染的开发,但是相比于从零开始写vulkan,游戏引擎为我们提供了很大的便利。
32 changes: 32 additions & 0 deletions _posts/2024-4-18-Stack-Vs-Heap.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
## 为什么要使用指针?

指针可以避免资源被重复创建,提高效率并且节约内存。有些类实例在逻辑上只需要存在一份即可,这种时候就可以只创建一次,然后别的对象通过指针来引用这个实例。

指针可以解耦两个物体的关系。如果类A是类B的成员变量,这往往在逻辑上等价于类B拥有类A(符合人类直觉)。如果类B在逻辑上并不拥有类A,但是确实需要知道一个类A来达成某种逻辑,这种时候就可以使用指针来解耦两者的关系。指针在逻辑上更像是一个连接两个物体的桥梁。比如:

```c++
struct Edge{
node* desNode;
node* SrcNode;
};
```

Edge是一条有向边,从srcNode指向desNode,但是逻辑上Edge并不拥有这两个节点。



## 指向栈资源的指针 Vs 指向堆资源的指针

指针不管是指向栈中的资源还是指向堆中的资源,都可以起到上述提到的作用,但是有一个很大的区别是指向栈中的资源必须被hard coded。因为栈的工作原理是不停地压栈和出栈,先进后出,栈中的资源如果不被hard coded到某个类成员将很快被释放掉,所以指向栈资源的指针作用很受限,无法实现运行时动态创建。

注意,如果通过把运行时动态创建的资源放到std::vector里,std::vector每次扩容都会重新分配内存并进行拷贝,因此资源还是会被反复创建,并且扩容前指向其中资源的指针也全部失效了,容易造成Bug。



## Tips

是否需要使用指针以及该设计其指向栈还是堆可以通过一下两个逻辑判断

* 某个资源是否只需要被创建一次。如果只需要被创建一次,则使用指针无疑了。
* 如果该资源需要运行时被动态创建,则在堆上创建该资源无疑了。

0 comments on commit d3df07d

Please sign in to comment.