在学习游戏的3D图形编程时,我决定通过使用Scene Kit 3D API开始简单.我的第一个游戏目标是构建一个非常简化的模拟MineCraft.只是立方体的游戏 - 它有多难.
下面是我写的一个循环,用于放置100 x 100立方体(10,000)并且FPS性能非常差(~20 FPS).对于Scene Kit,我的初始游戏目标是否过多,或者有更好的方法来解决这个问题吗?
我已经阅读了StackExchange上的其他主题,但感觉不到他们回答我的问题.将暴露的表面块转换为单个网格将不起作用,因为SCNGeometry是不可变的.
func createBoxArray(scene : SCNScene, lengthCount: Int, depthCount: Int) {
let startX : CGFloat = -(CGFloat(lengthCount) * CUBE_SIZE) + (CGFloat(lengthCount) * CUBE_MARGIN) / 2.0
let startY : CGFloat = 0.0
let startZ : CGFloat = -(CGFloat(lengthCount) * CUBE_SIZE) + (CGFloat(lengthCount) * CUBE_MARGIN) / 2.0
var currentZ : CGFloat = startZ
for z in 0 ..< depthCount {
currentZ += CUBE_SIZE + CUBE_MARGIN
var currentX = startX
for x in …
Run Code Online (Sandbox Code Playgroud) 我正在使用Apple的新Metal框架编写iOS应用程序.我有一个Matrix4对象数组(参见Ray Wenderlich的教程),我需要通过MTLDevice.newBufferWithLength()方法传入着色器.Matrix4对象正在利用Apple的GLKit(它包含一个GLKMatrix4对象).
我正在利用GPU调用实例化.
我稍后会将其更改为一个结构,其中包含每个实例的更多数据(不仅仅是Matrix4对象).
如何有效地将[Matrix4]对象数组复制到此缓冲区中?
有一个更好的方法吗?再次,我将扩展它以使用未来更多数据的结构.
以下是我的代码的子集:
let sizeofMatrix4 = sizeof(Float) * Matrix4.numberofElements()
// This returns an array of [Matrix4] objects.
let boxArray = createBoxArray(parentModelViewMatrix)
let sizeOfUniformBuffer = boxArray.count * sizeOfMatrix4
var uniformBuffer = device.newBufferWithLength(sizeofUniformBuffer, options: .CPUCacheModeDefaultCache)
let bufferPointer = uniformBuffer?.contents()
// Ouch - way too slow. How can I optimize?
for i in 0..<boxArray.count
{
memcpy(bufferPointer! + (i * sizeOfMatrix4), boxArray[i].raw(), sizeOfMatrix4)
}
renderEncoder.setVertexBuffer(uniformBuffer, offset: 0, atIndex: 2)
Run Code Online (Sandbox Code Playgroud)
注意:boxArray [i] .raw()方法在Objective-C代码中定义如下:
- (void *)raw {
return glkMatrix.m; …
Run Code Online (Sandbox Code Playgroud)